68 void finalize(
const bool )
override;
72 void init_mpi(
int* argc,
char** argv[] );
74 void set_communicator( MPI_Comm );
123 void communicate( std::vector< size_t >& send_buffer, std::vector< size_t >& recv_buffer );
128 void communicate( std::vector< unsigned int >& send_buffer,
129 std::vector< unsigned int >& recv_buffer,
130 std::vector< int >& displacements );
135 void communicate( std::vector< OffGridSpike >& send_buffer,
136 std::vector< OffGridSpike >& recv_buffer,
137 std::vector< int >& displacements );
139 void communicate( std::vector< double >& send_buffer,
140 std::vector< double >& recv_buffer,
141 std::vector< int >& displacements );
143 void communicate( std::vector< unsigned long >& send_buffer,
144 std::vector< unsigned long >& recv_buffer,
145 std::vector< int >& displacements );
148 communicate( std::vector< int >& send_buffer, std::vector< int >& recv_buffer, std::vector< int >& displacements );
150 void communicate(
double, std::vector< double >& );
205 void communicate_Alltoall_(
void* send_buffer,
void* recv_buffer,
const unsigned int send_recv_count );
207 void communicate_Alltoallv_(
void* send_buffer,
208 const int* send_counts,
209 const int* send_displacements,
211 const int* recv_counts,
212 const int* recv_displacements );
218 std::vector< D >& recv_buffer,
219 const unsigned int send_recv_count );
346 std::vector< int > comm_step_;
348 unsigned int COMM_OVERFLOW_ERROR;
353 MPI_Datatype MPI_OFFGRID_SPIKE;
355 void communicate_Allgather( std::vector< unsigned int >& send_buffer,
356 std::vector< unsigned int >& recv_buffer,
357 std::vector< int >& displacements );
359 void communicate_Allgather( std::vector< OffGridSpike >& send_buffer,
360 std::vector< OffGridSpike >& recv_buffer,
361 std::vector< int >& displacements );
363 void communicate_Allgather( std::vector< int >& );
364 void communicate_Allgather( std::vector< long >& );
366 template <
typename T >
367 void communicate_Allgatherv( std::vector< T >& send_buffer,
368 std::vector< T >& recv_buffer,
369 std::vector< int >& displacements,
370 std::vector< int >& recv_counts );
372 template <
typename T >
373 void communicate_Allgather( std::vector< T >& send_buffer,
374 std::vector< T >& recv_buffer,
375 std::vector< int >& displacements );
417 node_id_ =
static_cast< double >( node_id );
433 assert( std::numeric_limits< double >::digits > std::numeric_limits< node_id_external_type >::digits );
615 gethostname( name, 1023 );
691 std::vector< D >& recv_buffer,
692 const unsigned int send_recv_count )
694 void* send_buffer_int =
static_cast< void*
>( &send_buffer[ 0 ] );
695 void* recv_buffer_int =
static_cast< void*
>( &recv_buffer[ 0 ] );
697 communicate_Alltoall_( send_buffer_int, recv_buffer_int, send_recv_count );
704 void* send_buffer_int =
static_cast< void*
>( &send_buffer[ 0 ] );
705 void* recv_buffer_int =
static_cast< void*
>( &recv_buffer[ 0 ] );
707 communicate_Alltoallv_( send_buffer_int,
718MPIManager::MPIManager::communicate_Alltoall( std::vector< D >& send_buffer,
719 std::vector< D >& recv_buffer,
722 recv_buffer.swap( send_buffer );
729 recv_buffer.swap( send_buffer );
738 const size_t send_recv_count_target_data_in_int_per_rank =
748 const size_t send_recv_count_spike_data_in_int_per_rank =
758 const size_t send_recv_count_off_grid_spike_data_in_int_per_rank =
761 communicate_Alltoall( send_buffer, recv_buffer, send_recv_count_off_grid_spike_data_in_int_per_rank );
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
Combined storage of node ID and offset information for off-grid spikes.
Definition mpi_manager.h:390
double offset_
offset of spike from grid
Definition mpi_manager.h:427
double node_id_
node ID of neuron that spiked
Definition mpi_manager.h:426
double get_offset() const
Definition mpi_manager.h:420
static void assert_datatype_compatibility_()
This function asserts that doubles can hold node IDs without loss.
Definition mpi_manager.h:431
OffGridSpike()
Definition mpi_manager.h:398
void set_node_id(node_id_external_type node_id)
Definition mpi_manager.h:415
unsigned int node_id_external_type
We defined this type explicitly, so that the assert function below always tests the correct type.
Definition mpi_manager.h:396
unsigned int get_node_id() const
Definition mpi_manager.h:410
OffGridSpike(node_id_external_type node_idv, double offsetv)
Definition mpi_manager.h:403
Definition mpi_manager.h:57
std::vector< int > send_counts_secondary_events_in_int_per_rank_
how many secondary elements (in ints) will be sent to each rank
Definition mpi_manager.h:336
double time_communicate_offgrid(int num_bytes, int samples=1000)
Definition mpi_manager.h:668
size_t get_recv_displacement_secondary_events_in_int(const size_t source_rank) const
Returns the rdispls parameter of Alltoallv for communication of secondary events, i....
Definition mpi_manager.h:460
size_t max_buffer_size_target_data_
maximal size of MPI buffer for
Definition mpi_manager.h:318
void communicate_Allreduce_sum_in_place(double buffer)
Sum across all ranks.
Definition mpi_manager.cpp:1090
void communicate_secondary_events_Alltoallv(std::vector< D > &send_buffer, std::vector< D > &recv_buffer)
Definition mpi_manager.h:727
std::string get_processor_name()
Definition mpi_manager.h:611
size_t get_recv_buffer_size_secondary_events_in_int() const
Returns total size of MPI recv buffer for communication of secondary events.
Definition mpi_manager.h:542
bool is_mpi_used()
Definition mpi_manager.h:504
std::vector< int > recv_counts_secondary_events_in_int_per_rank_
How many secondary elements (in ints) will be received from each rank.
Definition mpi_manager.h:333
size_t get_process_id_of_node_id(const size_t node_id) const
Definition mpi_manager_impl.h:86
size_t buffer_size_target_data_
total size of MPI buffer for
Definition mpi_manager.h:312
size_t get_process_id_of_vp(const size_t vp) const
Return the process id for a given virtual process.
Definition mpi_manager_impl.h:42
void init_mpi(int *argc, char **argv[])
Definition mpi_manager.cpp:81
double time_communicatev(int num_bytes, int samples=1000)
Definition mpi_manager.h:662
bool use_mpi_
whether MPI is used
Definition mpi_manager.h:311
bool any_true(const bool)
Definition mpi_manager.h:650
std::vector< int > send_displacements_secondary_events_in_int_per_rank_
Offset in the MPI send buffer (in ints) from which elements send to each rank will be read.
Definition mpi_manager.h:342
bool adaptive_target_buffers() const
Returns whether MPI buffers for communication of connections are adaptive.
Definition mpi_manager.h:604
int num_processes_
number of MPI processes
Definition mpi_manager.h:307
void set_status(const Dictionary &) override
Set the status of the manager.
Definition mpi_manager.cpp:224
size_t get_num_processes() const
Return the number of processes used during simulation.
Definition mpi_manager.h:492
void communicate_off_grid_spike_data_Alltoall(std::vector< D > &send_buffer, std::vector< D > &recv_buffer)
Definition mpi_manager.h:756
~MPIManager() override
Definition mpi_manager.h:63
void mpi_finalize(int exitcode)
Finalize MPI communication (needs to be separate from MPIManager::finalize when compiled with MUSIC s...
Definition mpi_manager.cpp:306
unsigned int send_recv_count_spike_data_per_rank_
Definition mpi_manager.h:329
void mpi_abort(int exitcode)
If MPI is available, this method calls MPI_Abort with the exitcode.
Definition mpi_manager.h:620
double shrink_factor_buffer_spike_data_
Definition mpi_manager.h:327
size_t get_recv_count_secondary_events_in_int(const size_t source_rank) const
Returns the recvcounts parameter of Alltoallv for communication of secondary events,...
Definition mpi_manager.h:454
void communicate_recv_counts_secondary_events()
Definition mpi_manager.cpp:1117
double growth_factor_buffer_spike_data_
Definition mpi_manager.h:324
int send_buffer_size_
expected size of send buffer
Definition mpi_manager.h:309
MPIManager()
Definition mpi_manager.cpp:54
void communicate_Allreduce_sum(std::vector< double > &send_buffer, std::vector< double > &recv_buffer)
Definition mpi_manager.cpp:1105
void communicate_Alltoall(std::vector< D > &send_buffer, std::vector< D > &recv_buffer, const unsigned int send_recv_count)
void set_buffer_size_target_data(size_t buffer_size)
Definition mpi_manager.h:550
void communicate_spike_data_Alltoall(std::vector< D > &send_buffer, std::vector< D > &recv_buffer)
Definition mpi_manager.h:746
int recv_buffer_size_
size of receive buffer
Definition mpi_manager.h:310
void synchronize()
Ensure all processes have reached the same stage by waiting until all processes have sent a dummy mes...
Definition mpi_manager.h:635
void set_buffer_size_spike_data(size_t buffer_size)
Definition mpi_manager.h:568
size_t get_buffer_size_spike_data() const
Returns total size of MPI buffer for communication of spikes.
Definition mpi_manager.h:522
void communicate_target_data_Alltoall(std::vector< D > &send_buffer, std::vector< D > &recv_buffer)
Definition mpi_manager.h:736
unsigned int get_send_recv_count_spike_data_per_rank() const
Returns size of MPI buffer for spikes divided by number of processes.
Definition mpi_manager.h:528
size_t get_send_displacement_secondary_events_in_int(const size_t target_rank) const
Returns the send displacement of elements (in ints) to be sent to rank target_rank.
Definition mpi_manager.h:472
double growth_factor_buffer_target_data_
Definition mpi_manager.h:325
unsigned int send_recv_count_target_data_per_rank_
Definition mpi_manager.h:330
size_t get_send_count_secondary_events_in_int(const size_t target_rank) const
Returns the number of elements (in ints) to be sent to target_rank.
Definition mpi_manager.h:466
int rank_
rank of the MPI process
Definition mpi_manager.h:308
void finalize(const bool) override
Take down manager after operation.
Definition mpi_manager.cpp:219
double time_communicate_alltoallv(int num_bytes, int samples=1000)
Definition mpi_manager.h:680
void get_status(Dictionary &) override
Retrieve the status of the manager.
Definition mpi_manager.cpp:260
void set_recv_counts_secondary_events_in_int_per_rank(const std::vector< int > &recv_counts_in_int_per_rank)
Sets the recvcounts parameter of Alltoallv for communication of secondary events, i....
Definition mpi_manager.h:444
double time_communicate_alltoall(int num_bytes, int samples=1000)
Definition mpi_manager.h:674
size_t get_rank() const
Get rank of MPI process.
Definition mpi_manager.h:498
void communicate(std::vector< size_t > &send_buffer, std::vector< size_t > &recv_buffer)
Definition mpi_manager.cpp:1085
double time_communicate(int num_bytes, int samples=1000)
Benchmark communication time of different MPI methods.
Definition mpi_manager.h:656
size_t get_send_buffer_size_secondary_events_in_int() const
Returns total size of MPI send buffer for communication of secondary events.
Definition mpi_manager.h:534
size_t get_done_marker_position_in_secondary_events_send_buffer(const size_t target_rank) const
Returns where the done marker is located in the MPI send buffer for target_rank.
Definition mpi_manager.h:478
void initialize(const bool) override
Prepare manager for operation.
Definition mpi_manager.cpp:181
bool equal_cross_ranks(const double value)
Equal across all ranks.
Definition mpi_manager.cpp:1111
bool increase_buffer_size_target_data()
Increases the size of the MPI buffer for communication of connections if it needs to be increased.
Definition mpi_manager.h:579
unsigned int get_send_recv_count_target_data_per_rank() const
Returns size of MPI buffer for connections divided by number of processes.
Definition mpi_manager.h:516
bool adaptive_target_buffers_
whether MPI buffers for communication of
Definition mpi_manager.h:321
size_t buffer_size_spike_data_
total size of MPI buffer for
Definition mpi_manager.h:315
size_t get_buffer_size_target_data() const
Returns total size of MPI buffer for communication of connections.
Definition mpi_manager.h:510
std::vector< int > recv_displacements_secondary_events_in_int_per_rank_
Offset in the MPI receive buffer (in ints) at which elements received from each rank will be written.
Definition mpi_manager.h:339
size_t get_done_marker_position_in_secondary_events_recv_buffer(const size_t source_rank) const
Returns where the done marker is located in the MPI recv buffer for source_rank.
Definition mpi_manager.h:485
Interface for kernel manager classes.
Definition manager_interface.h:46
Definition spike_data.h:395
Used to communicate spikes.
Definition spike_data.h:101
Used to communicate part of the connection infrastructure from post- to presynaptic side.
Definition target_data.h:175
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
void test_link(int, int)
Definition mpi_manager.h:640
void test_links()
Definition mpi_manager.h:645