From ea8ef81af47b28a8ab86be8dcd2be033175e7801 Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 12 Mar 2024 15:27:15 +0100 Subject: [PATCH 1/7] IOManager now unloads backends on ResetKernel() to allow reloading backends form external modules. --- nestkernel/io_manager.cpp | 123 +++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 56 deletions(-) diff --git a/nestkernel/io_manager.cpp b/nestkernel/io_manager.cpp index c8491a336f..e60c95aed3 100644 --- a/nestkernel/io_manager.cpp +++ b/nestkernel/io_manager.cpp @@ -61,16 +61,6 @@ namespace nest IOManager::IOManager() : overwrite_files_( false ) { - register_recording_backend< RecordingBackendASCII >( "ascii" ); - register_recording_backend< RecordingBackendMemory >( "memory" ); - register_recording_backend< RecordingBackendScreen >( "screen" ); -#ifdef HAVE_MPI - register_recording_backend< RecordingBackendMPI >( "mpi" ); - register_stimulation_backend< StimulationBackendMPI >( "mpi" ); -#endif -#ifdef HAVE_SIONLIB - register_recording_backend< RecordingBackendSIONlib >( "sionlib" ); -#endif } IOManager::~IOManager() @@ -85,6 +75,73 @@ IOManager::~IOManager() } } +void +IOManager::initialize( const bool adjust_number_of_threads_or_rng_seed_only ) +{ + if ( not adjust_number_of_threads_or_rng_seed_only ) + { + // Register backends again, since finalize cleans up + // so backends from external modules are unloaded + register_recording_backend< RecordingBackendASCII >( "ascii" ); + register_recording_backend< RecordingBackendMemory >( "memory" ); + register_recording_backend< RecordingBackendScreen >( "screen" ); +#ifdef HAVE_MPI + register_recording_backend< RecordingBackendMPI >( "mpi" ); + register_stimulation_backend< StimulationBackendMPI >( "mpi" ); +#endif +#ifdef HAVE_SIONLIB + register_recording_backend< RecordingBackendSIONlib >( "sionlib" ); +#endif + + DictionaryDatum dict( new Dictionary ); + // The properties data_path and data_prefix can be set via environment variables + char* data_path = std::getenv( "NEST_DATA_PATH" ); + if ( data_path ) + { + ( *dict )[ names::data_path ] = std::string( data_path ); + } + char* data_prefix = std::getenv( "NEST_DATA_PREFIX" ); + if ( data_prefix ) + { + ( *dict )[ names::data_prefix ] = std::string( data_prefix ); + } + + set_data_path_prefix_( dict ); + + overwrite_files_ = false; + } + + for ( const auto& it : recording_backends_ ) + { + it.second->initialize(); + } + for ( const auto& it : stimulation_backends_ ) + { + it.second->initialize(); + } +} + +void +IOManager::finalize( const bool adjust_number_of_threads_or_rng_seed_only ) +{ + for ( const auto& it : recording_backends_ ) + { + it.second->finalize(); + if ( not adjust_number_of_threads_or_rng_seed_only ) + { + delete it.second; + } + } + for ( const auto& it : stimulation_backends_ ) + { + it.second->finalize(); + if ( not adjust_number_of_threads_or_rng_seed_only ) + { + delete it.second; + } + } +} + void IOManager::set_data_path_prefix_( const DictionaryDatum& dict ) { @@ -131,52 +188,6 @@ IOManager::set_data_path_prefix_( const DictionaryDatum& dict ) } } -void -IOManager::initialize( const bool adjust_number_of_threads_or_rng_seed_only ) -{ - if ( not adjust_number_of_threads_or_rng_seed_only ) - { - DictionaryDatum dict( new Dictionary ); - // The properties data_path and data_prefix can be set via environment variables - char* data_path = std::getenv( "NEST_DATA_PATH" ); - if ( data_path ) - { - ( *dict )[ names::data_path ] = std::string( data_path ); - } - char* data_prefix = std::getenv( "NEST_DATA_PREFIX" ); - if ( data_prefix ) - { - ( *dict )[ names::data_prefix ] = std::string( data_prefix ); - } - - set_data_path_prefix_( dict ); - - overwrite_files_ = false; - } - - for ( const auto& it : recording_backends_ ) - { - it.second->initialize(); - } - for ( const auto& it : stimulation_backends_ ) - { - it.second->initialize(); - } -} - -void -IOManager::finalize( const bool ) -{ - for ( const auto& it : recording_backends_ ) - { - it.second->finalize(); - } - for ( const auto& it : stimulation_backends_ ) - { - it.second->finalize(); - } -} - void IOManager::set_recording_backend_status( std::string recording_backend, const DictionaryDatum& d ) { From 6c12f3ae1a362b835c3ecc94f6c388a6d578f21a Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 12 Mar 2024 15:38:40 +0100 Subject: [PATCH 2/7] ConnectionManager now unloads ConnBuilders on ResetKernel() to allow reloading ConnBuilders form external modules. --- nestkernel/connection_manager.cpp | 26 +++++++++++++++++++++++++- nestkernel/nestmodule.cpp | 17 ----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/nestkernel/connection_manager.cpp b/nestkernel/connection_manager.cpp index 71a81504c6..58d513686f 100644 --- a/nestkernel/connection_manager.cpp +++ b/nestkernel/connection_manager.cpp @@ -43,6 +43,7 @@ #include "conn_builder.h" #include "conn_builder_factory.h" #include "connection_label.h" +#include "connection_manager_impl.h" #include "connector_base.h" #include "connector_model.h" #include "delay_checker.h" @@ -95,6 +96,20 @@ nest::ConnectionManager::initialize( const bool adjust_number_of_threads_or_rng_ { if ( not adjust_number_of_threads_or_rng_seed_only ) { + // Add connection rules + register_conn_builder< OneToOneBuilder >( "one_to_one" ); + register_conn_builder< AllToAllBuilder >( "all_to_all" ); + register_conn_builder< FixedInDegreeBuilder >( "fixed_indegree" ); + register_conn_builder< FixedOutDegreeBuilder >( "fixed_outdegree" ); + register_conn_builder< BernoulliBuilder >( "pairwise_bernoulli" ); + register_conn_builder< PoissonBuilder >( "pairwise_poisson" ); + register_conn_builder< TripartiteBernoulliWithPoolBuilder >( "tripartite_bernoulli_with_pool" ); + register_conn_builder< SymmetricBernoulliBuilder >( "symmetric_pairwise_bernoulli" ); + register_conn_builder< FixedTotalNumberBuilder >( "fixed_total_number" ); +#ifdef HAVE_LIBNEUROSIM + register_conn_builder< ConnectionGeneratorBuilder >( "conngen" ); +#endif + keep_source_table_ = true; connections_have_changed_ = false; get_connections_has_been_called_ = false; @@ -137,7 +152,7 @@ nest::ConnectionManager::initialize( const bool adjust_number_of_threads_or_rng_ } void -nest::ConnectionManager::finalize( const bool ) +nest::ConnectionManager::finalize( const bool adjust_number_of_threads_or_rng_seed_only ) { source_table_.finalize(); target_table_.finalize(); @@ -146,6 +161,15 @@ nest::ConnectionManager::finalize( const bool ) std::vector< std::vector< ConnectorBase* > >().swap( connections_ ); std::vector< std::vector< std::vector< size_t > > >().swap( secondary_recv_buffer_pos_ ); compressed_spike_data_.clear(); + + if ( not adjust_number_of_threads_or_rng_seed_only ) + { + for ( auto cbf : connbuilder_factories_ ) + { + delete cbf; + } + connruledict_->clear(); + } } void diff --git a/nestkernel/nestmodule.cpp b/nestkernel/nestmodule.cpp index bf0675f3d2..32738c28ce 100644 --- a/nestkernel/nestmodule.cpp +++ b/nestkernel/nestmodule.cpp @@ -32,7 +32,6 @@ #include "conn_builder.h" #include "conn_builder_conngen.h" #include "connection_creator_impl.h" -#include "connection_manager_impl.h" #include "free_layer.h" #include "genericmodel.h" #include "grid_layer.h" @@ -2211,22 +2210,6 @@ NestModule::init( SLIInterpreter* i ) i->createcommand( "cvdict_M", &cvdict_Mfunction ); i->createcommand( "SelectNodesByMask_g_a_M", &selectnodesbymask_g_a_Mfunction ); - - // Add connection rules - kernel().connection_manager.register_conn_builder< OneToOneBuilder >( "one_to_one" ); - kernel().connection_manager.register_conn_builder< AllToAllBuilder >( "all_to_all" ); - kernel().connection_manager.register_conn_builder< FixedInDegreeBuilder >( "fixed_indegree" ); - kernel().connection_manager.register_conn_builder< FixedOutDegreeBuilder >( "fixed_outdegree" ); - kernel().connection_manager.register_conn_builder< BernoulliBuilder >( "pairwise_bernoulli" ); - kernel().connection_manager.register_conn_builder< PoissonBuilder >( "pairwise_poisson" ); - kernel().connection_manager.register_conn_builder< TripartiteBernoulliWithPoolBuilder >( - "tripartite_bernoulli_with_pool" ); - kernel().connection_manager.register_conn_builder< SymmetricBernoulliBuilder >( "symmetric_pairwise_bernoulli" ); - kernel().connection_manager.register_conn_builder< FixedTotalNumberBuilder >( "fixed_total_number" ); -#ifdef HAVE_LIBNEUROSIM - kernel().connection_manager.register_conn_builder< ConnectionGeneratorBuilder >( "conngen" ); -#endif - // Add MSP growth curves kernel().sp_manager.register_growth_curve< GrowthCurveSigmoid >( "sigmoid" ); kernel().sp_manager.register_growth_curve< GrowthCurveGaussian >( "gaussian" ); From 4d6990a104853b3a81976ac073e9d7ee9d85c475 Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 12 Mar 2024 16:01:36 +0100 Subject: [PATCH 3/7] Initialize IOManager before ModelManager so *Backend infrastructure is up before device models are registered --- nestkernel/kernel_manager.cpp | 4 ++-- nestkernel/kernel_manager.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nestkernel/kernel_manager.cpp b/nestkernel/kernel_manager.cpp index 2ca78ddba4..da9aa888cd 100644 --- a/nestkernel/kernel_manager.cpp +++ b/nestkernel/kernel_manager.cpp @@ -57,9 +57,9 @@ nest::KernelManager::KernelManager() , connection_manager() , sp_manager() , event_delivery_manager() + , io_manager() , model_manager() , music_manager() - , io_manager() , node_manager() , managers( { &logging_manager, &mpi_manager, @@ -71,9 +71,9 @@ nest::KernelManager::KernelManager() &connection_manager, &sp_manager, &event_delivery_manager, + &io_manager, &model_manager, &music_manager, - &io_manager, &node_manager } ) , initialized_( false ) { diff --git a/nestkernel/kernel_manager.h b/nestkernel/kernel_manager.h index 78a31c52f3..216981b2b7 100644 --- a/nestkernel/kernel_manager.h +++ b/nestkernel/kernel_manager.h @@ -282,9 +282,9 @@ class KernelManager ConnectionManager connection_manager; SPManager sp_manager; EventDeliveryManager event_delivery_manager; + IOManager io_manager; ModelManager model_manager; MUSICManager music_manager; - IOManager io_manager; NodeManager node_manager; /**@}*/ private: From f827c6209d0fb1e5ab8ddcf0998bec0ce5d7ad40 Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 12 Mar 2024 16:50:11 +0100 Subject: [PATCH 4/7] Clear all relevant data structures in conn/io_mgr on finalize --- nestkernel/connection_manager.cpp | 1 + nestkernel/io_manager.cpp | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/nestkernel/connection_manager.cpp b/nestkernel/connection_manager.cpp index 58d513686f..28d89b7185 100644 --- a/nestkernel/connection_manager.cpp +++ b/nestkernel/connection_manager.cpp @@ -168,6 +168,7 @@ nest::ConnectionManager::finalize( const bool adjust_number_of_threads_or_rng_se { delete cbf; } + connbuilder_factories_.clear(); connruledict_->clear(); } } diff --git a/nestkernel/io_manager.cpp b/nestkernel/io_manager.cpp index e60c95aed3..784adae278 100644 --- a/nestkernel/io_manager.cpp +++ b/nestkernel/io_manager.cpp @@ -65,14 +65,6 @@ IOManager::IOManager() IOManager::~IOManager() { - for ( auto& it : recording_backends_ ) - { - delete it.second; - } - for ( auto& it : stimulation_backends_ ) - { - delete it.second; - } } void @@ -127,18 +119,25 @@ IOManager::finalize( const bool adjust_number_of_threads_or_rng_seed_only ) for ( const auto& it : recording_backends_ ) { it.second->finalize(); - if ( not adjust_number_of_threads_or_rng_seed_only ) - { - delete it.second; - } } for ( const auto& it : stimulation_backends_ ) { it.second->finalize(); - if ( not adjust_number_of_threads_or_rng_seed_only ) + } + + if ( not adjust_number_of_threads_or_rng_seed_only ) + { + for ( const auto& it : recording_backends_ ) + { + delete it.second; + } + recording_backends_.clear(); + + for ( const auto& it : stimulation_backends_ ) { delete it.second; } + stimulation_backends_.clear(); } } From d80d4103725e6e5f1aa16f2fbcb043d07c817a7e Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 12 Mar 2024 16:50:32 +0100 Subject: [PATCH 5/7] Move growth_curve registration into SPManager --- nestkernel/nest_extension_interface.h | 1 + nestkernel/nestmodule.cpp | 6 ------ nestkernel/sp_manager.cpp | 26 ++++++++++++++++++++------ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/nestkernel/nest_extension_interface.h b/nestkernel/nest_extension_interface.h index e185504bc8..ff4d519a21 100644 --- a/nestkernel/nest_extension_interface.h +++ b/nestkernel/nest_extension_interface.h @@ -38,6 +38,7 @@ #include "nest.h" #include "nest_impl.h" #include "nestmodule.h" +#include "sp_manager_impl.h" #include "target_identifier.h" // C++ includes diff --git a/nestkernel/nestmodule.cpp b/nestkernel/nestmodule.cpp index 32738c28ce..4db53deef0 100644 --- a/nestkernel/nestmodule.cpp +++ b/nestkernel/nestmodule.cpp @@ -47,7 +47,6 @@ #include "nest_types.h" #include "node.h" #include "parameter.h" -#include "sp_manager_impl.h" #include "spatial.h" // Includes from sli: @@ -2210,11 +2209,6 @@ NestModule::init( SLIInterpreter* i ) i->createcommand( "cvdict_M", &cvdict_Mfunction ); i->createcommand( "SelectNodesByMask_g_a_M", &selectnodesbymask_g_a_Mfunction ); - // Add MSP growth curves - kernel().sp_manager.register_growth_curve< GrowthCurveSigmoid >( "sigmoid" ); - kernel().sp_manager.register_growth_curve< GrowthCurveGaussian >( "gaussian" ); - kernel().sp_manager.register_growth_curve< GrowthCurveLinear >( "linear" ); - Token statusd = i->baselookup( Name( "statusdict" ) ); DictionaryDatum dd = getValue< DictionaryDatum >( statusd ); dd->insert( Name( "kernelname" ), new StringDatum( "NEST" ) ); diff --git a/nestkernel/sp_manager.cpp b/nestkernel/sp_manager.cpp index c7c3955ccc..be3e782a4b 100644 --- a/nestkernel/sp_manager.cpp +++ b/nestkernel/sp_manager.cpp @@ -32,6 +32,7 @@ #include "connector_model.h" #include "kernel_manager.h" #include "nest_names.h" +#include "sp_manager_impl.h" namespace nest { @@ -53,9 +54,12 @@ SPManager::~SPManager() void SPManager::initialize( const bool adjust_number_of_threads_or_rng_seed_only ) { - if ( adjust_number_of_threads_or_rng_seed_only ) + if ( not adjust_number_of_threads_or_rng_seed_only ) { - return; + // Add MSP growth curves + register_growth_curve< GrowthCurveSigmoid >( "sigmoid" ); + register_growth_curve< GrowthCurveGaussian >( "gaussian" ); + register_growth_curve< GrowthCurveLinear >( "linear" ); } structural_plasticity_update_interval_ = 10000.; @@ -63,13 +67,23 @@ SPManager::initialize( const bool adjust_number_of_threads_or_rng_seed_only ) } void -SPManager::finalize( const bool ) +SPManager::finalize( const bool adjust_number_of_threads_or_rng_seed_only ) { - for ( std::vector< SPBuilder* >::const_iterator i = sp_conn_builders_.begin(); i != sp_conn_builders_.end(); i++ ) + if ( not adjust_number_of_threads_or_rng_seed_only ) { - delete *i; + for ( auto spcb : sp_conn_builders_ ) + { + delete spcb; + } + sp_conn_builders_.clear(); + + for ( auto gcf : growthcurve_factories_ ) + { + delete gcf; + } + growthcurve_factories_.clear(); + growthcurvedict_->clear(); } - sp_conn_builders_.clear(); } void From 3f086cd9f9663afda7723d4fc0f34e21c61b06f6 Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 12 Mar 2024 21:29:18 +0100 Subject: [PATCH 6/7] Fix includes for conngen builder --- nestkernel/connection_manager.cpp | 1 + nestkernel/nestmodule.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/nestkernel/connection_manager.cpp b/nestkernel/connection_manager.cpp index 28d89b7185..da49362509 100644 --- a/nestkernel/connection_manager.cpp +++ b/nestkernel/connection_manager.cpp @@ -41,6 +41,7 @@ // Includes from nestkernel: #include "clopath_archiving_node.h" #include "conn_builder.h" +#include "conn_builder_conngen.h" #include "conn_builder_factory.h" #include "connection_label.h" #include "connection_manager_impl.h" diff --git a/nestkernel/nestmodule.cpp b/nestkernel/nestmodule.cpp index 4db53deef0..639f886077 100644 --- a/nestkernel/nestmodule.cpp +++ b/nestkernel/nestmodule.cpp @@ -30,7 +30,6 @@ // Includes from nestkernel: #include "conn_builder.h" -#include "conn_builder_conngen.h" #include "connection_creator_impl.h" #include "free_layer.h" #include "genericmodel.h" From aee10b1b7d2c46b7cea2d737625fe8eef28c9ac8 Mon Sep 17 00:00:00 2001 From: Hans Ekkehard Plesser Date: Tue, 19 Mar 2024 16:41:32 +0100 Subject: [PATCH 7/7] Fix typo in comment --- nestkernel/event_delivery_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nestkernel/event_delivery_manager.cpp b/nestkernel/event_delivery_manager.cpp index fdbf6c3687..2173f18db9 100644 --- a/nestkernel/event_delivery_manager.cpp +++ b/nestkernel/event_delivery_manager.cpp @@ -497,7 +497,7 @@ EventDeliveryManager::collocate_spike_data_buffers_( SendBufferPosition& send_bu ++num_spikes_per_rank[ rank ]; // We do not break if condition is false, because there may be spikes that - // can be send to other ranks than the one that is full. + // can be sent to other ranks than the one that is full. if ( not send_buffer_position.is_chunk_filled( rank ) ) { send_buffer[ send_buffer_position.idx( rank ) ] = emitted_spike.spike_data;