NEST main@caf0ae8
 
Loading...
Searching...
No Matches
event_delivery_manager.h
Go to the documentation of this file.
1/*
2 * event_delivery_manager.h
3 *
4 * This file is part of NEST.
5 *
6 * Copyright (C) 2004 The NEST Initiative
7 *
8 * NEST is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * NEST is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with NEST. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#ifndef EVENT_DELIVERY_MANAGER_H
24#define EVENT_DELIVERY_MANAGER_H
25
26// C++ includes:
27#include <cassert>
28#include <limits>
29#include <vector>
30
31// Includes from libnestutil:
32#include "manager_interface.h"
33#include "stopwatch.h"
34
35// Includes from nestkernel:
36#include "buffer_resize_log.h"
37#include "event.h"
38#include "mpi_manager.h" // OffGridSpike
39#include "nest_time.h"
40#include "nest_types.h"
41#include "node.h"
43#include "secondary_event.h"
44#include "spike_data.h"
45#include "target_table.h"
46#include "vp_manager.h"
47
48
49namespace nest
50{
52
53class TargetData;
56
57
59{
60public:
62 ~EventDeliveryManager() override;
63
64 void initialize( const bool ) override;
65 void finalize( const bool ) override;
66 void set_status( const Dictionary& ) override;
67 void get_status( Dictionary& ) override;
68
78 template < class EventT >
79 void send( Node& source, EventT& e, const long lag = 0 );
80
84 void send_secondary( Node& source, SecondaryEvent& e );
85
89 void send_local( size_t t, Node& source, Event& e );
90
109 void send_remote( size_t tid, SpikeEvent&, const long lag = 0 );
110
130 void send_off_grid_remote( size_t tid, SpikeEvent& e, const long lag = 0 );
131
139 void send_to_node( Event& e );
140
145 bool get_off_grid_communication() const;
146
150 void set_off_grid_communication( bool off_grid_spiking );
151
159 size_t write_toggle() const;
160
168 size_t read_toggle() const;
169
173 long get_modulo( long d );
174
175
180 long get_slice_modulo( long d );
181
193
195
197
199
204 void gather_spike_data();
205
210 void gather_target_data( const size_t tid );
211
212 void gather_target_data_compressed( const size_t tid );
213
214
218 void deliver_events( const size_t tid );
219
226
227 void write_done_marker_secondary_events_( const bool done );
228
229 void gather_secondary_events( const bool done );
230
231 bool deliver_secondary_events( const size_t tid, const bool called_from_wfr_update );
232
245 void update_moduli();
246
252 void init_moduli();
253
257 virtual void reset_counters();
258
262 virtual void reset_timers_for_preparation();
263
267 virtual void reset_timers_for_dynamics();
268
269#ifdef CYCLE_TIMERS
275
280 size_t get_local_spike_counter() const;
281#endif
282
283private:
284 template < typename SpikeDataT >
285 void gather_spike_data_( std::vector< SpikeDataT >& send_buffer, std::vector< SpikeDataT >& recv_buffer );
286
288
296 template < typename SpikeDataWithRankT, typename SpikeDataT >
297 void collocate_spike_data_buffers_( SendBufferPosition& send_buffer_position,
298 std::vector< std::vector< SpikeDataWithRankT >* >& spike_register,
299 std::vector< SpikeDataT >& send_buffer,
300 std::vector< size_t >& num_spikes_per_rank );
301
305 template < typename SpikeDataT >
306 void set_end_marker_( const SendBufferPosition& send_buffer_position,
307 std::vector< SpikeDataT >& send_buffer,
308 size_t local_max_spikes_per_rank );
309
314 template < typename SpikeDataT >
315 void reset_complete_marker_spike_data_( const SendBufferPosition& send_buffer_position,
316 std::vector< SpikeDataT >& send_buffer ) const;
317
323 template < typename SpikeDataT >
324 size_t get_global_max_spikes_per_rank_( const SendBufferPosition& send_buffer_position,
325 std::vector< SpikeDataT >& recv_buffer ) const;
326
327
332 template < typename SpikeDataT >
333 void deliver_events_( const size_t tid, const std::vector< SpikeDataT >& recv_buffer );
334
339 void reset_spike_register_( const size_t tid );
340
346 static bool is_marked_for_removal_( const Target& target );
347
353 bool collocate_target_data_buffers_( const size_t tid,
354 const AssignedRanks& assigned_ranks,
355 TargetSendBufferPosition& send_buffer_position );
356
357 bool collocate_target_data_buffers_compressed_( const size_t tid,
358 const AssignedRanks& assigned_ranks,
359 TargetSendBufferPosition& send_buffer_position );
360
365 void set_complete_marker_target_data_( const AssignedRanks& assigned_ranks,
366 const TargetSendBufferPosition& send_buffer_position );
367
373 bool distribute_target_data_buffers_( const size_t tid );
374
379 template < class EventT >
380 void send_local_( Node& source, EventT& e, const long lag );
381 void send_local_( Node& source, SecondaryEvent& e, const long lag );
382
383 //--------------------------------------------------//
384
387
397 std::vector< long > moduli_;
398
410 std::vector< long > slice_moduli_;
411
423 std::vector< std::vector< SpikeDataWithRank >* > emitted_spikes_register_;
424
436 std::vector< std::vector< OffGridSpikeDataWithRank >* > off_grid_emitted_spikes_register_;
437
441 std::vector< unsigned int > send_buffer_secondary_events_;
442 std::vector< unsigned int > recv_buffer_secondary_events_;
443
447 std::vector< unsigned long > local_spike_counter_;
448
449 std::vector< SpikeData > send_buffer_spike_data_;
450 std::vector< SpikeData > recv_buffer_spike_data_;
451 std::vector< OffGridSpikeData > send_buffer_off_grid_spike_data_;
452 std::vector< OffGridSpikeData > recv_buffer_off_grid_spike_data_;
453
454 std::vector< TargetData > send_buffer_target_data_;
455 std::vector< TargetData > recv_buffer_target_data_;
456
459
467
471
478
480
481 // private stop watches for benchmarking purposes
482 // (intended for internal core developers, not for use in the public API)
486};
487
488inline void
490{
491 emitted_spikes_register_[ tid ]->clear();
492 off_grid_emitted_spikes_register_[ tid ]->clear();
493}
494
495inline bool
497{
498 return target.is_processed();
499}
500
501inline void
506
507inline bool
512
513inline void
515{
516 off_grid_spiking_ = off_grid_spiking;
517}
518
519inline size_t
521{
522 // define in terms of write_toggle() to ensure consistency
523 return 1 - write_toggle();
524}
525
526inline long
528{
529 // Note, here d may be 0, since bin 0 represents the "current" time
530 // when all events due are read out.
531 assert( static_cast< std::vector< long >::size_type >( d ) < moduli_.size() );
532
533 return moduli_[ d ];
534}
535
536inline long
538{
539 // Note, here d may be 0, since bin 0 represents the "current" time
540 // when all events due are read out.
541 assert( static_cast< std::vector< long >::size_type >( d ) < slice_moduli_.size() );
542
543 return slice_moduli_[ d ];
544}
545
546} // namespace nest
547
548#endif /* EVENT_DELIVERY_MANAGER_H */
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
Collect information on spike transmission buffer resizing.
Definition buffer_resize_log.h:39
Definition event_delivery_manager.h:59
void get_status(Dictionary &) override
Retrieve the status of the manager.
Definition event_delivery_manager.cpp:179
void gather_target_data_compressed(const size_t tid)
Definition event_delivery_manager.cpp:854
void init_moduli()
Initialize modulo table.
Definition event_delivery_manager.cpp:251
std::vector< TargetData > send_buffer_target_data_
Definition event_delivery_manager.h:454
Stopwatch< StopwatchGranularity::Detailed, StopwatchParallelism::MasterOnly > sw_communicate_spike_data_
Definition event_delivery_manager.h:484
std::vector< SpikeData > recv_buffer_spike_data_
Definition event_delivery_manager.h:450
bool off_grid_spiking_
indicates whether spikes are not constrained to the grid
Definition event_delivery_manager.h:385
bool collocate_target_data_buffers_(const size_t tid, const AssignedRanks &assigned_ranks, TargetSendBufferPosition &send_buffer_position)
Fills MPI buffer for communication of connection information from presynaptic to postsynaptic side.
Definition event_delivery_manager.cpp:931
void collocate_spike_data_buffers_(SendBufferPosition &send_buffer_position, std::vector< std::vector< SpikeDataWithRankT > * > &spike_register, std::vector< SpikeDataT > &send_buffer, std::vector< size_t > &num_spikes_per_rank)
Moves spikes from on grid and off grid spike registers to correct locations in MPI buffers.
Definition event_delivery_manager.cpp:470
void reset_complete_marker_spike_data_(const SendBufferPosition &send_buffer_position, std::vector< SpikeDataT > &send_buffer) const
Resets marker in MPI buffer that signals end of communication across MPI ranks.
Definition event_delivery_manager.cpp:547
bool buffer_size_target_data_has_changed_
whether size of MPI buffer for communication of connections was changed
Definition event_delivery_manager.h:458
void update_moduli()
Update modulo table based on current time settings.
Definition event_delivery_manager.cpp:281
~EventDeliveryManager() override
Definition event_delivery_manager.cpp:71
bool get_off_grid_communication() const
return current communication style.
Definition event_delivery_manager.h:508
void send_remote(size_t tid, SpikeEvent &, const long lag=0)
Add node ID of event sender to the spike_register.
Definition event_delivery_manager_impl.h:104
void set_complete_marker_target_data_(const AssignedRanks &assigned_ranks, const TargetSendBufferPosition &send_buffer_position)
Sets marker in MPI buffer that signals end of communication across MPI ranks.
Definition event_delivery_manager.cpp:1040
size_t global_max_spikes_per_rank_
Largest number of spikes sent from any rank to any other rank in last spike exchange round.
Definition event_delivery_manager.h:466
double send_recv_buffer_shrink_spare_
leave this fraction more space than minimally needed
Definition event_delivery_manager.h:469
size_t read_toggle() const
Return 1 - write_toggle().
Definition event_delivery_manager.h:520
void send_to_node(Event &e)
Send event e directly to its target node.
Definition event_delivery_manager.h:502
virtual void reset_timers_for_preparation()
Set time measurements for internal profiling to zero (reg.
Definition event_delivery_manager.cpp:315
void set_status(const Dictionary &) override
Set the status of the manager.
Definition event_delivery_manager.cpp:143
std::vector< std::vector< SpikeDataWithRank > * > emitted_spikes_register_
Register of emitted spikes.
Definition event_delivery_manager.h:423
void initialize(const bool) override
Prepare manager for operation.
Definition event_delivery_manager.cpp:76
std::vector< unsigned int > send_buffer_secondary_events_
Buffer to collect the secondary events after serialization.
Definition event_delivery_manager.h:441
long get_slice_modulo(long d)
Index to slice-based buffer.
Definition event_delivery_manager.h:537
std::vector< TargetData > recv_buffer_target_data_
Definition event_delivery_manager.h:455
std::vector< unsigned long > local_spike_counter_
Number of generated spike events (both off- and on-grid) during the last call to simulate.
Definition event_delivery_manager.h:447
static bool is_marked_for_removal_(const Target &target)
Returns true if spike has been moved to MPI buffer, such that it can be removed by clean_spike_regist...
Definition event_delivery_manager.h:496
void gather_target_data(const size_t tid)
Collocates presynaptic connection information, communicates via MPI and creates presynaptic connectio...
Definition event_delivery_manager.cpp:780
EventDeliveryManager()
Definition event_delivery_manager.cpp:46
void set_end_marker_(const SendBufferPosition &send_buffer_position, std::vector< SpikeDataT > &send_buffer, size_t local_max_spikes_per_rank)
Set end marker for per-rank-chunks signalling completion and providing shrink/grow information.
Definition event_delivery_manager.cpp:501
bool collocate_target_data_buffers_compressed_(const size_t tid, const AssignedRanks &assigned_ranks, TargetSendBufferPosition &send_buffer_position)
Definition event_delivery_manager.cpp:1011
std::vector< std::vector< OffGridSpikeDataWithRank > * > off_grid_emitted_spikes_register_
Register of emitted off-grid spikes.
Definition event_delivery_manager.h:436
std::vector< unsigned int > recv_buffer_secondary_events_
Definition event_delivery_manager.h:442
Stopwatch< StopwatchGranularity::Detailed, StopwatchParallelism::MasterOnly > sw_collocate_spike_data_
Definition event_delivery_manager.h:483
double send_recv_buffer_grow_extra_
when growing, add this fraction extra space
Definition event_delivery_manager.h:470
std::vector< long > moduli_
Table of pre-computed modulos.
Definition event_delivery_manager.h:397
void send_secondary(Node &source, SecondaryEvent &e)
Send a secondary event remote.
Definition event_delivery_manager_impl.h:138
BufferResizeLog send_recv_buffer_resize_log_
Log all resize events.
Definition event_delivery_manager.h:477
long get_modulo(long d)
Return (T+d) mod max_delay.
Definition event_delivery_manager.h:527
void gather_secondary_events(const bool done)
Definition event_delivery_manager.cpp:339
size_t write_toggle() const
Return 0 for even, 1 for odd time slices.
Definition event_delivery_manager_impl.h:173
void send(Node &source, EventT &e, const long lag=0)
Standard routine for sending events.
Definition event_delivery_manager_impl.h:60
void send_off_grid_remote(size_t tid, SpikeEvent &e, const long lag=0)
Add node ID of event sender to the spike_register.
Definition event_delivery_manager_impl.h:121
void configure_spike_data_buffers()
Resize spike_register and comm_buffer to correct dimensions.
Definition event_delivery_manager.cpp:219
void finalize(const bool) override
Take down manager after operation.
Definition event_delivery_manager.cpp:118
void send_local(size_t t, Node &source, Event &e)
Send event e to all targets of node source on thread t.
void configure_spike_register()
Definition event_delivery_manager.cpp:232
std::vector< OffGridSpikeData > recv_buffer_off_grid_spike_data_
Definition event_delivery_manager.h:452
std::vector< long > slice_moduli_
Table of pre-computed slice-based modulos.
Definition event_delivery_manager.h:410
bool distribute_target_data_buffers_(const size_t tid)
Reads TargetData objects from MPI buffers and creates Target objects on TargetTable (presynaptic part...
Definition event_delivery_manager.cpp:1051
void gather_secondary_target_data()
Collocates presynaptic connection information for secondary events (MPI buffer offsets),...
virtual void reset_counters()
Set local spike counter to zero.
Definition event_delivery_manager.cpp:306
void deliver_events(const size_t tid)
Delivers events to targets.
Definition event_delivery_manager.cpp:584
void set_off_grid_communication(bool off_grid_spiking)
set communication style to off_grid (true) or on_grid
Definition event_delivery_manager.h:514
void deliver_events_(const size_t tid, const std::vector< SpikeDataT > &recv_buffer)
Reads spikes from MPI buffers and delivers them to ringbuffer of nodes.
Definition event_delivery_manager.cpp:599
size_t get_global_max_spikes_per_rank_(const SendBufferPosition &send_buffer_position, std::vector< SpikeDataT > &recv_buffer) const
Get required buffer size.
Definition event_delivery_manager.cpp:559
bool deliver_secondary_events(const size_t tid, const bool called_from_wfr_update)
Definition event_delivery_manager.cpp:347
void configure_secondary_buffers()
Definition event_delivery_manager.cpp:242
double send_recv_buffer_shrink_limit_
shrink buffer only if below this limit
Definition event_delivery_manager.h:468
void send_local_(Node &source, EventT &e, const long lag)
Sends event e to all targets of node source.
Definition event_delivery_manager_impl.h:37
void resize_send_recv_buffers_target_data()
Definition event_delivery_manager.cpp:199
void reset_spike_register_(const size_t tid)
Deletes all spikes from spike registers and resets spike counters.
Definition event_delivery_manager.h:489
PerThreadBoolIndicator gather_completed_checker_
Definition event_delivery_manager.h:479
void resize_send_recv_buffers_spike_data_()
Definition event_delivery_manager.cpp:207
void gather_spike_data_(std::vector< SpikeDataT > &send_buffer, std::vector< SpikeDataT > &recv_buffer)
Definition event_delivery_manager.cpp:368
Stopwatch< StopwatchGranularity::Detailed, StopwatchParallelism::MasterOnly > sw_communicate_target_data_
Definition event_delivery_manager.h:485
virtual void reset_timers_for_dynamics()
Set time measurements for internal profiling to zero (reg.
Definition event_delivery_manager.cpp:321
void gather_spike_data()
Collocates spikes from register to MPI buffers, communicates via MPI and delivers events to targets.
Definition event_delivery_manager.cpp:354
void write_done_marker_secondary_events_(const bool done)
Definition event_delivery_manager.cpp:328
std::vector< OffGridSpikeData > send_buffer_off_grid_spike_data_
Definition event_delivery_manager.h:451
std::vector< SpikeData > send_buffer_spike_data_
Definition event_delivery_manager.h:449
Encapsulate information sent between nodes.
Definition event.h:103
Combined storage of node ID and offset information for off-grid spikes.
Definition mpi_manager.h:390
Interface for kernel manager classes.
Definition manager_interface.h:46
Base class for all NEST network objects.
Definition node.h:99
A thread-safe vector to keep track of the status across threads, for example during gather operations...
Definition per_thread_bool_indicator.h:104
Base class of secondary events.
Definition secondary_event.h:50
This class simplifies keeping track of write position in MPI buffer while collocating spikes.
Definition send_buffer_position.h:42
Event for spike information.
Definition event.h:418
Used to communicate part of the connection infrastructure from post- to presynaptic side.
Definition target_data.h:175
This class simplifies keeping track of write position in MPI buffer while collocating targets.
Definition send_buffer_position.h:112
check legal size
Definition target.h:78
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
MPIManager::OffGridSpike OffGridSpike
Definition event_delivery_manager.h:51
Declarations for base class Node.
Definition vp_manager.h:42