Bridge++  Version 1.5.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
communicator_single.cpp
Go to the documentation of this file.
1 
15 
16 #include <cstdarg>
17 #include <cstring>
18 #include <cassert>
19 
20 #include <sys/time.h>
21 #include <time.h>
22 
24 //#include "Field/field.h"
25 
26 //namespace Communicator {
27 //static int m_Ndim = CommonParameters::Ndim();
28 //}
29 
30 //====================================================================
31 int Communicator::init(int *pargc, char ***pargv)
32 {
33  return EXIT_SUCCESS;
34 }
35 
36 
37 //====================================================================
39 {
40  return EXIT_SUCCESS;
41 }
42 
43 
44 //====================================================================
46 {
47  ::abort(); // call system function.
48 }
49 
50 
51 //====================================================================
52 int Communicator::setup(int ninstance)
53 {
54  assert(ninstance == 1);
55 
56  // check consistency
57  if (!((CommonParameters::NPE() == 1) &&
58  (CommonParameters::NPEx() == 1) &&
59  (CommonParameters::NPEy() == 1) &&
60  (CommonParameters::NPEz() == 1) &&
61  (CommonParameters::NPEt() == 1)))
62  {
63  fprintf(stderr, "Communicator::setup(): inappropriate grid_size.\n");
64  exit(EXIT_FAILURE);
65  }
66 
67  // set parameter
68  // m_Ndim = CommonParameters::Ndim();
69 
70  return EXIT_SUCCESS;
71 }
72 
73 
74 //====================================================================
76  const std::vector<int>& lattice_size,
77  std::vector<int>& grid_size,
78  int ninstance)
79 {
80  // m_Ndim = CommonParameters::Ndim();
81  int ndim = lattice_size.size();
82 
83  if (grid_size.size() != ndim) {
84  grid_size.resize(ndim, 1);
85  }
86 
87  int err = 0;
88  for (int i = 0; i < ndim; ++i) {
89  if (grid_size[i] != 1) {
90  ++err;
91  }
92  }
93 
94  if (err > 0) {
95  printf("ERROR: %s: unexpected grid_size.\n", __func__);
96  exit(EXIT_FAILURE);
97  }
98 
99  return EXIT_SUCCESS;
100 }
101 
102 
103 //====================================================================
105 {
106  return true;
107 }
108 
109 
110 //====================================================================
112 {
113  return true;
114 }
115 
116 
117 //====================================================================
118 int Communicator::self()
119 {
120  return 0;
121 }
122 
123 
124 //====================================================================
125 int Communicator::size()
126 {
127  return 1;
128 }
129 
130 
131 //====================================================================
132 int Communicator::self_global()
133 {
134  return 0;
135 }
136 
137 
138 //====================================================================
139 int Communicator::ipe(const int dir)
140 {
141  return 0;
142 }
143 
144 
145 //====================================================================
146 int Communicator::npe(const int dir)
147 {
148  return 1;
149 }
150 
151 
152 //====================================================================
153 int Communicator::grid_rank(int *rank, const int *gcoord)
154 {
155  *rank = 0;
156  return EXIT_SUCCESS;
157 }
158 
159 
160 //====================================================================
161 int Communicator::grid_coord(int *gcoord, const int rank)
162 {
163  int Ndim = CommonParameters::Ndim();
164 
165  for (int i = 0; i < Ndim; ++i) {
166  gcoord[i] = 0;
167  }
168  return EXIT_SUCCESS;
169 }
170 
171 
172 //====================================================================
173 int Communicator::grid_dims(int *gdims)
174 {
175  int Ndim = CommonParameters::Ndim();
176 
177  for (int i = 0; i < Ndim; ++i) {
178  gdims[i] = 1;
179  }
180  return EXIT_SUCCESS;
181 }
182 
183 
184 //====================================================================
185 int Communicator::sync()
186 {
187  return EXIT_SUCCESS;
188 }
189 
190 //====================================================================
191 // sync w/o (possible) busy wait
193 {
194  return EXIT_SUCCESS;
195 }
196 
197 
198 //====================================================================
199 int Communicator::sync_global()
200 {
201  return EXIT_SUCCESS;
202 }
203 
204 
205 //====================================================================
206 int Communicator::Base::broadcast(size_t size, void *data, int sender)
207 {
208  // stay intact
209  return EXIT_SUCCESS;
210 }
211 
212 
213 int Communicator::broadcast(int count, double *data, int sender)
214 {
215  // stay intact
216  return EXIT_SUCCESS;
217 }
218 
219 
220 int Communicator::broadcast(int count, float *data, int sender)
221 {
222  // stay intact
223  return EXIT_SUCCESS;
224 }
225 
226 
227 int Communicator::broadcast(int count, int *data, int sender)
228 {
229  // stay intact
230  return EXIT_SUCCESS;
231 }
232 
233 
234 int Communicator::broadcast(int count, string& data, int sender)
235 {
236  // stay intact
237  return EXIT_SUCCESS;
238 }
239 
240 
241 //====================================================================
242 int Communicator::Base::exchange(size_t size, void *recv_buf, void *send_buf, int idir, int ipm, int tag)
243 {
244  memcpy(recv_buf, send_buf, size);
245  return EXIT_SUCCESS;
246 }
247 
248 
249 int Communicator::exchange(int count, double *recv_buf, double *send_buf, int idir, int ipm, int tag)
250 {
251  memcpy(recv_buf, send_buf, sizeof(double) * count);
252  return EXIT_SUCCESS;
253 }
254 
255 
256 int Communicator::exchange(int count, float *recv_buf, float *send_buf, int idir, int ipm, int tag)
257 {
258  memcpy(recv_buf, send_buf, sizeof(float) * count);
259  return EXIT_SUCCESS;
260 }
261 
262 
263 int Communicator::exchange(int count, int *recv_buf, int *send_buf, int idir, int ipm, int tag)
264 {
265  memcpy(recv_buf, send_buf, sizeof(int) * count);
266  return EXIT_SUCCESS;
267 }
268 
269 
270 //====================================================================
271 int Communicator::Base::send_1to1(size_t size, void *recv_buf, void *send_buf, int send_to, int recv_from, int tag)
272 {
273  memcpy(recv_buf, send_buf, size);
274  return EXIT_SUCCESS;
275 }
276 
277 
278 int Communicator::send_1to1(int count, double *recv_buf, double *send_buf, int send_to, int recv_from, int tag)
279 {
280  memcpy(recv_buf, send_buf, sizeof(double) * count);
281  return EXIT_SUCCESS;
282 }
283 
284 
285 int Communicator::send_1to1(int count, float *recv_buf, float *send_buf, int send_to, int recv_from, int tag)
286 {
287  memcpy(recv_buf, send_buf, sizeof(float) * count);
288  return EXIT_SUCCESS;
289 }
290 
291 
292 int Communicator::send_1to1(int count, int *recv_buf, int *send_buf, int send_to, int recv_from, int tag)
293 {
294  memcpy(recv_buf, send_buf, sizeof(int) * count);
295  return EXIT_SUCCESS;
296 }
297 
298 
299 //====================================================================
300 int Communicator::reduce_sum(int count, double *recv_buf, double *send_buf, int pattern)
301 {
302  memcpy(recv_buf, send_buf, sizeof(double) * count);
303  return EXIT_SUCCESS;
304 }
305 
306 
307 int Communicator::reduce_sum(int count, float *recv_buf, float *send_buf, int pattern)
308 {
309  memcpy(recv_buf, send_buf, sizeof(float) * count);
310  return EXIT_SUCCESS;
311 }
312 
313 
314 int Communicator::reduce_sum(int count, int *recv_buf, int *send_buf, int pattern)
315 {
316  memcpy(recv_buf, send_buf, sizeof(int) * count);
317  return EXIT_SUCCESS;
318 }
319 
320 
321 //====================================================================
322 double Communicator::reduce_sum(double v)
323 {
324  return v;
325 }
326 
327 
328 //====================================================================
329 double Communicator::reduce_max(double v)
330 {
331  return v;
332 }
333 
334 
335 //====================================================================
336 double Communicator::reduce_min(double v)
337 {
338  return v;
339 }
340 
341 
342 //====================================================================
343 float Communicator::reduce_sum(float v)
344 {
345  return v;
346 }
347 
348 
349 //====================================================================
350 float Communicator::reduce_max(float v)
351 {
352  return v;
353 }
354 
355 
356 //====================================================================
357 float Communicator::reduce_min(float v)
358 {
359  return v;
360 }
361 
362 
363 //====================================================================
365 {
366 #ifdef DEBUG
367  printf("Communicator Single\n");
368 #endif
369  return EXIT_SUCCESS;
370 }
371 
372 
373 //====================================================================
374 double Communicator::get_time()
375 {
376  struct timeval now;
377 
378  if (gettimeofday(&now, (struct timezone *)0) != 0) {
379  return double();
380  }
381 
382  double sec = (double)now.tv_sec + ((double)now.tv_usec) * 1.0e-6;
383 
384  return sec;
385 }
386 
387 
388 //====================================================================
389 //============================================================END=====
static int npe(const int dir)
logical grid extent
static int NPEy()
static int reduce_max(int count, double *recv_buf, double *send_buf, int pattern=0)
find a global maximum of an array of double over the communicator. pattern specifies the dimensions t...
static void abort()
terminate communicator
static int self()
rank within small world.
static bool is_primary_master()
check if the present node is primary in global communicator.
static int init(int *pargc, char ***pargv)
initialize communicator
static int grid_coord(int *grid_coord, const int rank)
find grid coordinate from rank number.
static int reduce_min(int count, double *recv_buf, double *send_buf, int pattern=0)
find a global minimum of an array of double over the communicator. pattern specifies the dimensions t...
static int broadcast(size_t size, void *data, int sender)
static int ipe(const int dir)
logical coordinate of current proc.
static int finalize()
finalize communicator
static int send_1to1(int count, double *recv_buf, double *send_buf, int p_to, int p_from, int tag)
send array of double from rank p_from to rank p_to. communication distinguished by tag...
static int exchange(size_t size, void *recv_buf, void *send_buf, int idir, int ipm, int tag)
static int grid_dims(int *grid_dims)
find grid dimensions.
static int exchange(int count, double *recv_buf, double *send_buf, int idir, int ipm, int tag)
receive array of double from upstream specified by idir and ipm, and send array to downstream...
static int status()
static int grid_rank(int *rank, const int *grid_coord)
find rank number from grid coordinate.
static int setup(int ninstance=1)
setup communicator
static int NPEx()
static int sync_usleep()
synchronize within small world. (slow but no busy wait)
static int send_1to1(size_t size, void *recv_buf, void *send_buf, int send_to, int recv_from, int tag)
static int NPEz()
static int size()
size of small world.
static double get_time()
obtain a wall-clock time.
static int reduce_sum(int count, double *recv_buf, double *send_buf, int pattern=0)
make a global sum of an array of double over the communicator. pattern specifies the dimensions to be...
static int sync()
synchronize within small world.
static int broadcast(int count, double *data, int sender)
broadcast array of double from sender.
static bool is_primary()
check if the present node is primary in small communicator.