NEST main@caf0ae8
 
Loading...
Searching...
No Matches
send_buffer_position.h
Go to the documentation of this file.
1/*
2 * send_buffer_position.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 SEND_BUFFER_POSITION_H
24#define SEND_BUFFER_POSITION_H
25
26// C++ includes:
27#include <cassert>
28#include <limits>
29#include <vector>
30
31// Includes from nestkernel:
32#include "vp_manager.h"
33
34namespace nest
35{
36
42{
43private:
44 std::vector< size_t > begin_;
45 std::vector< size_t > end_;
46 std::vector< size_t > idx_;
47
48public:
50
54 size_t begin( const size_t rank ) const;
55
59 size_t end( const size_t rank ) const;
60
64 size_t idx( const size_t rank ) const;
65
71 bool is_chunk_filled( const size_t rank ) const;
72
73 void increase( const size_t rank );
74};
75
76inline size_t
77SendBufferPosition::idx( const size_t rank ) const
78{
79 return idx_[ rank ];
80}
81
82inline size_t
83SendBufferPosition::begin( const size_t rank ) const
84{
85 return begin_[ rank ];
86}
87
88inline size_t
89SendBufferPosition::end( const size_t rank ) const
90{
91 return end_[ rank ];
92}
93
94inline bool
95SendBufferPosition::is_chunk_filled( const size_t rank ) const
96{
97 return idx_[ rank ] == end_[ rank ];
98}
99
100inline void
102{
103 ++idx_[ rank ];
104}
105
106
112{
113private:
115 size_t end_rank_;
116 size_t max_size_;
119 std::vector< size_t > idx_;
120 std::vector< size_t > begin_;
121 std::vector< size_t > end_;
122
123 size_t rank_to_index_( const size_t rank ) const;
124
125public:
126 TargetSendBufferPosition( const AssignedRanks& assigned_ranks, const unsigned int send_recv_count_per_rank );
127
131 unsigned int idx( const size_t rank ) const;
132
136 unsigned int begin( const size_t rank ) const;
137
141 unsigned int end( const size_t rank ) const;
142
149 bool is_chunk_filled( const size_t rank ) const;
150
155 bool are_all_chunks_filled() const;
156
157 void increase( const size_t rank );
158};
159
161 const unsigned int send_recv_count_per_rank )
162 : begin_rank_( assigned_ranks.begin )
163 , end_rank_( assigned_ranks.end )
164 , max_size_( assigned_ranks.max_size )
165 , num_target_data_written_( 0 )
166 , send_recv_count_per_rank_( send_recv_count_per_rank )
167{
168 idx_.resize( assigned_ranks.size );
169 begin_.resize( assigned_ranks.size );
170 end_.resize( assigned_ranks.size );
171 for ( size_t rank = assigned_ranks.begin; rank < assigned_ranks.end; ++rank )
172 {
173 // thread-local index of (global) rank
174 const size_t lr_idx = rank % assigned_ranks.max_size;
175 assert( lr_idx < assigned_ranks.size );
176 idx_[ lr_idx ] = rank * send_recv_count_per_rank;
177 begin_[ lr_idx ] = rank * send_recv_count_per_rank;
178 end_[ lr_idx ] = ( rank + 1 ) * send_recv_count_per_rank;
179 }
180}
181
182inline size_t
184{
185 assert( begin_rank_ <= rank );
186 assert( rank < end_rank_ );
187 return rank % max_size_;
188}
189
190inline unsigned int
191TargetSendBufferPosition::idx( const size_t rank ) const
192{
193 return idx_[ rank_to_index_( rank ) ];
194}
195
196inline unsigned int
197TargetSendBufferPosition::begin( const size_t rank ) const
198{
199 return begin_[ rank_to_index_( rank ) ];
200}
201
202inline unsigned int
203TargetSendBufferPosition::end( const size_t rank ) const
204{
205 return end_[ rank_to_index_( rank ) ];
206}
207
208inline bool
210{
211 return idx( rank ) == end( rank );
212}
213
214inline bool
219
220inline void
222{
223 ++idx_[ rank_to_index_( rank ) ];
225}
226
227} // namespace nest
228
229#endif /* SEND_BUFFER_POSITION_H */
This class simplifies keeping track of write position in MPI buffer while collocating spikes.
Definition send_buffer_position.h:42
std::vector< size_t > begin_
first entry for rank
Definition send_buffer_position.h:44
size_t idx(const size_t rank) const
Returns current index of specified rank in MPI buffer.
Definition send_buffer_position.h:77
bool is_chunk_filled(const size_t rank) const
Returns whether the part of the buffer on the specified rank has been filled.
Definition send_buffer_position.h:95
size_t end(const size_t rank) const
Returns end index of specified rank in MPI buffer.
Definition send_buffer_position.h:89
SendBufferPosition()
Definition send_buffer_position.cpp:31
std::vector< size_t > end_
one beyond last entry for rank
Definition send_buffer_position.h:45
size_t begin(const size_t rank) const
Returns begin index of specified rank in MPI buffer.
Definition send_buffer_position.h:83
std::vector< size_t > idx_
next entry in rank to write to
Definition send_buffer_position.h:46
void increase(const size_t rank)
Definition send_buffer_position.h:101
This class simplifies keeping track of write position in MPI buffer while collocating targets.
Definition send_buffer_position.h:112
size_t end_rank_
Definition send_buffer_position.h:115
size_t max_size_
Definition send_buffer_position.h:116
TargetSendBufferPosition(const AssignedRanks &assigned_ranks, const unsigned int send_recv_count_per_rank)
Definition send_buffer_position.h:160
std::vector< size_t > idx_
Definition send_buffer_position.h:119
size_t send_recv_count_per_rank_
Definition send_buffer_position.h:118
std::vector< size_t > begin_
Definition send_buffer_position.h:120
unsigned int end(const size_t rank) const
Returns end index of specified rank in MPI buffer.
Definition send_buffer_position.h:203
bool is_chunk_filled(const size_t rank) const
Returns whether the part of the buffer on the specified rank has been filled.
Definition send_buffer_position.h:209
std::vector< size_t > end_
Definition send_buffer_position.h:121
size_t begin_rank_
Definition send_buffer_position.h:114
size_t rank_to_index_(const size_t rank) const
Definition send_buffer_position.h:183
size_t num_target_data_written_
Definition send_buffer_position.h:117
unsigned int begin(const size_t rank) const
Returns begin index of specified rank in MPI buffer.
Definition send_buffer_position.h:197
unsigned int idx(const size_t rank) const
Returns current index of specified rank in MPI buffer.
Definition send_buffer_position.h:191
void increase(const size_t rank)
Definition send_buffer_position.h:221
bool are_all_chunks_filled() const
Returns whether the parts of the MPI buffer assigned to this thread has been filled.
Definition send_buffer_position.h:215
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
Definition vp_manager.h:42
size_t end
Definition vp_manager.h:44
size_t size
Definition vp_manager.h:45
size_t max_size
Definition vp_manager.h:46
size_t begin
Definition vp_manager.h:43