Skip to content

Commit

Permalink
Merge pull request #1741 from H27CK/shrink-buffers
Browse files Browse the repository at this point in the history
Shrink MPI buffers for spike communication
  • Loading branch information
heplesser authored Mar 22, 2021
2 parents 6bc32fa + a1103d1 commit 0cbde21
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 4 deletions.
25 changes: 21 additions & 4 deletions nestkernel/event_delivery_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ EventDeliveryManager::EventDeliveryManager()
, recv_buffer_target_data_()
, buffer_size_target_data_has_changed_( false )
, buffer_size_spike_data_has_changed_( false )
, decrease_buffer_size_spike_data_( true )
, gather_completed_checker_()
{
}
Expand All @@ -88,6 +89,7 @@ EventDeliveryManager::initialize()
off_grid_spiking_ = false;
buffer_size_target_data_has_changed_ = false;
buffer_size_spike_data_has_changed_ = false;
decrease_buffer_size_spike_data_ = true;

#pragma omp parallel
{
Expand Down Expand Up @@ -143,10 +145,13 @@ EventDeliveryManager::resize_send_recv_buffers_target_data()
void
EventDeliveryManager::resize_send_recv_buffers_spike_data_()
{
send_buffer_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
recv_buffer_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
send_buffer_off_grid_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
recv_buffer_off_grid_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
if ( kernel().mpi_manager.get_buffer_size_spike_data() > send_buffer_spike_data_.size() )
{
send_buffer_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
recv_buffer_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
send_buffer_off_grid_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
recv_buffer_off_grid_spike_data_.resize( kernel().mpi_manager.get_buffer_size_spike_data() );
}
}

void
Expand Down Expand Up @@ -312,6 +317,9 @@ EventDeliveryManager::gather_spike_data_( const thread tid,

const AssignedRanks assigned_ranks = kernel().vp_manager.get_assigned_ranks( tid );

// Assume a single gather round
decrease_buffer_size_spike_data_ = true;

while ( gather_completed_checker_.any_false() )
{
// Assume this is the last gather round and change to false
Expand Down Expand Up @@ -384,12 +392,21 @@ EventDeliveryManager::gather_spike_data_( const thread tid,
#pragma omp single
{
buffer_size_spike_data_has_changed_ = kernel().mpi_manager.increase_buffer_size_spike_data();
decrease_buffer_size_spike_data_ = false;
}
}
#pragma omp barrier

} // of while

#pragma omp single
{
if ( decrease_buffer_size_spike_data_ and kernel().mpi_manager.adaptive_spike_buffers() )
{
kernel().mpi_manager.decrease_buffer_size_spike_data();
}
} // of omp single; implicit barrier

reset_spike_register_( tid );
}

Expand Down
2 changes: 2 additions & 0 deletions nestkernel/event_delivery_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,8 @@ class EventDeliveryManager : public ManagerInterface
bool buffer_size_target_data_has_changed_;
//!< whether size of MPI buffer for communication of spikes was changed
bool buffer_size_spike_data_has_changed_;
//!< whether size of MPI buffer for communication of spikes can be decreased
bool decrease_buffer_size_spike_data_;

PerThreadBoolIndicator gather_completed_checker_;
};
Expand Down
3 changes: 3 additions & 0 deletions nestkernel/mpi_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ nest::MPIManager::MPIManager()
, adaptive_spike_buffers_( true )
, growth_factor_buffer_spike_data_( 1.5 )
, growth_factor_buffer_target_data_( 1.5 )
, shrink_factor_buffer_spike_data_( 1.1 )
, send_recv_count_spike_data_per_rank_( 0 )
, send_recv_count_target_data_per_rank_( 0 )
#ifdef HAVE_MPI
Expand Down Expand Up @@ -218,6 +219,8 @@ nest::MPIManager::set_status( const DictionaryDatum& dict )

updateValue< long >( dict, names::max_buffer_size_target_data, max_buffer_size_target_data_ );
updateValue< long >( dict, names::max_buffer_size_spike_data, max_buffer_size_spike_data_ );

updateValue< double >( dict, names::shrink_factor_buffer_spike_data, shrink_factor_buffer_spike_data_ );
}

void
Expand Down
19 changes: 19 additions & 0 deletions nestkernel/mpi_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,12 @@ class MPIManager : public ManagerInterface
*/
bool increase_buffer_size_spike_data();

/**
* Decreases the size of the MPI buffer for communication of spikes if it
* can be decreased.
*/
void decrease_buffer_size_spike_data();

/**
* Returns whether MPI buffers for communication of connections are adaptive.
*/
Expand Down Expand Up @@ -338,6 +344,8 @@ class MPIManager : public ManagerInterface
double growth_factor_buffer_spike_data_;
double growth_factor_buffer_target_data_;

double shrink_factor_buffer_spike_data_;

unsigned int send_recv_count_spike_data_per_rank_;
unsigned int send_recv_count_target_data_per_rank_;

Expand Down Expand Up @@ -646,6 +654,17 @@ MPIManager::increase_buffer_size_spike_data()
}
}

inline void
MPIManager::decrease_buffer_size_spike_data()
{
assert( adaptive_spike_buffers_ );
// the minimum is set to 4.0 * get_num_processes() to differentiate the initial size
if ( buffer_size_spike_data_ / shrink_factor_buffer_spike_data_ > 4.0 * get_num_processes() )
{
set_buffer_size_spike_data( floor( buffer_size_spike_data_ / shrink_factor_buffer_spike_data_ ) );
}
}

inline bool
MPIManager::adaptive_target_buffers() const
{
Expand Down
1 change: 1 addition & 0 deletions nestkernel/nest_names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ const Name send_buffer_size_secondary_events( "send_buffer_size_secondary_events
const Name senders( "senders" );
const Name shape( "shape" );
const Name shift_now_spikes( "shift_now_spikes" );
const Name shrink_factor_buffer_spike_data( "shrink_factor_buffer_spike_data" );
const Name sigma( "sigma" );
const Name sigmoid( "sigmoid" );
const Name sion_chunksize( "sion_chunksize" );
Expand Down
1 change: 1 addition & 0 deletions nestkernel/nest_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@ extern const Name senders;
extern const Name send_buffer_size_secondary_events;
extern const Name shape;
extern const Name shift_now_spikes;
extern const Name shrink_factor_buffer_spike_data;
extern const Name sigma;
extern const Name sigmoid;
extern const Name sion_chunksize;
Expand Down

0 comments on commit 0cbde21

Please sign in to comment.