Statistics
| Branch: | Revision:

root / synthbench / skampi / measurements / onesided.c

History | View | Annotate | Download (100.5 kB)

1
/* SKaMPI MPI-Benchmark
2

3
Copyright 2003-2008 Marc-Oliver Straub
4
Lehrstuhl Informatik fuer Naturwissenschaftler und Ingenieure 
5
Fakultaet fuer Informatik
6
University of Karlsruhe
7

8
This program is free software; you can redistribute it and/or modify
9
it under the terms of version 2 of the GNU General Public License as
10
published by the Free Software Foundation
11

12
This program is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16

17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
20

    
21
#include <mpi.h>
22
#include "../mpiversiontest.h"
23

    
24
#ifdef USE_ONESIDED
25

    
26
#include <stdlib.h>
27
#include <stdio.h>
28
#include <string.h>
29
#include <math.h>
30
#include <assert.h>
31

    
32
#include "../misc.h"
33
#include "../mem.h"
34
#include "../synchronize.h"
35

    
36
#pragma weak begin_skampi_extensions
37

    
38
#define TIMINGDETAILS 0
39

    
40
/*---------------------------------------------------------------------------*/
41
/* Globals for onesided measurements                                         */
42
/*---------------------------------------------------------------------------*/
43
static MPI_Win      onesided_win;
44
static int          onesided_winsize;
45
static MPI_Group    onesided_group;
46
static MPI_Datatype onesided_datatype;
47

    
48
/*---------------------------------------------------------------------------*/
49
/* Utility routines                                                          */
50
/*---------------------------------------------------------------------------*/
51

    
52
void func_set_skampi_buffer_mpi_alloc_mem(int size, MPI_Info info) {
53
  set_skampi_buffer_mpi_alloc_mem(size, info);
54
}
55

    
56
int func_round_to_fourbytes(int size) {
57
  
58
  if (size % 4 == 0) 
59
    return size;
60
  
61
  return (size + 4) - (size % 4);
62
}
63

    
64
int func_round_to_fivebytes(int size) {
65
  
66
  if (size % 4 == 0) 
67
    return size+1;
68
  
69
  return (size + 4) - (size % 4) +1;
70
}
71

    
72
int wait_for(int us)
73
{
74
  int its = 0;
75
  double seconds, starttime, endtime;
76

    
77
  if (us == 0) 
78
    return 0;
79
  its = 0;
80
  seconds = ((double)us) / 1.0e6;
81
  starttime = MPI_Wtime();
82
  endtime = starttime + seconds;
83
  while(MPI_Wtime() < endtime)
84
    its++;
85
  return its;
86
}
87

    
88
/* Selection of allowed constants for onesided MPI Calls */
89
int extract_onesided_assertions(int assertions, char* function_call)
90
{
91
  int mpiassert = 0;
92

    
93
  /* mask out unspecified assertions */
94
  if (function_call != NULL) {
95
    if (strstr(function_call, "MPI_Win_start") != NULL)
96
      mpiassert &= (MPI_MODE_NOCHECK);
97
    if (strstr(function_call, "MPI_Win_post") != NULL)
98
      mpiassert &= (MPI_MODE_NOCHECK | MPI_MODE_NOSTORE | MPI_MODE_NOPUT);
99
    if (strstr(function_call, "MPI_Win_fence") != NULL)
100
      mpiassert &= (MPI_MODE_NOPRECEDE | MPI_MODE_NOSUCCEED | MPI_MODE_NOSTORE | MPI_MODE_NOPUT);
101
    if (strstr(function_call, "MPI_Win_lock") != NULL)
102
      mpiassert &= (MPI_MODE_NOCHECK);
103
  }
104

    
105
  return mpiassert;
106
}
107

    
108
MPI_Group exclude_rank_from_group(int rank, MPI_Group group)
109
{
110
  MPI_Group newgroup;
111
  MPI_Group_excl(group, 1, &rank, &newgroup);
112

    
113
  return newgroup;
114
}
115

    
116
MPI_Group exclude_all_ranks_except_from_group(int rank, MPI_Group group)
117
{
118
  MPI_Group newgroup;
119
  MPI_Group_incl(group, 1, &rank, &newgroup);
120

    
121
  return newgroup;
122
}
123

    
124
/*---------------------------------------------------------------------------*/
125
/* Primitive measurements                                                    */
126
/*---------------------------------------------------------------------------*/
127

    
128
void init_onesided_dummy(int count, MPI_Datatype datatype, MPI_Info info)
129
{
130
  onesided_winsize = get_extent(count, datatype);
131

    
132
  set_send_buffer_usage(onesided_winsize);
133
  set_reported_message_size(onesided_winsize);
134
  set_recv_buffer_usage(onesided_winsize);
135

    
136
  init_synchronization();
137
}
138

    
139
double measure_onesided_dummy(int count, MPI_Datatype datatype, MPI_Info info)
140
{
141
  double start_time, end_time;
142
  
143
  start_time = start_synchronization();
144
  end_time = stop_synchronization();
145

    
146
  if (get_measurement_rank()==0)
147
    return end_time - start_time;
148
  else
149
    return -1;
150
}
151

    
152
/*---------------------------------------------------------------------------*/
153

    
154
void init_Win_fence_open(int count, MPI_Datatype datatype, MPI_Info info, int assertion)
155
{
156
  onesided_winsize = get_extent(count, datatype);
157

    
158
  set_send_buffer_usage(onesided_winsize);
159
  set_reported_message_size(onesided_winsize);
160
  set_recv_buffer_usage(onesided_winsize);
161

    
162
  init_synchronization();
163
}
164

    
165
double measure_Win_fence_open(int count, MPI_Datatype datatype, MPI_Info info, int assertion)
166
{
167
  double start_time, end_time;
168
  
169
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
170
                 get_measurement_comm(), &onesided_win);
171
  start_time = start_synchronization();
172
  MPI_Win_fence(MPI_MODE_NOPRECEDE | assertion, onesided_win);
173
  end_time = stop_synchronization();
174

    
175
  MPI_Win_free(&onesided_win);
176

    
177
  return end_time - start_time;
178
}
179

    
180
/*---------------------------------------------------------------------------*/
181

    
182
void init_Win_fence_close(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
183
{
184
  onesided_winsize = get_extent(count, datatype);
185

    
186
  set_send_buffer_usage(onesided_winsize);
187
  set_reported_message_size(onesided_winsize);
188

    
189
  set_recv_buffer_usage(onesided_winsize);
190

    
191
  init_synchronization();
192
}
193

    
194
double measure_Win_fence_close(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
195
{
196
  double start_time, end_time;
197
  
198
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
199
                 get_measurement_comm(), &onesided_win);
200
  MPI_Win_fence(MPI_MODE_NOPRECEDE | assertion, onesided_win);
201
  if (do_a_put)
202
    MPI_Put(get_send_buffer(), 1, datatype, get_measurement_rank(),
203
            0, 1, datatype, onesided_win);
204

    
205
  start_time = start_synchronization();
206
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
207
  end_time = stop_synchronization();
208

    
209
  MPI_Win_free(&onesided_win);
210

    
211
  return end_time - start_time;
212
}
213

    
214
void init_Win_fence_close_collective(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
215
{
216
  onesided_winsize = get_extent(count, datatype);
217

    
218
  if (get_measurement_rank() == 0)
219
    set_send_buffer_usage(0);
220
  else
221
    set_send_buffer_usage(onesided_winsize);
222
  set_reported_message_size(onesided_winsize);
223

    
224
  if (get_measurement_rank() == 0)
225
    onesided_winsize = get_extent(get_measurement_size()*count, datatype);
226
  else
227
    onesided_winsize = 0;
228
  set_recv_buffer_usage(onesided_winsize);
229

    
230
  init_synchronization();
231
}
232

    
233
double measure_Win_fence_close_collective(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
234
{
235
  double start_time, end_time;
236
  
237
  MPI_Win_create(get_recv_buffer(), onesided_winsize, get_extent(count, datatype), info, get_measurement_comm(), &onesided_win);
238
  MPI_Win_fence(MPI_MODE_NOPRECEDE | assertion, onesided_win);
239
  if (get_measurement_rank() != 0 && do_a_put)
240
    MPI_Put(get_send_buffer(), count, datatype, 0,
241
            get_measurement_rank(), count, datatype, onesided_win);
242
  start_time = start_synchronization();
243
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
244
  end_time = stop_synchronization();
245

    
246
  MPI_Win_free(&onesided_win);
247

    
248
  return end_time - start_time;
249
}
250

    
251
/*---------------------------------------------------------------------------*/
252

    
253
void init_Win_fence_close_delayed(int count, MPI_Datatype datatype, MPI_Info info, int msg_count, int delay_us)
254
{
255
  onesided_winsize = get_extent(count*msg_count, datatype);
256

    
257
  set_send_buffer_usage(onesided_winsize);
258
  set_reported_message_size(onesided_winsize);
259

    
260
  set_recv_buffer_usage(onesided_winsize);
261

    
262
  init_synchronization();
263
}
264

    
265
double measure_Win_fence_close_delayed(int count, MPI_Datatype datatype, MPI_Info info, int msg_count, int delay_us)
266
{
267
  double start_time, end_time;
268
  int i;
269
  int extent, offset;
270
  
271
  extent = get_extent(count, datatype);
272
  MPI_Win_create(get_recv_buffer(), onesided_winsize, extent,
273
                 info, get_measurement_comm(), &onesided_win);
274
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
275

    
276
  for(i=0; i < msg_count; i++)
277
    {
278
      offset = i*extent;
279
      MPI_Put((char*)get_send_buffer()+offset, count, datatype,
280
              (get_measurement_rank() + 1)%get_measurement_size(),
281
              i, count, datatype, onesided_win);
282
    }
283

    
284
  wait_for(delay_us);
285

    
286
  start_time = start_synchronization();
287
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
288
  end_time = stop_synchronization();
289

    
290
  MPI_Win_free(&onesided_win);
291

    
292
  return end_time - start_time;
293
}
294

    
295
/*---------------------------------------------------------------------------*/
296

    
297
void init_Win_fence_openclose(int count, MPI_Datatype datatype, MPI_Info info, int do_a_put)
298
{
299
  onesided_winsize = get_extent(count, datatype);
300

    
301
  set_send_buffer_usage(onesided_winsize);
302
  set_reported_message_size(onesided_winsize);
303

    
304
  set_recv_buffer_usage(onesided_winsize);
305

    
306
  init_synchronization();
307
}
308

    
309
double measure_Win_fence_openclose(int count, MPI_Datatype datatype, MPI_Info info, int do_a_put)
310
{
311
  double start_time, end_time;
312
  
313
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
314
                 get_measurement_comm(), &onesided_win);
315
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
316
  if (do_a_put)
317
    MPI_Put(get_send_buffer(), 1, datatype, get_measurement_rank(),
318
            0, 1, datatype, onesided_win);
319

    
320
  start_time = start_synchronization();
321
  MPI_Win_fence(0, onesided_win);
322
  end_time = stop_synchronization();
323

    
324
  MPI_Win_free(&onesided_win);
325

    
326
  return end_time - start_time;
327
}
328

    
329
/*---------------------------------------------------------------------------*/
330

    
331
void init_Win_start(int count, MPI_Datatype datatype, MPI_Info info, int assertion)
332
{
333
  onesided_winsize = get_extent(count, datatype);
334

    
335
  set_send_buffer_usage(onesided_winsize);
336
  set_reported_message_size(onesided_winsize);
337

    
338
  set_recv_buffer_usage(onesided_winsize);
339

    
340
  init_synchronization();
341
}
342

    
343
double measure_Win_start(int count, MPI_Datatype datatype, MPI_Info info, int assertion)
344
{
345
  double start_time = 1.0, end_time = 0.0;
346
  int mpiassert;
347
  MPI_Group reduced_group;
348

    
349
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
350
                 get_measurement_comm(), &onesided_win);
351
  MPI_Win_get_group(onesided_win, &onesided_group);
352

    
353
  reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
354

    
355
  mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
356
  MPI_Win_post(reduced_group, mpiassert, onesided_win);
357

    
358
  if (get_measurement_rank() == 0) {
359
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
360
    start_time = start_synchronization();
361
    MPI_Win_start(onesided_group, mpiassert, onesided_win);
362
    end_time = MPI_Wtime();
363
  }
364
  else {
365
    start_synchronization();
366
  }
367
  stop_synchronization();
368

    
369
  if (get_measurement_rank() == 0) {
370
    MPI_Win_complete(onesided_win);
371
  }
372

    
373
  MPI_Group_free(&reduced_group);
374
  MPI_Win_wait(onesided_win);
375

    
376
  MPI_Win_free(&onesided_win);
377
  MPI_Group_free(&onesided_group);
378

    
379
  if (get_measurement_rank() == 0)
380
    return end_time - start_time;
381
  else
382
    return -1.0;
383
}
384

    
385
/*---------------------------------------------------------------------------*/
386

    
387
void init_Win_start_delayed_post(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int delay_us, int delay_rank)
388
{
389
  onesided_winsize = get_extent(count, datatype);
390

    
391
  set_send_buffer_usage(onesided_winsize);
392
  set_reported_message_size(onesided_winsize);
393

    
394
  set_recv_buffer_usage(onesided_winsize);
395

    
396
  init_synchronization();
397
}
398

    
399
double measure_Win_start_delayed_post(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int delay_us, int delay_rank)
400
{
401
  double start_time = 1.0, end_time = 0.0;
402
  int mpiassert;
403
  MPI_Group reduced_group;
404

    
405
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
406
                 get_measurement_comm(), &onesided_win);
407
  MPI_Win_get_group(onesided_win, &onesided_group);
408

    
409
  reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
410

    
411
  mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
412

    
413
  if (get_measurement_rank() == 0) {
414
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
415
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
416
    start_time = start_synchronization();
417
    MPI_Win_start(onesided_group, mpiassert, onesided_win);
418
    end_time = MPI_Wtime();
419
  }
420
  else {
421
    if (get_measurement_rank() == delay_rank || delay_rank == -1) {
422
      start_synchronization();
423
      wait_for(delay_us);
424
      MPI_Win_post(reduced_group, mpiassert, onesided_win);
425
    }
426
    else {
427
      MPI_Win_post(reduced_group, mpiassert, onesided_win);
428
      start_synchronization();
429
    }
430
  }
431
  stop_synchronization();
432

    
433
  if (get_measurement_rank() == 0) {
434
    MPI_Win_complete(onesided_win);
435
  }
436

    
437
  MPI_Group_free(&reduced_group);
438
  MPI_Win_wait(onesided_win);
439

    
440
  MPI_Win_free(&onesided_win);
441
  MPI_Group_free(&onesided_group);
442

    
443
  if (get_measurement_rank() == 0)
444
    return end_time - start_time;
445
  else
446
    return -1.0;
447
}
448

    
449
/*---------------------------------------------------------------------------*/
450

    
451
void init_Win_post(int count, MPI_Datatype datatype, MPI_Info info, int assertion)
452
{
453
  onesided_winsize = get_extent(count, datatype);
454

    
455
  set_send_buffer_usage(onesided_winsize);
456
  set_reported_message_size(onesided_winsize);
457

    
458
  set_recv_buffer_usage(onesided_winsize);
459

    
460
  init_synchronization();
461
}
462

    
463
double measure_Win_post(int count, MPI_Datatype datatype, MPI_Info info, int assertion)
464
{
465
  double start_time = 1.0, end_time = 0.0;
466
  int mpiassert;
467

    
468
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
469
                 get_measurement_comm(), &onesided_win);
470
  MPI_Win_get_group(onesided_win, &onesided_group);
471

    
472
  mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
473
  /* Assertion MPI_MODE_NOCHECK can be used here, because all MPI_Win_post
474
     calls will be finished before MPI_Win_start is being called. */
475
  start_time = start_synchronization();
476
  MPI_Win_post(onesided_group, mpiassert, onesided_win);
477
  end_time = stop_synchronization();
478

    
479
  mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
480
  MPI_Win_start(onesided_group, mpiassert, onesided_win);
481
  MPI_Win_complete(onesided_win);
482

    
483
  MPI_Win_wait(onesided_win);
484
  MPI_Win_free(&onesided_win);
485
  MPI_Group_free(&onesided_group);
486

    
487
  return end_time - start_time;
488
}
489

    
490
/*---------------------------------------------------------------------------*/
491

    
492
void init_Win_complete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
493
{
494
  onesided_winsize = get_extent(count, datatype);
495

    
496
  if (get_measurement_rank() == 0)
497
    set_send_buffer_usage(onesided_winsize);
498
  else
499
    set_send_buffer_usage(0);
500
  set_reported_message_size(onesided_winsize);
501

    
502
  set_recv_buffer_usage(onesided_winsize);
503

    
504
  init_synchronization();
505
}
506

    
507
double measure_Win_complete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
508
{
509
  double start_time = 1.0, end_time = 0.0;
510
  int mpiassert, i;
511
  MPI_Group reduced_group;
512

    
513
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
514
                 get_measurement_comm(), &onesided_win);
515
  MPI_Win_get_group(onesided_win, &onesided_group);
516
  
517
  if (get_measurement_rank() == 0) {
518
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
519
    reduced_group = exclude_rank_from_group(0, onesided_group);
520
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
521
    if (do_a_put)
522
      for(i = 1; i < get_measurement_size(); i++)
523
        MPI_Put(get_send_buffer(), count, datatype, i,
524
                0, count, datatype, onesided_win);
525
    start_time = start_synchronization();
526
    MPI_Win_complete(onesided_win);
527
    end_time = stop_synchronization();
528
  }
529
  else {
530
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
531
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
532
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
533

    
534
    start_synchronization();
535
    MPI_Win_wait(onesided_win);
536
    stop_synchronization();
537
  }
538
  
539
  MPI_Win_free(&onesided_win);
540
  MPI_Group_free(&onesided_group);
541
  MPI_Group_free(&reduced_group);
542

    
543
  return end_time - start_time;
544
}
545

    
546
void init_Win_startcomplete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
547
{
548
  onesided_winsize = get_extent(count, datatype);
549

    
550
  if (get_measurement_rank() == 0)
551
    set_send_buffer_usage(onesided_winsize);
552
  else
553
    set_send_buffer_usage(0);
554
  set_reported_message_size(onesided_winsize);
555

    
556
  set_recv_buffer_usage(onesided_winsize);
557

    
558
  init_synchronization();
559
}
560

    
561
double measure_Win_startcomplete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
562
{
563
  double start_time = 1.0, end_time = 0.0;
564
  int mpiassert, i;
565
  MPI_Group reduced_group;
566

    
567
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
568
                 get_measurement_comm(), &onesided_win);
569
  MPI_Win_get_group(onesided_win, &onesided_group);
570
  
571
  if (get_measurement_rank() == 0) {
572
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
573
    reduced_group = exclude_rank_from_group(0, onesided_group);
574
    start_time = start_synchronization();
575
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
576
    if (do_a_put)
577
      for(i = 1; i < get_measurement_size(); i++)
578
        MPI_Put(get_send_buffer(), count, datatype, i,
579
                0, count, datatype, onesided_win);
580
    MPI_Win_complete(onesided_win);
581
    end_time = stop_synchronization();
582
  }
583
  else {
584
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
585
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
586
    start_synchronization();
587
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
588
    MPI_Win_wait(onesided_win);
589
    stop_synchronization();
590
  }
591
  
592
  MPI_Win_free(&onesided_win);
593
  MPI_Group_free(&onesided_group);
594
  MPI_Group_free(&reduced_group);
595

    
596
  return end_time - start_time;
597
}
598

    
599

    
600
void init_Win_complete_n(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int msg_count, int delay_us)
601
{
602
  onesided_winsize = get_extent(count, datatype);
603

    
604
  if (get_measurement_rank() == 0)
605
    set_send_buffer_usage(onesided_winsize);
606
  else
607
    set_send_buffer_usage(0);
608
  set_reported_message_size(onesided_winsize);
609

    
610
  set_recv_buffer_usage(msg_count * onesided_winsize);
611

    
612
  init_synchronization();
613
}
614

    
615
double measure_Win_complete_n(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int msg_count, int delay_us)
616
{
617
  double start_time = 1.0, end_time = 0.0;
618
  int mpiassert, i;
619
  int msize = get_extent(count, datatype);
620

    
621
  MPI_Group reduced_group;
622

    
623
  MPI_Win_create(get_recv_buffer(), onesided_winsize * msg_count, msize, info,
624
                 get_measurement_comm(), &onesided_win);
625
  MPI_Win_get_group(onesided_win, &onesided_group);
626
  
627
  if (get_measurement_rank() == 0) {
628
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
629
    reduced_group = exclude_rank_from_group(0, onesided_group);
630
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
631
    while(--msg_count >= 0)
632
      for(i = 1; i < get_measurement_size(); i++)
633
        MPI_Put(get_send_buffer(), count, datatype, i,
634
                msg_count, count, datatype, onesided_win);
635
    wait_for(delay_us);
636
    start_time = start_synchronization();
637
    MPI_Win_complete(onesided_win);
638
    end_time = stop_synchronization();
639
  }
640
  else {
641
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
642
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
643
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
644

    
645
    start_synchronization();
646
    MPI_Win_wait(onesided_win);
647
    stop_synchronization();
648
  }
649
  
650
  MPI_Win_free(&onesided_win);
651
  MPI_Group_free(&onesided_group);
652
  MPI_Group_free(&reduced_group);
653

    
654
  return end_time - start_time;
655
}
656

    
657
/*---------------------------------------------------------------------------*/
658

    
659
void init_Win_complete_delayed_wait(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
660
{
661
  onesided_winsize = get_extent(count, datatype);
662

    
663
  if (get_measurement_rank() == 0)
664
    set_send_buffer_usage(onesided_winsize);
665
  else
666
    set_send_buffer_usage(0);
667
  set_reported_message_size(onesided_winsize);
668

    
669
  set_recv_buffer_usage(onesided_winsize);
670

    
671
  init_synchronization();
672
}
673

    
674
double measure_Win_complete_delayed_wait(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
675
{
676
  double start_time = 1.0, end_time = 0.0;
677
  int mpiassert, i;
678
  MPI_Group reduced_group;
679

    
680
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
681
                 get_measurement_comm(), &onesided_win);
682
  MPI_Win_get_group(onesided_win, &onesided_group);
683

    
684
  if (get_measurement_rank() == 0) {
685
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
686
    reduced_group = exclude_rank_from_group(0, onesided_group);
687
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
688

    
689
    if (do_a_put)
690
      for(i = 1; i < get_measurement_size(); i++)
691
        MPI_Put(get_send_buffer(), count, datatype, i,
692
                0, count, datatype, onesided_win);
693

    
694
    start_time = start_synchronization();
695
    MPI_Win_complete(onesided_win);
696
    end_time = stop_synchronization();
697
  }
698
  else {
699
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
700
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
701
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
702

    
703
    start_synchronization();
704
    if (delay_us)
705
      wait_for(delay_us);
706
    MPI_Win_wait(onesided_win);
707
    stop_synchronization();
708
  }
709

    
710
  MPI_Win_free(&onesided_win);
711
  MPI_Group_free(&onesided_group);
712
  MPI_Group_free(&reduced_group);
713

    
714
  return end_time - start_time;
715
}
716

    
717
/*---------------------------------------------------------------------------*/
718

    
719
void init_Win_wait_early_complete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
720
{
721
  set_reported_message_size(get_extent(count, datatype));
722

    
723
  if (get_measurement_rank() == 0)
724
    onesided_winsize = get_extent(get_measurement_size()*count, datatype);
725
  else
726
    onesided_winsize = 0;
727

    
728
  set_recv_buffer_usage(onesided_winsize);
729

    
730
  if (get_measurement_rank() == 0)
731
    set_send_buffer_usage(0);
732
  else
733
    set_send_buffer_usage(get_extent(count, datatype));
734

    
735
  init_synchronization();
736
}
737

    
738
double measure_Win_wait_early_complete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
739
{
740
  double start_time = 1.0, end_time = 0.0;
741
  int mpiassert;
742
  MPI_Group reduced_group;
743

    
744
  MPI_Win_create(get_recv_buffer(), onesided_winsize, get_extent(count,datatype), info,
745
                 get_measurement_comm(), &onesided_win);
746
  MPI_Win_get_group(onesided_win, &onesided_group);
747

    
748
  if (get_measurement_rank() == 0) {
749
    reduced_group = exclude_rank_from_group(0, onesided_group);
750
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
751
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
752

    
753
    start_time = start_synchronization();
754
    if (delay_us > 0)
755
      wait_for(delay_us);
756
    start_time = MPI_Wtime();
757
    MPI_Win_wait(onesided_win);
758
    end_time = stop_synchronization();
759
  }
760
  else {
761
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
762
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
763
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
764
    if (do_a_put)
765
      MPI_Put(get_send_buffer(), count, datatype, 0, get_measurement_rank(),
766
              count, datatype, onesided_win);
767
    start_synchronization();
768
    MPI_Win_complete(onesided_win);
769
    stop_synchronization();
770
  }
771

    
772
  MPI_Win_free(&onesided_win);
773
  MPI_Group_free(&reduced_group);
774
  MPI_Group_free(&onesided_group);
775

    
776
  if (get_measurement_rank() == 0)
777
    return end_time - start_time;
778
  else
779
    return -1;
780
}
781

    
782
/*---------------------------------------------------------------------------*/
783

    
784
void init_Win_wait_delayed_complete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
785
{
786
  set_reported_message_size(get_extent(count, datatype));
787

    
788
  if (get_measurement_rank() == 0)
789
    onesided_winsize = get_extent(get_measurement_size()*count, datatype);
790
  else
791
    onesided_winsize = 0;
792

    
793
  set_recv_buffer_usage(onesided_winsize);
794

    
795
  if (get_measurement_rank() == 0)
796
    set_send_buffer_usage(0);
797
  else
798
    set_send_buffer_usage(get_extent(count, datatype));
799

    
800
  init_synchronization();
801
}
802

    
803
double measure_Win_wait_delayed_complete(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
804
{
805
  double start_time = 1.0, end_time = 0.0;
806
  int mpiassert;
807
  MPI_Group reduced_group;
808

    
809
  MPI_Win_create(get_recv_buffer(), onesided_winsize, get_extent(count,datatype), info,
810
                 get_measurement_comm(), &onesided_win);
811
  MPI_Win_get_group(onesided_win, &onesided_group);
812

    
813
  if (get_measurement_rank() == 0) {
814
    reduced_group = exclude_rank_from_group(0, onesided_group);
815
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
816
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
817
    start_time = start_synchronization();
818
    MPI_Win_wait(onesided_win);
819
    end_time = stop_synchronization();
820
  }
821
  else {
822
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
823
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
824
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
825
    if (do_a_put)
826
      MPI_Put(get_send_buffer(), count, datatype, 0, get_measurement_rank(),
827
              count, datatype, onesided_win);
828
    
829
    start_synchronization();
830
    if (delay_us)
831
      wait_for(delay_us);
832
    MPI_Win_complete(onesided_win);
833
    stop_synchronization();
834
  }
835

    
836
  MPI_Win_free(&onesided_win);
837
  MPI_Group_free(&reduced_group);
838
  MPI_Group_free(&onesided_group);
839

    
840
  return end_time - start_time;
841
}
842

    
843
/*---------------------------------------------------------------------------*/
844

    
845
void init_Win_test(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
846
{
847
  set_reported_message_size(get_extent(count, datatype));
848

    
849
  if (get_measurement_rank() == 0)
850
    onesided_winsize = get_extent(get_measurement_size()*count, datatype);
851
  else
852
    onesided_winsize = 0;
853

    
854
  set_recv_buffer_usage(onesided_winsize);
855

    
856
  if (get_measurement_rank() == 0)
857
    set_send_buffer_usage(0);
858
  else
859
    set_send_buffer_usage(get_extent(count, datatype));
860

    
861
  init_synchronization();
862
}
863

    
864
double measure_Win_test(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put)
865
{
866
  double start_time = 1.0, end_time = 0.0;
867
  int mpiassert, flag;
868
  MPI_Group reduced_group;
869

    
870
  MPI_Win_create(get_recv_buffer(), onesided_winsize, get_extent(count,datatype), info,
871
                 get_measurement_comm(), &onesided_win);
872
  MPI_Win_get_group(onesided_win, &onesided_group);
873

    
874
  if (get_measurement_rank() == 0) {
875
    reduced_group = exclude_rank_from_group(0, onesided_group);
876
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
877
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
878

    
879
    start_time = start_synchronization();
880
    MPI_Win_test(onesided_win, &flag);
881
    end_time = stop_synchronization();
882
    if (flag == 0)
883
      MPI_Win_wait(onesided_win);
884
  }
885
  else {
886
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
887
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
888
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
889
    if (do_a_put)
890
      MPI_Put(get_send_buffer(), count, datatype, 0, get_measurement_rank(),
891
              count, datatype, onesided_win);
892
    MPI_Win_complete(onesided_win);
893
    start_synchronization();
894
    stop_synchronization();
895
  }
896

    
897
  MPI_Win_free(&onesided_win);
898
  MPI_Group_free(&reduced_group);
899
  MPI_Group_free(&onesided_group);
900

    
901
  return end_time - start_time;
902
}
903

    
904
/*---------------------------------------------------------------------------*/
905

    
906
void init_Win_test_delayed(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
907
{
908
  set_reported_message_size(get_extent(count, datatype));
909

    
910
  if (get_measurement_rank() == 0)
911
    onesided_winsize = get_extent(get_measurement_size()*count, datatype);
912
  else
913
    onesided_winsize = 0;
914

    
915
  set_recv_buffer_usage(onesided_winsize);
916

    
917
  if (get_measurement_rank() == 0)
918
    set_send_buffer_usage(0);
919
  else
920
    set_send_buffer_usage(get_extent(count, datatype));
921

    
922
  init_synchronization();
923
}
924

    
925
double measure_Win_test_delayed(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int do_a_put, int delay_us)
926
{
927
  double start_time = 1.0, end_time = 0.0;
928
  int mpiassert, flag;
929
  MPI_Group reduced_group;
930

    
931
  MPI_Win_create(get_recv_buffer(), onesided_winsize, get_extent(count,datatype), info,
932
                 get_measurement_comm(), &onesided_win);
933
  MPI_Win_get_group(onesided_win, &onesided_group);
934

    
935
  if (get_measurement_rank() == 0) {
936
    reduced_group = exclude_rank_from_group(0, onesided_group);
937
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_post");
938
    MPI_Win_post(reduced_group, mpiassert, onesided_win);
939
    start_time = start_synchronization();
940
    MPI_Win_test(onesided_win, &flag);
941
    end_time = stop_synchronization();
942
    if (flag == 0)
943
      MPI_Win_wait(onesided_win);
944
  }
945
  else {
946
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
947
    mpiassert = extract_onesided_assertions(assertion, "MPI_Win_start");
948
    MPI_Win_start(reduced_group, mpiassert, onesided_win);
949
    if (do_a_put)
950
      MPI_Put(get_send_buffer(), count, datatype, 0, get_measurement_rank(),
951
              count, datatype, onesided_win);
952
    
953
    start_synchronization();
954
    if (delay_us)
955
      wait_for(delay_us);
956
    MPI_Win_complete(onesided_win);
957
    stop_synchronization();
958
  }
959

    
960
  MPI_Win_free(&onesided_win);
961
  MPI_Group_free(&reduced_group);
962
  MPI_Group_free(&onesided_group);
963

    
964
  return end_time - start_time;
965
}
966

    
967
/*---------------------------------------------------------------------------*/
968

    
969
void init_Win_create(int count, MPI_Datatype datatype, MPI_Info info)
970
{
971
  onesided_winsize = get_extent(count, datatype);
972

    
973
  set_send_buffer_usage(onesided_winsize);
974
  set_reported_message_size(onesided_winsize);
975

    
976
  set_recv_buffer_usage(onesided_winsize);
977

    
978
  init_synchronization();
979
}
980

    
981
double measure_Win_create(int count, MPI_Datatype datatype, MPI_Info info)
982
{
983
  double start_time = 1.0, end_time = 0.0;
984

    
985
  start_time = start_synchronization();
986
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
987
                 get_measurement_comm(), &onesided_win);
988
  end_time = stop_synchronization();
989
  MPI_Win_free(&onesided_win);
990

    
991
  return end_time - start_time;
992
}
993

    
994
/*---------------------------------------------------------------------------*/
995

    
996
void init_Win_free(int count, MPI_Datatype datatype, MPI_Info info, int do_a_put)
997
{
998
  onesided_winsize = get_extent(count, datatype);
999

    
1000
  set_send_buffer_usage(onesided_winsize);
1001
  set_reported_message_size(onesided_winsize);
1002

    
1003
  set_recv_buffer_usage(onesided_winsize);
1004

    
1005
  init_synchronization();
1006
}
1007

    
1008
double measure_Win_free(int count, MPI_Datatype datatype, MPI_Info info, int do_a_put)
1009
{
1010
  double start_time = 1.0, end_time = 0.0;
1011

    
1012
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1013
                 get_measurement_comm(), &onesided_win);
1014
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1015
  if (do_a_put)
1016
    MPI_Put(get_send_buffer(), 1, datatype, get_measurement_rank(),
1017
            0, 1, datatype, onesided_win);
1018

    
1019
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1020

    
1021
  start_time = start_synchronization();
1022
  MPI_Win_free(&onesided_win);
1023
  end_time = stop_synchronization();
1024

    
1025
  return end_time - start_time;
1026
}
1027

    
1028
/*---------------------------------------------------------------------------*/
1029

    
1030
void init_Win_lock(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int lock_type, int dest_rank)
1031
{
1032
  onesided_winsize = get_extent(count, datatype);
1033

    
1034
  set_send_buffer_usage(onesided_winsize);
1035
  set_reported_message_size(onesided_winsize);
1036

    
1037
  set_recv_buffer_usage(onesided_winsize);
1038

    
1039
  init_synchronization();
1040
}
1041

    
1042
double measure_Win_lock(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int lock_type, int dest_rank)
1043
{
1044
  double start_time = 1.0, end_time = 0.0;
1045
  int mpiassert = extract_onesided_assertions(assertion, "MPI_Win_lock");
1046

    
1047
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1048
                 get_measurement_comm(), &onesided_win);
1049

    
1050
  start_time = start_synchronization();
1051
  if (get_measurement_rank() == 0)
1052
    MPI_Win_lock(lock_type, dest_rank, mpiassert, onesided_win);
1053
  end_time = stop_synchronization();
1054

    
1055
  if (get_measurement_rank() == 0)
1056
    MPI_Win_unlock(dest_rank, onesided_win);
1057

    
1058
  MPI_Win_free(&onesided_win);
1059

    
1060
  if (get_measurement_rank() == 0)
1061
    return end_time - start_time;
1062
  else
1063
    return -1;
1064
}
1065

    
1066
/*---------------------------------------------------------------------------*/
1067

    
1068
void init_Win_lock_desync(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int lock_type, int dest_rank, int delay_us)
1069
{
1070
  onesided_winsize = get_extent(count, datatype);
1071

    
1072
  set_send_buffer_usage(onesided_winsize);
1073
  set_reported_message_size(onesided_winsize);
1074

    
1075
  set_recv_buffer_usage(onesided_winsize);
1076

    
1077
  init_synchronization();
1078
}
1079

    
1080
double measure_Win_lock_desync(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int lock_type, int dest_rank, int delay_us)
1081
{
1082
  double start_time = 1.0, end_time = 0.0;
1083
  int mpiassert = extract_onesided_assertions(assertion, "MPI_Win_lock");
1084

    
1085
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1086
                 get_measurement_comm(), &onesided_win);
1087

    
1088
  start_synchronization();
1089
  wait_for(delay_us);
1090
  start_time = MPI_Wtime();
1091
  if (get_measurement_rank() == 0)
1092
    MPI_Win_lock(lock_type, dest_rank, mpiassert, onesided_win);
1093
  end_time = stop_synchronization();
1094

    
1095
  if (get_measurement_rank() == 0)
1096
    MPI_Win_unlock(dest_rank, onesided_win);
1097

    
1098
  MPI_Win_free(&onesided_win);
1099

    
1100
  if (get_measurement_rank() == 0)
1101
    return end_time - start_time;
1102
  else
1103
    return -1;
1104
}
1105

    
1106
/*---------------------------------------------------------------------------*/
1107

    
1108
void init_Win_unlock(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int lock_type, int dest_rank, int do_a_put, int delay_us)
1109
{
1110
  onesided_winsize = get_extent(count, datatype);
1111

    
1112
  set_send_buffer_usage(onesided_winsize);
1113
  set_reported_message_size(onesided_winsize);
1114

    
1115
  set_recv_buffer_usage(onesided_winsize);
1116

    
1117
  init_synchronization();
1118
}
1119

    
1120
double measure_Win_unlock(int count, MPI_Datatype datatype, MPI_Info info, int assertion, int lock_type, int dest_rank, int do_a_put, int delay_us)
1121
{
1122
  double start_time = 1.0, end_time = 0.0;
1123
  int mpiassert = extract_onesided_assertions(assertion, "MPI_Win_unlock");
1124

    
1125
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1126
                 get_measurement_comm(), &onesided_win);
1127

    
1128
  if (get_measurement_rank() == 0) {
1129
    MPI_Win_lock(lock_type, dest_rank, mpiassert, onesided_win);
1130

    
1131
    if (do_a_put)
1132
      MPI_Put(get_send_buffer(), count, datatype, dest_rank,
1133
              0, count, datatype, onesided_win);
1134
  }
1135

    
1136
  wait_for(delay_us);
1137
  start_time = start_synchronization();
1138
  if (get_measurement_rank() == 0)
1139
    MPI_Win_unlock(dest_rank, onesided_win);
1140
  end_time = stop_synchronization();
1141

    
1142
  MPI_Win_free(&onesided_win);
1143

    
1144
  if (get_measurement_rank() == 0)
1145
    return end_time - start_time;
1146
  else
1147
    return -1.0;
1148
}
1149

    
1150
/*---------------------------------------------------------------------------*/
1151

    
1152
void init_Pingpong_Put_Put(int count, MPI_Datatype datatype, MPI_Info info, int iterations)
1153
{
1154
  onesided_winsize = get_extent(count, datatype);
1155

    
1156
  set_send_buffer_usage(onesided_winsize);
1157
  set_reported_message_size(onesided_winsize);
1158

    
1159
  set_recv_buffer_usage(onesided_winsize);
1160

    
1161
  init_synchronization();
1162
}
1163

    
1164
double measure_Pingpong_Put_Put(int count, MPI_Datatype datatype, MPI_Info info, int iterations)
1165
{
1166
  double start_time = 1.0, end_time = 0.0;
1167
  int i;
1168

    
1169
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1170
                 get_measurement_comm(), &onesided_win);
1171

    
1172
  if (iterations<0) {
1173
    return -1.0;   /* indicate that this definitely is an error */
1174
  }
1175
  if (iterations==0) {
1176
    return 0.0;    /* avoid division by zero at the end */
1177
  }
1178

    
1179
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1180
  start_time = start_synchronization();
1181
  for (i=0; i<iterations; i++) {
1182
    if (get_measurement_rank() == 0)
1183
      MPI_Put(get_send_buffer(), count, datatype, 1,
1184
              0, count, datatype, onesided_win);
1185
    MPI_Win_fence(0, onesided_win);
1186
    if (get_measurement_rank() == 1)
1187
      MPI_Put(get_recv_buffer(), count, datatype, 0,
1188
              0, count, datatype, onesided_win);
1189
    MPI_Win_fence(0, onesided_win);
1190
  }
1191
  end_time = stop_synchronization();
1192

    
1193
  MPI_Win_free(&onesided_win);
1194

    
1195
  return (end_time - start_time)/iterations;
1196
}
1197

    
1198
void init_Put_fence_bidirectional(int count, MPI_Datatype datatype, MPI_Info info)
1199
{
1200
  onesided_winsize = get_extent(count, datatype);
1201

    
1202
  set_send_buffer_usage(onesided_winsize);
1203
  set_reported_message_size(onesided_winsize);
1204

    
1205
  set_recv_buffer_usage(onesided_winsize);
1206

    
1207
  init_synchronization();
1208
}
1209

    
1210
double measure_Put_fence_bidirectional(int count, MPI_Datatype datatype, MPI_Info info)
1211
{
1212
  double start_time = 1.0, end_time = 0.0;
1213

    
1214
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1215
                 get_measurement_comm(), &onesided_win);
1216

    
1217

    
1218
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1219
  start_time = start_synchronization();
1220
  MPI_Put(get_send_buffer(), count, datatype, 1-get_measurement_rank(),
1221
          0, count, datatype, onesided_win);
1222
  MPI_Win_fence(0, onesided_win);
1223
  end_time = stop_synchronization();
1224

    
1225
  MPI_Win_free(&onesided_win);
1226

    
1227
  return end_time - start_time;
1228
}
1229

    
1230
/*---------------------------------------------------------------------------*/
1231

    
1232
void init_Put(int count, MPI_Datatype datatype, MPI_Info info)
1233
{
1234
  onesided_winsize = get_extent(count, datatype);
1235

    
1236
  set_send_buffer_usage(onesided_winsize);
1237
  set_recv_buffer_usage(onesided_winsize);
1238
  set_reported_message_size(onesided_winsize);
1239

    
1240
  init_synchronization();
1241
}
1242

    
1243
double measure_Put(int count, MPI_Datatype datatype, MPI_Info info)
1244
{
1245
  double start_time = 1.0, end_time = 0.0;
1246

    
1247
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1248
                 get_measurement_comm(), &onesided_win);
1249

    
1250
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1251

    
1252
  start_time = start_synchronization();
1253
  if (get_measurement_rank() == 0)
1254
    MPI_Put(get_send_buffer(), count, datatype, 1,
1255
            0, count, datatype, onesided_win);
1256
  end_time = stop_synchronization();
1257

    
1258
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1259

    
1260
  MPI_Win_free(&onesided_win);
1261

    
1262
  if (get_measurement_rank() == 0)
1263
    return end_time - start_time;
1264
  else
1265
    return -1.0;
1266
}
1267

    
1268
void init_Isend_callduration(int count, MPI_Datatype datatype)
1269
{
1270
  onesided_winsize = get_extent(count, datatype);
1271

    
1272
  set_send_buffer_usage(onesided_winsize);
1273
  set_reported_message_size(onesided_winsize);
1274

    
1275
  set_recv_buffer_usage(onesided_winsize);
1276

    
1277
  init_synchronization();
1278
}
1279

    
1280
double measure_Isend_callduration(int count, MPI_Datatype datatype)
1281
{
1282
  double start_time = 1.0, end_time = 0.0;
1283
  MPI_Request r;
1284
  MPI_Status s;
1285

    
1286
  if (get_measurement_rank() == 1)
1287
    MPI_Irecv(get_recv_buffer(), count, datatype, 0, 0,
1288
              get_measurement_comm(),&r);
1289

    
1290
  start_time = start_synchronization();
1291
  if (get_measurement_rank() == 0)
1292
    MPI_Isend(get_send_buffer(), count, datatype, 1, 0,
1293
              get_measurement_comm(),&r);
1294
  end_time = stop_synchronization();
1295
  
1296
  MPI_Wait(&r, &s);
1297

    
1298
  if (get_measurement_rank() == 0)
1299
    return end_time - start_time;
1300
  else
1301
    return -1.0;
1302
}
1303

    
1304
/*---------------------------------------------------------------------------*/
1305

    
1306
void init_Put_dedicated(int count, MPI_Datatype datatype, MPI_Info info)
1307
{
1308
  onesided_winsize = get_extent(count, datatype);
1309

    
1310
  set_send_buffer_usage(onesided_winsize);
1311
  set_reported_message_size(onesided_winsize);
1312

    
1313
  set_recv_buffer_usage(onesided_winsize);
1314

    
1315
  init_synchronization();
1316
}
1317

    
1318
double measure_Put_dedicated(int count, MPI_Datatype datatype, MPI_Info info)
1319
{
1320
  double start_time = 1.0, end_time = 0.0;
1321
  MPI_Group reduced_group;
1322

    
1323
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1324
                 get_measurement_comm(), &onesided_win);
1325
  MPI_Win_get_group(onesided_win, &onesided_group);
1326

    
1327
  if (get_measurement_rank() == 0) {
1328
    reduced_group = exclude_all_ranks_except_from_group(1, onesided_group);
1329
    MPI_Win_start(reduced_group, 0, onesided_win);
1330

    
1331
    start_time = start_synchronization();
1332
    MPI_Put(get_send_buffer(), count, datatype, 1,
1333
            0, count, datatype, onesided_win);
1334
    MPI_Win_complete(onesided_win);
1335
    end_time = stop_synchronization();
1336
  }
1337
  else {
1338
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
1339
    MPI_Win_post(reduced_group, 0, onesided_win);
1340
    start_time = start_synchronization();
1341
    MPI_Win_wait(onesided_win);
1342
    end_time = stop_synchronization();
1343
  }
1344

    
1345
  MPI_Win_free(&onesided_win);
1346
  MPI_Group_free(&reduced_group);
1347
  MPI_Group_free(&onesided_group);
1348

    
1349
  return end_time - start_time;
1350
}
1351
/*---------------------------------------------------------------------------*/
1352

    
1353
void init_Put_passive(int count, MPI_Datatype datatype, MPI_Info info)
1354
{
1355
  onesided_winsize = get_extent(count, datatype);
1356

    
1357
  set_send_buffer_usage(onesided_winsize);
1358
  set_reported_message_size(onesided_winsize);
1359

    
1360
  set_recv_buffer_usage(onesided_winsize);
1361

    
1362
  init_synchronization();
1363
}
1364

    
1365
double measure_Put_passive(int count, MPI_Datatype datatype, MPI_Info info)
1366
{
1367
  double start_time = 1.0, end_time = 0.0;
1368

    
1369
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1370
                 get_measurement_comm(), &onesided_win);
1371

    
1372
  if (get_measurement_rank() == 0) {
1373
    MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 1, 0, onesided_win);
1374
    start_time = start_synchronization();
1375
    MPI_Put(get_send_buffer(), count, datatype, 1,
1376
            0, count, datatype, onesided_win);
1377
    MPI_Win_unlock(1, onesided_win);
1378
    end_time = stop_synchronization();
1379
  }
1380
  else {
1381
    start_time = start_synchronization();
1382
    end_time = stop_synchronization();
1383
  }
1384

    
1385
  MPI_Win_free(&onesided_win);
1386

    
1387
  if (get_measurement_rank() == 0)
1388
    return end_time - start_time;
1389
  else
1390
    return -1.0;
1391
}
1392

    
1393
/*---------------------------------------------------------------------------*/
1394

    
1395
void init_Put_passive_concurrent(int count, MPI_Datatype datatype, MPI_Info info, int lock_type)
1396
{
1397
  onesided_winsize = get_extent(count, datatype);
1398

    
1399
  set_send_buffer_usage(onesided_winsize);
1400
  set_reported_message_size(onesided_winsize);
1401

    
1402
  set_recv_buffer_usage(get_measurement_size() * onesided_winsize);
1403

    
1404
  init_synchronization();
1405
}
1406

    
1407
double measure_Put_passive_concurrent(int count, MPI_Datatype datatype, MPI_Info info, int lock_type)
1408
{
1409
  double start_time = 1.0, end_time = 0.0;
1410

    
1411
  MPI_Win_create(get_recv_buffer(), onesided_winsize * get_measurement_size(),
1412
                 onesided_winsize, info, get_measurement_comm(), &onesided_win);
1413

    
1414
  start_time = start_synchronization();
1415
  MPI_Win_lock(lock_type, 0, 0, onesided_win);
1416
  MPI_Put(get_send_buffer(), count, datatype, 0,
1417
          get_measurement_rank(), count, datatype, onesided_win);
1418
  MPI_Win_unlock(0, onesided_win);
1419
  end_time = stop_synchronization();
1420

    
1421
  MPI_Win_free(&onesided_win);
1422

    
1423
  return end_time - start_time;
1424
}
1425

    
1426
/*---------------------------------------------------------------------------*/
1427

    
1428
void init_Put_fence(int count, MPI_Datatype datatype, MPI_Info info)
1429
{
1430
  onesided_winsize = get_extent(count, datatype);
1431

    
1432
  set_send_buffer_usage(onesided_winsize);
1433
  set_reported_message_size(onesided_winsize);
1434

    
1435
  set_recv_buffer_usage(onesided_winsize);
1436

    
1437
  init_synchronization();
1438
}
1439

    
1440
double measure_Put_fence(int count, MPI_Datatype datatype, MPI_Info info)
1441
{
1442
  double start_time = 1.0, end_time = 0.0;
1443

    
1444
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1445
                 get_measurement_comm(), &onesided_win);
1446
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1447
  if (get_measurement_rank() == 0) {
1448
    start_time = start_synchronization();
1449
    MPI_Put(get_send_buffer(), count, datatype, 1,
1450
            0, count, datatype, onesided_win);
1451
    MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1452
    end_time = stop_synchronization();
1453
  }
1454
  else {
1455
    start_time = start_synchronization();
1456
    MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1457
    end_time = stop_synchronization();
1458
  }
1459

    
1460
  MPI_Win_free(&onesided_win);
1461

    
1462
  return end_time - start_time;
1463
}
1464

    
1465
/*---------------------------------------------------------------------------*/
1466

    
1467
void init_Put_activewait_get(int count, MPI_Info info)
1468
{
1469
  onesided_winsize = get_extent(count, MPI_INT);
1470

    
1471
  set_send_buffer_usage(onesided_winsize);
1472
  set_reported_message_size(onesided_winsize);
1473

    
1474
  set_recv_buffer_usage(onesided_winsize);
1475

    
1476
  init_synchronization();
1477
}
1478

    
1479
double measure_Put_activewait_get(int count, MPI_Info info)
1480
{
1481
  double start_time = 1.0, end_time = 0.0;
1482
  unsigned int complete = 0;
1483

    
1484
  ((int*)get_send_buffer())[count-1]=0xDEADBEEF;
1485
  ((int*)get_recv_buffer())[count-1]=0x0;
1486

    
1487
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1488
                 get_measurement_comm(), &onesided_win);
1489
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1490
  if (get_measurement_rank() == 0) {
1491
    start_time = start_synchronization();
1492
    MPI_Put(get_send_buffer(), count, MPI_INT, 1,
1493
            0, count, MPI_INT, onesided_win);
1494
    while(complete != 0xDEADBEEF)
1495
      MPI_Get(&complete, 1, MPI_INT, 1,
1496
              get_extent(count-1,MPI_INT), 1, MPI_INT, onesided_win);
1497
    end_time = stop_synchronization();
1498
  }
1499
  else {
1500
    start_time = start_synchronization();
1501
    end_time = stop_synchronization();
1502
  }
1503
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1504

    
1505
  MPI_Win_free(&onesided_win);
1506

    
1507
  if (get_measurement_rank() == 0)
1508
    return end_time - start_time;
1509
  else
1510
    return -1.0;
1511
}
1512

    
1513
/*---------------------------------------------------------------------------*/
1514

    
1515
void init_Put_activewait_twosided(int count, MPI_Info info)
1516
{
1517
  onesided_winsize = get_extent(count, MPI_INT);
1518

    
1519
  set_send_buffer_usage(onesided_winsize);
1520
  set_reported_message_size(onesided_winsize);
1521

    
1522
  set_recv_buffer_usage(onesided_winsize);
1523

    
1524
  init_synchronization();
1525
}
1526

    
1527
double measure_Put_activewait_twosided(int count, MPI_Info info)
1528
{
1529
  double start_time = 1.0, end_time = 0.0;
1530
  int complete = 0;
1531
  volatile int* lastitem = &(((int*)get_recv_buffer())[count-1]);
1532
  MPI_Status status;
1533

    
1534
  ((int*)get_send_buffer())[count-1]=0xDEADBEEF;
1535
  ((int*)get_recv_buffer())[count-1]=0x0;
1536

    
1537
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1538
                 get_measurement_comm(), &onesided_win);
1539
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1540
  if (get_measurement_rank() == 0) {
1541
    start_time = start_synchronization();
1542
    MPI_Put(get_send_buffer(), count, MPI_INT, 1,
1543
            0, count, MPI_INT, onesided_win);
1544
    MPI_Recv(&complete,1,MPI_INT,1,0,get_measurement_comm(),&status);
1545
    end_time = stop_synchronization();
1546
  }
1547
  else {
1548
    start_time = start_synchronization();
1549
    while(*lastitem != 0xDEADBEEF)
1550
      ;
1551
    MPI_Send((void*)lastitem,1,MPI_INT,0,0,get_measurement_comm());
1552
    end_time = stop_synchronization();
1553
  }
1554
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1555

    
1556
  MPI_Win_free(&onesided_win);
1557

    
1558
  if (get_measurement_rank() == 0)
1559
    return end_time - start_time;
1560
  else
1561
    return -1.0;
1562
}
1563

    
1564
void init_Put_activewait_twosided_sleep(int count, MPI_Info info, int delay_us)
1565
{
1566
  onesided_winsize = get_extent(count, MPI_INT);
1567

    
1568
  set_send_buffer_usage(onesided_winsize);
1569
  set_reported_message_size(onesided_winsize);
1570

    
1571
  set_recv_buffer_usage(onesided_winsize);
1572

    
1573
  init_synchronization();
1574
}
1575

    
1576
double measure_Put_activewait_twosided_sleep(int count, MPI_Info info, int delay_us)
1577
{
1578
  double start_time = 1.0, end_time = 0.0;
1579
  int complete = 0;
1580
  volatile int* lastitem = &(((int*)get_recv_buffer())[count-1]);
1581
  MPI_Status status;
1582

    
1583
  ((int*)get_send_buffer())[count-1]=0xDEADBEEF;
1584
  ((int*)get_recv_buffer())[count-1]=0x0;
1585

    
1586
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1587
                 get_measurement_comm(), &onesided_win);
1588
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1589
  if (get_measurement_rank() == 0) {
1590
    start_time = start_synchronization();
1591
    MPI_Put(get_send_buffer(), count, MPI_INT, 1,
1592
            0, count, MPI_INT, onesided_win);
1593
    MPI_Recv(&complete,1,MPI_INT,1,0,get_measurement_comm(),&status);
1594
    end_time = stop_synchronization();
1595
  }
1596
  else {
1597
    start_time = start_synchronization();
1598
    while(*lastitem != 0xDEADBEEF)
1599
      wait_for(delay_us);
1600
    MPI_Send((void*)lastitem,1,MPI_INT,0,0,get_measurement_comm());
1601
    end_time = stop_synchronization();
1602
  }
1603
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1604

    
1605
  MPI_Win_free(&onesided_win);
1606

    
1607
  if (get_measurement_rank() == 0)
1608
    return end_time - start_time;
1609
  else
1610
    return -1.0;
1611
}
1612

    
1613
/*---------------------------------------------------------------------------*/
1614

    
1615
void init_Get_Pingpong(int count, MPI_Datatype datatype, MPI_Info info)
1616
{
1617
  onesided_winsize = get_extent(count, datatype);
1618

    
1619
  set_send_buffer_usage(onesided_winsize);
1620
  set_reported_message_size(onesided_winsize);
1621

    
1622
  set_recv_buffer_usage(onesided_winsize);
1623

    
1624
  init_synchronization();
1625
}
1626

    
1627
double measure_Get_Pingpong(int count, MPI_Datatype datatype, MPI_Info info)
1628
{
1629
  double start_time = 1.0, end_time = 0.0;
1630

    
1631
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1632
                 get_measurement_comm(), &onesided_win);
1633

    
1634
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1635
  start_time = start_synchronization();
1636
  if (get_measurement_rank() == 0)
1637
    MPI_Get(get_recv_buffer(), count, datatype, 1,
1638
            0, count, datatype, onesided_win);
1639
  MPI_Win_fence(0, onesided_win);
1640
  if (get_measurement_rank() == 1)
1641
    MPI_Get(get_send_buffer(), count, datatype, 0,
1642
            0, count, datatype, onesided_win);
1643
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1644
  end_time = stop_synchronization();
1645

    
1646
  MPI_Win_free(&onesided_win);
1647

    
1648
  return end_time - start_time;
1649
}
1650

    
1651
/*---------------------------------------------------------------------------*/
1652

    
1653
void init_Get_callduration(int count, MPI_Datatype datatype, MPI_Info info)
1654
{
1655
  onesided_winsize = get_extent(count, datatype);
1656

    
1657
  set_send_buffer_usage(onesided_winsize);
1658
  set_reported_message_size(onesided_winsize);
1659

    
1660
  set_recv_buffer_usage(onesided_winsize);
1661

    
1662
  init_synchronization();
1663
}
1664

    
1665
double measure_Get_callduration(int count, MPI_Datatype datatype, MPI_Info info)
1666
{
1667
  double start_time = 1.0, end_time = 0.0;
1668

    
1669
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1670
                 get_measurement_comm(), &onesided_win);
1671

    
1672
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1673

    
1674
  start_time = start_synchronization();
1675
  if (get_measurement_rank() == 0)
1676
    MPI_Get(get_send_buffer(), count, datatype, 1,
1677
            0, count, datatype, onesided_win);
1678
  end_time = stop_synchronization();
1679

    
1680
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1681

    
1682
  MPI_Win_free(&onesided_win);
1683

    
1684
  if (get_measurement_rank() == 0)
1685
    return end_time - start_time;
1686
  else
1687
    return -1.0;
1688
}
1689

    
1690
/*---------------------------------------------------------------------------*/
1691

    
1692
void init_Get_dedicated(int count, MPI_Datatype datatype, MPI_Info info)
1693
{
1694
  onesided_winsize = get_extent(count, datatype);
1695

    
1696
  set_send_buffer_usage(onesided_winsize);
1697
  set_reported_message_size(onesided_winsize);
1698

    
1699
  set_recv_buffer_usage(onesided_winsize);
1700

    
1701
  init_synchronization();
1702
}
1703

    
1704
double measure_Get_dedicated(int count, MPI_Datatype datatype, MPI_Info info)
1705
{
1706
  double start_time = 1.0, end_time = 0.0;
1707
  MPI_Group reduced_group;
1708

    
1709
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1710
                 get_measurement_comm(), &onesided_win);
1711
  MPI_Win_get_group(onesided_win, &onesided_group);
1712

    
1713
  if (get_measurement_rank() == 0) {
1714
    reduced_group = exclude_all_ranks_except_from_group(1, onesided_group);
1715
    MPI_Win_start(reduced_group, 0, onesided_win);
1716

    
1717
    start_time = start_synchronization();
1718
    MPI_Get(get_send_buffer(), count, datatype, 1,
1719
            0, count, datatype, onesided_win);
1720
    MPI_Win_complete(onesided_win);
1721
    end_time = stop_synchronization();
1722
  }
1723
  else {
1724
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
1725
    MPI_Win_post(reduced_group, 0, onesided_win);
1726
    start_time = start_synchronization();
1727
    MPI_Win_wait(onesided_win);
1728
    end_time = stop_synchronization();
1729
  }
1730

    
1731
  MPI_Win_free(&onesided_win);
1732
  MPI_Group_free(&reduced_group);
1733
  MPI_Group_free(&onesided_group);
1734

    
1735
  return end_time - start_time;
1736
}
1737

    
1738
/*---------------------------------------------------------------------------*/
1739

    
1740
void init_Get_passive(int count, MPI_Datatype datatype, MPI_Info info)
1741
{
1742
  onesided_winsize = get_extent(count, datatype);
1743

    
1744
  set_send_buffer_usage(onesided_winsize);
1745
  set_reported_message_size(onesided_winsize);
1746

    
1747
  set_recv_buffer_usage(onesided_winsize);
1748

    
1749
  init_synchronization();
1750
}
1751

    
1752
double measure_Get_passive(int count, MPI_Datatype datatype, MPI_Info info)
1753
{
1754
  double start_time = 1.0, end_time = 0.0;
1755

    
1756
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1757
                 get_measurement_comm(), &onesided_win);
1758

    
1759
  if (get_measurement_rank() == 0) {
1760
    MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 1, 0, onesided_win);
1761
    start_time = start_synchronization();
1762
    MPI_Get(get_send_buffer(), count, datatype, 1,
1763
            0, count, datatype, onesided_win);
1764
    MPI_Win_unlock(1, onesided_win);
1765
    end_time = stop_synchronization();
1766
  }
1767
  else {
1768
    start_time = start_synchronization();
1769
    end_time = stop_synchronization();
1770
  }
1771

    
1772
  MPI_Win_free(&onesided_win);
1773

    
1774
  if (get_measurement_rank() == 0)
1775
    return end_time - start_time;
1776
  else
1777
    return -1.0;
1778
}
1779

    
1780
/*---------------------------------------------------------------------------*/
1781

    
1782
void init_Get_fence(int count, MPI_Datatype datatype, MPI_Info info)
1783
{
1784
  onesided_winsize = get_extent(count, datatype);
1785

    
1786
  set_send_buffer_usage(onesided_winsize);
1787
  set_reported_message_size(onesided_winsize);
1788

    
1789
  set_recv_buffer_usage(onesided_winsize);
1790

    
1791
  init_synchronization();
1792
}
1793

    
1794
double measure_Get_fence(int count, MPI_Datatype datatype, MPI_Info info)
1795
{
1796
  double start_time = 1.0, end_time = 0.0;
1797

    
1798
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1799
                 get_measurement_comm(), &onesided_win);
1800
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1801
  if (get_measurement_rank() == 0) {
1802
    start_time = start_synchronization();
1803
    MPI_Get(get_send_buffer(), count, datatype, 1,
1804
            0, count, datatype, onesided_win);
1805
    MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1806
    end_time = stop_synchronization();
1807
  }
1808
  else {
1809
    start_time = start_synchronization();
1810
    MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1811
    end_time = stop_synchronization();
1812
  }
1813

    
1814
  MPI_Win_free(&onesided_win);
1815

    
1816
  return end_time - start_time;
1817
}
1818

    
1819
/*---------------------------------------------------------------------------*/
1820

    
1821
void init_Get_activewait(int count, MPI_Info info)
1822
{
1823
  onesided_winsize = get_extent(count, MPI_INT);
1824

    
1825
  set_send_buffer_usage(onesided_winsize);
1826
  set_reported_message_size(onesided_winsize);
1827

    
1828
  set_recv_buffer_usage(onesided_winsize);
1829

    
1830
  init_synchronization();
1831
}
1832

    
1833
double measure_Get_activewait(int count, MPI_Info info)
1834
{
1835
  double start_time = 1.0, end_time = 0.0;
1836
  volatile int* lastitem = &(((int*)get_recv_buffer())[count-1]);
1837

    
1838
  ((int*)get_send_buffer())[count-1]=0xDEADBEEF;
1839
  ((int*)get_recv_buffer())[count-1]=0x0;
1840

    
1841
  MPI_Win_create(get_send_buffer(), onesided_winsize, 1, info,
1842
                 get_measurement_comm(), &onesided_win);
1843
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1844
  if (get_measurement_rank() == 0) {
1845
    start_time = start_synchronization();
1846
    MPI_Get(get_recv_buffer(), count, MPI_INT, 1,
1847
            0, count, MPI_INT, onesided_win);
1848
    while(*lastitem != 0xDEADBEEF)
1849
      ;
1850
    end_time = stop_synchronization();
1851
  }
1852
  else {
1853
    start_time = start_synchronization();
1854
    end_time = stop_synchronization();
1855
  }
1856
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1857

    
1858
  MPI_Win_free(&onesided_win);
1859

    
1860
  if (get_measurement_rank() == 0)
1861
    return end_time - start_time;
1862
  else
1863
    return -1.0;
1864
}
1865

    
1866
void init_Get_activewait_sleep(int count, MPI_Info info, int delay_us)
1867
{
1868
  onesided_winsize = get_extent(count, MPI_INT);
1869

    
1870
  set_send_buffer_usage(onesided_winsize);
1871
  set_reported_message_size(onesided_winsize);
1872

    
1873
  set_recv_buffer_usage(onesided_winsize);
1874

    
1875
  init_synchronization();
1876
}
1877

    
1878
double measure_Get_activewait_sleep(int count, MPI_Info info, int delay_us)
1879
{
1880
  double start_time = 1.0, end_time = 0.0;
1881
  volatile int* lastitem = &(((int*)get_recv_buffer())[count-1]);
1882

    
1883
  ((int*)get_send_buffer())[count-1]=0xDEADBEEF;
1884
  ((int*)get_recv_buffer())[count-1]=0x0;
1885

    
1886
  MPI_Win_create(get_send_buffer(), onesided_winsize, 1, info,
1887
                 get_measurement_comm(), &onesided_win);
1888
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1889
  if (get_measurement_rank() == 0) {
1890
    start_time = start_synchronization();
1891
    MPI_Get(get_recv_buffer(), count, MPI_INT, 1,
1892
            0, count, MPI_INT, onesided_win);
1893
    while(*lastitem != 0xDEADBEEF)
1894
      wait_for(delay_us);
1895
    end_time = stop_synchronization();
1896
  }
1897
  else {
1898
    start_time = start_synchronization();
1899
    end_time = stop_synchronization();
1900
  }
1901
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1902

    
1903
  MPI_Win_free(&onesided_win);
1904

    
1905
  if (get_measurement_rank() == 0)
1906
    return end_time - start_time;
1907
  else
1908
    return -1.0;
1909
}
1910

    
1911
/*---------------------------------------------------------------------------*/
1912

    
1913
void init_Accumulate(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op operation)
1914
{
1915
  onesided_winsize = get_extent(count, datatype);
1916

    
1917
  set_send_buffer_usage(onesided_winsize);
1918
  set_reported_message_size(onesided_winsize);
1919

    
1920
  set_recv_buffer_usage(onesided_winsize);
1921

    
1922
  init_synchronization();
1923
}
1924

    
1925
double measure_Accumulate(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op operation)
1926
{
1927
  double start_time = 1.0, end_time = 0.0;
1928
  MPI_Group reduced_group;
1929

    
1930
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1931
                 get_measurement_comm(), &onesided_win);
1932
  MPI_Win_get_group(onesided_win, &onesided_group);
1933

    
1934
  if (get_measurement_rank() == 0) {
1935
    reduced_group = exclude_all_ranks_except_from_group(1, onesided_group);
1936
    MPI_Win_start(reduced_group, 0, onesided_win);
1937
    start_time = start_synchronization();
1938
    MPI_Accumulate(get_send_buffer(), count, datatype, 1,
1939
            0, count, datatype, operation, onesided_win);
1940
    MPI_Win_complete(onesided_win);
1941
    end_time = stop_synchronization();
1942
  }
1943
  else {
1944
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
1945
    MPI_Win_post(reduced_group, 0, onesided_win);
1946
    start_time = start_synchronization();
1947
    MPI_Win_wait(onesided_win);
1948
    end_time = stop_synchronization();
1949
  }
1950

    
1951
  MPI_Win_free(&onesided_win);
1952
  MPI_Group_free(&reduced_group);
1953
  MPI_Group_free(&onesided_group);
1954

    
1955
  return end_time - start_time;
1956
}
1957

    
1958
void init_Accumulate_activewait_twosided(int count, MPI_Info info)
1959
{
1960
  onesided_winsize = get_extent(count, MPI_INT);
1961

    
1962
  set_send_buffer_usage(onesided_winsize);
1963
  set_reported_message_size(onesided_winsize);
1964

    
1965
  set_recv_buffer_usage(onesided_winsize);
1966

    
1967
  init_synchronization();
1968
}
1969

    
1970
double measure_Accumulate_activewait_twosided(int count, MPI_Info info)
1971
{
1972
  double start_time = 1.0, end_time = 0.0;
1973
  int complete = 0;
1974
  volatile int* lastitem = &(((int*)get_recv_buffer())[count-1]);
1975
  MPI_Status status;
1976

    
1977
  ((int*)get_send_buffer())[count-1]=0xDEADBEEF;
1978
  ((int*)get_recv_buffer())[count-1]=0x0;
1979

    
1980
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
1981
                 get_measurement_comm(), &onesided_win);
1982
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
1983
  if (get_measurement_rank() == 0) {
1984
    start_time = start_synchronization();
1985
    MPI_Accumulate(get_send_buffer(), count, MPI_INT, 1,
1986
            0, count, MPI_INT, MPI_SUM, onesided_win);
1987
    MPI_Recv(&complete,1,MPI_INT,1,0,get_measurement_comm(),&status);
1988
    end_time = stop_synchronization();
1989
  }
1990
  else {
1991
    start_time = start_synchronization();
1992
    while(*lastitem != 0xDEADBEEF)
1993
      ;
1994
    MPI_Send((void*)lastitem,1,MPI_INT,0,0,get_measurement_comm());
1995
    end_time = stop_synchronization();
1996
  }
1997
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
1998

    
1999
  MPI_Win_free(&onesided_win);
2000

    
2001
  if (get_measurement_rank() == 0)
2002
    return end_time - start_time;
2003
  else
2004
    return -1.0;
2005
}
2006

    
2007
/*---------------------------------------------------------------------------*/
2008

    
2009
void init_Accumulate_concurrent(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op operation, int disjoint)
2010
{
2011
  onesided_winsize = get_extent(count, datatype);
2012
  set_reported_message_size(onesided_winsize);
2013

    
2014
  if (onesided_winsize == 0)
2015
    onesided_winsize = 1;
2016

    
2017

    
2018
  set_send_buffer_usage(onesided_winsize);
2019
  if (get_measurement_rank() == 0)
2020
    set_send_buffer_usage(0);
2021

    
2022
  set_recv_buffer_usage(onesided_winsize);
2023

    
2024
  if (get_measurement_rank() == 0) {
2025
    if (disjoint)
2026
      set_recv_buffer_usage((get_measurement_size() - 1) * onesided_winsize);
2027
    else
2028
      set_recv_buffer_usage(onesided_winsize);
2029
  }
2030

    
2031
  init_synchronization();
2032
}
2033

    
2034
double measure_Accumulate_concurrent(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op operation, int disjoint)
2035
{
2036
  double start_time = 1.0, end_time = 0.0;
2037
  int offset = 0, size = onesided_winsize;
2038
  MPI_Group reduced_group;
2039

    
2040
  if (disjoint) {
2041
    offset = get_measurement_rank() - 1;
2042
    size *= get_measurement_size() - 1;
2043
  }
2044

    
2045
  if (get_measurement_rank() == 0)
2046
    MPI_Win_create(get_recv_buffer(), size, onesided_winsize, info,
2047
                   get_measurement_comm(), &onesided_win);
2048
  else
2049
    MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2050
                   get_measurement_comm(), &onesided_win);
2051
  MPI_Win_get_group(onesided_win, &onesided_group);
2052

    
2053
  if (get_measurement_rank() == 0) {
2054
    reduced_group = exclude_rank_from_group(0, onesided_group);
2055
    MPI_Win_post(reduced_group, 0, onesided_win);
2056
    start_time = start_synchronization();
2057
    MPI_Win_wait(onesided_win);
2058
    end_time = stop_synchronization();
2059
  }
2060
  else {
2061
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
2062
    MPI_Win_start(reduced_group, 0, onesided_win);
2063
    start_time = start_synchronization();
2064
    MPI_Accumulate(get_send_buffer(), count, datatype, 0,
2065
                   offset, count, datatype, operation,
2066
                   onesided_win);
2067
    MPI_Win_complete(onesided_win);
2068
    end_time = stop_synchronization();
2069
  }
2070

    
2071
  MPI_Win_free(&onesided_win);
2072
  MPI_Group_free(&reduced_group);
2073
  MPI_Group_free(&onesided_group);
2074

    
2075
  if (get_measurement_rank() == 0)
2076
    return end_time - start_time;
2077
  else
2078
    return -1.0;
2079
}
2080

    
2081
/*---------------------------------------------------------------------------*/
2082

    
2083
void init_Caching(int count, MPI_Datatype datatype, MPI_Info info, int delay_us)
2084
{
2085
  onesided_winsize = get_extent(count, datatype);
2086

    
2087
  set_send_buffer_usage(onesided_winsize);
2088
  set_reported_message_size(onesided_winsize);
2089

    
2090
  set_recv_buffer_usage(onesided_winsize);
2091

    
2092
  init_synchronization();
2093
}
2094

    
2095
double measure_Caching(int count, MPI_Datatype datatype, MPI_Info info, int delay_us)
2096
{
2097
  double start_time = 1.0, end_time = 0.0;
2098
  int rank;
2099

    
2100
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2101
                 get_measurement_comm(), &onesided_win);
2102
  MPI_Win_fence(0, onesided_win);
2103

    
2104
  start_synchronization();
2105
  if (get_measurement_rank() == 0) {
2106
    for(rank = 1; rank < get_measurement_size(); rank++) {
2107
      MPI_Put(get_send_buffer(), count, datatype, rank,
2108
              0, count, datatype, onesided_win);
2109
    }
2110
    wait_for(delay_us);
2111
  }
2112

    
2113
  start_time = MPI_Wtime();
2114
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2115
  end_time = stop_synchronization();
2116
  
2117
  MPI_Win_free(&onesided_win);
2118
  
2119
  if (get_measurement_rank() == 0)
2120
    return end_time - start_time;
2121
  else
2122
    return -1.0;
2123
}
2124

    
2125
/*---------------------------------------------------------------------------*/
2126

    
2127
void init_Combining_Put_fence(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2128
{
2129
  onesided_winsize = get_extent(msg_count*count, datatype);
2130

    
2131
  set_send_buffer_usage(onesided_winsize);
2132
  set_reported_message_size(onesided_winsize);
2133

    
2134
  set_recv_buffer_usage(onesided_winsize);
2135

    
2136
  init_synchronization();
2137
}
2138

    
2139
double measure_Combining_Put_fence(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2140
{
2141
  double start_time = 1.0, end_time = 0.0;
2142
  int i, extent;
2143

    
2144
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2145
                 get_measurement_comm(), &onesided_win);
2146
  MPI_Win_fence(0, onesided_win);
2147

    
2148
  extent = get_extent(count, datatype);
2149

    
2150
  start_synchronization();
2151
  if (get_measurement_rank() == 0) {
2152
    for(i = 0; i < msg_count; i++) {
2153
      MPI_Put((char*)get_send_buffer()+i*extent, count, datatype, 1,
2154
              i*extent, count, datatype, onesided_win);
2155
    }
2156
  }
2157

    
2158
  start_time = MPI_Wtime();
2159
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2160
  end_time = stop_synchronization();
2161
  
2162
  MPI_Win_free(&onesided_win);
2163
  
2164
  return end_time - start_time;
2165
}
2166

    
2167
void init_Combining_Put_dedicated(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2168
{
2169
  onesided_winsize = get_extent(msg_count*count, datatype);
2170

    
2171
  set_send_buffer_usage(onesided_winsize);
2172
  set_reported_message_size(onesided_winsize);
2173

    
2174
  set_recv_buffer_usage(onesided_winsize);
2175

    
2176
  init_synchronization();
2177
}
2178

    
2179
double measure_Combining_Put_dedicated(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2180
{
2181
  double start_time = 1.0, end_time = 0.0;
2182
  int i, extent;
2183

    
2184
  MPI_Group reduced_group;
2185

    
2186
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2187
                 get_measurement_comm(), &onesided_win);
2188
  MPI_Win_get_group(onesided_win, &onesided_group);
2189

    
2190
  extent = get_extent(count, datatype);
2191

    
2192
  if (get_measurement_rank() == 0) {
2193
    reduced_group = exclude_all_ranks_except_from_group(1, onesided_group);
2194
    MPI_Win_start(reduced_group, 0, onesided_win);
2195

    
2196
    start_time = start_synchronization();
2197
    for(i = 0; i < msg_count; i++) {
2198
      MPI_Put((char*)get_send_buffer()+i*extent, count, datatype, 1,
2199
              i*extent, count, datatype, onesided_win);
2200
    }
2201
    MPI_Win_complete(onesided_win);
2202
    end_time = stop_synchronization();
2203
  }
2204
  else {
2205
    reduced_group = exclude_all_ranks_except_from_group(0, onesided_group);
2206
    MPI_Win_post(reduced_group, 0, onesided_win);
2207
    start_time = start_synchronization();
2208
    MPI_Win_wait(onesided_win);
2209
    end_time = stop_synchronization();
2210
  }
2211

    
2212
  MPI_Win_free(&onesided_win);
2213
  MPI_Group_free(&reduced_group);
2214
  MPI_Group_free(&onesided_group);
2215

    
2216
  return end_time - start_time;
2217
}
2218

    
2219
/*---------------------------------------------------------------------------*/
2220

    
2221
MPI_Datatype create_complex_datatype(void)
2222
{
2223
#define COMPLEX_DT_ELEM_COUNT 600
2224
  int blocklens[COMPLEX_DT_ELEM_COUNT];
2225
  MPI_Aint displ[COMPLEX_DT_ELEM_COUNT];
2226
  MPI_Datatype types[COMPLEX_DT_ELEM_COUNT];
2227
  int i;
2228
  MPI_Datatype datatype;
2229

    
2230
  for(i=0;i<COMPLEX_DT_ELEM_COUNT;i++) {
2231
    blocklens[i]=2;
2232
    displ[i]=i*sizeof(int)*2;
2233
    types[i]=MPI_INT;
2234
  }
2235

    
2236
  MPI_Type_struct(COMPLEX_DT_ELEM_COUNT,blocklens,displ,types,&datatype);
2237

    
2238
  return datatype;
2239
}
2240

    
2241
MPI_Datatype create_complex_mixed_datatype(void)
2242
{
2243
#define COMPLEX_DT_MIXED_ELEM_COUNT 200
2244
  int blocklens[2*COMPLEX_DT_MIXED_ELEM_COUNT];
2245
  MPI_Aint displ[2*COMPLEX_DT_MIXED_ELEM_COUNT];
2246
  MPI_Datatype types[2*COMPLEX_DT_MIXED_ELEM_COUNT];
2247
  int i;
2248
  int disp = 0;
2249
  MPI_Datatype datatype;
2250

    
2251
  for(i=0;i<COMPLEX_DT_MIXED_ELEM_COUNT;i++) {
2252
    blocklens[2*i]=2;
2253
    displ[2*i]=disp;
2254
    disp += 2*sizeof(int);
2255
    types[2*i]=MPI_INT;
2256
    blocklens[2*i+1]=2;
2257
    displ[2*i+1]=disp;
2258
    disp += 2*sizeof(double);
2259
    types[2*i+1]=MPI_DOUBLE;
2260
  }
2261

    
2262
  MPI_Type_struct(COMPLEX_DT_MIXED_ELEM_COUNT*2,blocklens,displ,types,&datatype);
2263

    
2264
  return datatype;
2265
}
2266

    
2267
void init_Datatype_complex_everytime(int count, MPI_Info info)
2268
{
2269
  if (get_measurement_rank() == 0) {
2270
    MPI_Datatype datatype;
2271
    datatype = create_complex_datatype();
2272
    onesided_winsize = get_extent(count, datatype);
2273
    MPI_Type_free(&datatype);
2274
  }
2275

    
2276
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2277

    
2278
  set_send_buffer_usage(onesided_winsize);
2279
  set_reported_message_size(onesided_winsize);
2280

    
2281
  set_recv_buffer_usage(onesided_winsize);
2282

    
2283
  init_synchronization();
2284
}
2285

    
2286
double measure_Datatype_complex_everytime(int count, MPI_Info info)
2287
{
2288
  double start_time = 1.0, end_time = 0.0;
2289
  MPI_Datatype datatype;
2290

    
2291
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2292
                 get_measurement_comm(), &onesided_win);
2293
  MPI_Win_fence(0, onesided_win);
2294

    
2295
  if (get_measurement_rank() == 0) {
2296
    datatype = create_complex_datatype();
2297
    MPI_Type_commit(&datatype);
2298
  }
2299

    
2300
  start_time = start_synchronization();
2301
  if (get_measurement_rank() == 0) {
2302
    MPI_Put(get_send_buffer(), count, datatype, 1,
2303
            0, count, datatype, onesided_win);
2304
  }
2305
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2306
  end_time = stop_synchronization();
2307

    
2308
  if (get_measurement_rank() == 0) {
2309
    MPI_Type_free(&datatype);
2310
  }
2311
  MPI_Win_free(&onesided_win);
2312
  
2313
  if (get_measurement_rank() == 0)
2314
    return end_time - start_time;
2315
  else
2316
    return -1.0;
2317
}
2318

    
2319
void init_Datatype_complex_once(int count, MPI_Info info)
2320
{
2321
  if (get_measurement_rank() == 0) {
2322
    onesided_datatype = create_complex_datatype();
2323
    MPI_Type_commit(&onesided_datatype);
2324
    onesided_winsize = get_extent(count, onesided_datatype);
2325
  }
2326

    
2327
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2328

    
2329
  set_send_buffer_usage(onesided_winsize);
2330
  set_reported_message_size(onesided_winsize);
2331

    
2332
  set_recv_buffer_usage(onesided_winsize);
2333

    
2334
  init_synchronization();
2335
}
2336

    
2337
double measure_Datatype_complex_once(int count, MPI_Info info)
2338
{
2339
  double start_time = 1.0, end_time = 0.0;
2340

    
2341
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2342
                 get_measurement_comm(), &onesided_win);
2343
  MPI_Win_fence(0, onesided_win);
2344

    
2345
  start_time = start_synchronization();
2346
  if (get_measurement_rank() == 0) {
2347
    MPI_Put(get_send_buffer(), count, onesided_datatype, 1,
2348
            0, count, onesided_datatype, onesided_win);
2349
  }
2350
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2351
  end_time = stop_synchronization();
2352

    
2353
  MPI_Win_free(&onesided_win);
2354
  
2355
  if (get_measurement_rank() == 0)
2356
    return end_time - start_time;
2357
  else
2358
    return -1.0;
2359
}
2360

    
2361
void finalize_Datatype_complex_once(int count, MPI_Info info)
2362
{
2363
  if (get_measurement_rank() == 0) {
2364
    MPI_Type_free(&onesided_datatype);
2365
  }
2366
}
2367

    
2368
void init_Datatype_complex_mixed_everytime(int count, MPI_Info info)
2369
{
2370
  if (get_measurement_rank() == 0) {
2371
    MPI_Datatype datatype;
2372
    datatype = create_complex_mixed_datatype();
2373
    onesided_winsize = get_extent(count, datatype);
2374
    MPI_Type_free(&datatype);
2375
  }
2376

    
2377
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2378

    
2379
  set_send_buffer_usage(onesided_winsize);
2380
  set_reported_message_size(onesided_winsize);
2381

    
2382
  set_recv_buffer_usage(onesided_winsize);
2383

    
2384
  init_synchronization();
2385
}
2386

    
2387
double measure_Datatype_complex_mixed_everytime(int count, MPI_Info info)
2388
{
2389
  double start_time = 1.0, end_time = 0.0;
2390
  MPI_Datatype datatype;
2391

    
2392
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2393
                 get_measurement_comm(), &onesided_win);
2394
  MPI_Win_fence(0, onesided_win);
2395

    
2396
  if (get_measurement_rank() == 0) {
2397
    datatype = create_complex_mixed_datatype();
2398
    MPI_Type_commit(&datatype);
2399
  }
2400

    
2401
  start_time = start_synchronization();
2402
  if (get_measurement_rank() == 0) {
2403
    MPI_Put(get_send_buffer(), count, datatype, 1,
2404
            0, count, datatype, onesided_win);
2405
  }
2406
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2407
  end_time = stop_synchronization();
2408

    
2409
  if (get_measurement_rank() == 0) {
2410
    MPI_Type_free(&datatype);
2411
  }
2412
  MPI_Win_free(&onesided_win);
2413
  
2414
  if (get_measurement_rank() == 0)
2415
    return end_time - start_time;
2416
  else
2417
    return -1.0;
2418
}
2419

    
2420
void init_Datatype_complex_mixed_once(int count, MPI_Info info)
2421
{
2422
  if (get_measurement_rank() == 0) {
2423
    onesided_datatype = create_complex_mixed_datatype();
2424
    MPI_Type_commit(&onesided_datatype);
2425
    onesided_winsize = get_extent(count, onesided_datatype);
2426
  }
2427

    
2428
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2429

    
2430
  set_send_buffer_usage(onesided_winsize);
2431
  set_reported_message_size(onesided_winsize);
2432

    
2433
  set_recv_buffer_usage(onesided_winsize);
2434

    
2435
  init_synchronization();
2436
}
2437

    
2438
double measure_Datatype_complex_mixed_once(int count, MPI_Info info)
2439
{
2440
  double start_time = 1.0, end_time = 0.0;
2441

    
2442
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2443
                 get_measurement_comm(), &onesided_win);
2444
  MPI_Win_fence(0, onesided_win);
2445

    
2446
  start_time = start_synchronization();
2447
  if (get_measurement_rank() == 0) {
2448
    MPI_Put(get_send_buffer(), count, onesided_datatype, 1,
2449
            0, count, onesided_datatype, onesided_win);
2450
  }
2451
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2452
  end_time = stop_synchronization();
2453

    
2454
  MPI_Win_free(&onesided_win);
2455
  
2456
  if (get_measurement_rank() == 0)
2457
    return end_time - start_time;
2458
  else
2459
    return -1.0;
2460
}
2461

    
2462
void finalize_Datatype_complex_mixed_once(int count, MPI_Info info)
2463
{
2464
  if (get_measurement_rank() == 0) {
2465
    MPI_Type_free(&onesided_datatype);
2466
  }
2467
}
2468

    
2469
void init_Datatype_complex_Get(int count, MPI_Info info)
2470
{
2471
  if (get_measurement_rank() == 0) {
2472
    MPI_Datatype datatype;
2473
    datatype = create_complex_datatype();
2474
    onesided_winsize = get_extent(count, datatype);
2475
    MPI_Type_free(&datatype);
2476
  }
2477

    
2478
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2479

    
2480
  set_send_buffer_usage(onesided_winsize);
2481
  set_reported_message_size(onesided_winsize);
2482

    
2483
  set_recv_buffer_usage(onesided_winsize);
2484

    
2485
  init_synchronization();
2486
}
2487

    
2488
double measure_Datatype_complex_Get(int count, MPI_Info info)
2489
{
2490
  double start_time = 1.0, end_time = 0.0;
2491
  MPI_Datatype datatype;
2492

    
2493
  MPI_Win_create(get_send_buffer(), onesided_winsize, 1, info,
2494
                 get_measurement_comm(), &onesided_win);
2495
  MPI_Win_fence(0, onesided_win);
2496

    
2497
  if (get_measurement_rank() == 0) {
2498
    datatype = create_complex_datatype();
2499
    MPI_Type_commit(&datatype);
2500
  }
2501

    
2502
  start_time = start_synchronization();
2503
  if (get_measurement_rank() == 0) {
2504
    MPI_Get(get_recv_buffer(), count, datatype, 1,
2505
            0, count, datatype, onesided_win);
2506
  }
2507
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2508
  end_time = stop_synchronization();
2509

    
2510
  if (get_measurement_rank() == 0) {
2511
    MPI_Type_free(&datatype);
2512
  }
2513
  MPI_Win_free(&onesided_win);
2514
  
2515
  if (get_measurement_rank() == 0)
2516
    return end_time - start_time;
2517
  else
2518
    return -1.0;
2519
}
2520

    
2521
void init_Datatype_int(int count, MPI_Info info)
2522
{
2523
  onesided_winsize = get_extent(count*2*COMPLEX_DT_ELEM_COUNT, MPI_INT);
2524
    
2525
  set_send_buffer_usage(onesided_winsize);
2526
  set_reported_message_size(onesided_winsize);
2527

    
2528
  set_recv_buffer_usage(onesided_winsize);
2529

    
2530
  init_synchronization();
2531
}
2532

    
2533
double measure_Datatype_int(int count, MPI_Info info)
2534
{
2535
  double start_time = 1.0, end_time = 0.0;
2536

    
2537
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2538
                 get_measurement_comm(), &onesided_win);
2539
  MPI_Win_fence(0, onesided_win);
2540

    
2541
  start_time = start_synchronization();
2542
  if (get_measurement_rank() == 0) {
2543
    MPI_Put(get_send_buffer(), count*2*COMPLEX_DT_ELEM_COUNT, MPI_INT, 1,
2544
            0, count*2*COMPLEX_DT_ELEM_COUNT, MPI_INT, onesided_win);
2545
  }
2546
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2547
  end_time = stop_synchronization();
2548

    
2549
  MPI_Win_free(&onesided_win);
2550
  
2551
  if (get_measurement_rank() == 0)
2552
    return end_time - start_time;
2553
  else
2554
    return -1.0;
2555
}
2556

    
2557
/*---------------------------------------------------------------------------*/
2558

    
2559
MPI_Datatype create_simple_datatype(void)
2560
{
2561
#define SIMPLE_DT_ELEM_COUNT COMPLEX_DT_ELEM_COUNT*2
2562
  MPI_Datatype datatype;
2563

    
2564
  MPI_Type_vector(1, SIMPLE_DT_ELEM_COUNT,0,MPI_INT,&datatype);
2565

    
2566
  return datatype;
2567
}
2568

    
2569
void init_Datatype_simple(int count, MPI_Info info)
2570
{
2571
  if (get_measurement_rank() == 0) {
2572
    MPI_Datatype datatype;
2573
    datatype = create_simple_datatype();
2574
    onesided_winsize = get_extent(count, datatype);
2575
    MPI_Type_free(&datatype);
2576
  }
2577

    
2578
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2579

    
2580
  set_send_buffer_usage(onesided_winsize);
2581
  set_reported_message_size(onesided_winsize);
2582

    
2583
  set_recv_buffer_usage(onesided_winsize);
2584

    
2585
  init_synchronization();
2586
}
2587

    
2588
double measure_Datatype_simple(int count, MPI_Info info)
2589
{
2590
  double start_time = 1.0, end_time = 0.0;
2591
  MPI_Datatype datatype;
2592

    
2593
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2594
                 get_measurement_comm(), &onesided_win);
2595
  MPI_Win_fence(0, onesided_win);
2596

    
2597
  if (get_measurement_rank() == 0) {
2598
    datatype = create_simple_datatype();
2599
    MPI_Type_commit(&datatype);
2600
  }
2601

    
2602
  start_time = start_synchronization();
2603
  if (get_measurement_rank() == 0) {
2604
    MPI_Put(get_send_buffer(), count, datatype, 1,
2605
            0, count, datatype, onesided_win);
2606
  }
2607
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2608
  end_time = stop_synchronization();
2609

    
2610
  if (get_measurement_rank() == 0) {
2611
    MPI_Type_free(&datatype);
2612
  }
2613
  MPI_Win_free(&onesided_win);
2614
  
2615
  if (get_measurement_rank() == 0)
2616
    return end_time - start_time;
2617
  else
2618
    return -1.0;
2619
}
2620

    
2621
void init_Datatype_simple_Get(int count, MPI_Info info)
2622
{
2623
  if (get_measurement_rank() == 0) {
2624
    MPI_Datatype datatype;
2625
    datatype = create_simple_datatype();
2626
    onesided_winsize = get_extent(count, datatype);
2627
    MPI_Type_free(&datatype);
2628
  }
2629

    
2630
  MPI_Bcast(&onesided_winsize, 1, MPI_INT, 0, get_measurement_comm());
2631

    
2632
  set_send_buffer_usage(onesided_winsize);
2633
  set_reported_message_size(onesided_winsize);
2634

    
2635
  set_recv_buffer_usage(onesided_winsize);
2636

    
2637
  init_synchronization();
2638
}
2639

    
2640
double measure_Datatype_simple_Get(int count, MPI_Info info)
2641
{
2642
  double start_time = 1.0, end_time = 0.0;
2643
  MPI_Datatype datatype;
2644

    
2645
  MPI_Win_create(get_send_buffer(), onesided_winsize, 1, info,
2646
                 get_measurement_comm(), &onesided_win);
2647
  MPI_Win_fence(0, onesided_win);
2648

    
2649
  if (get_measurement_rank() == 0) {
2650
    datatype = create_simple_datatype();
2651
    MPI_Type_commit(&datatype);
2652
  }
2653

    
2654
  start_time = start_synchronization();
2655
  if (get_measurement_rank() == 0) {
2656
    MPI_Get(get_recv_buffer(), count, datatype, 1,
2657
            0, count, datatype, onesided_win);
2658
  }
2659
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2660
  end_time = stop_synchronization();
2661

    
2662
  if (get_measurement_rank() == 0) {
2663
    MPI_Type_free(&datatype);
2664
  }
2665
  MPI_Win_free(&onesided_win);
2666
  
2667
  if (get_measurement_rank() == 0)
2668
    return end_time - start_time;
2669
  else
2670
    return -1.0;
2671
}
2672

    
2673
/*---------------------------------------------------------------------------*/
2674
/* Additional measurements                                                   */
2675
/*---------------------------------------------------------------------------*/
2676

    
2677
void init_Put_Shift(int count, MPI_Datatype datatype, MPI_Info info, int distance)
2678
{
2679
  onesided_winsize = get_extent(count, datatype);
2680

    
2681
  set_send_buffer_usage(onesided_winsize);
2682
  set_reported_message_size(onesided_winsize);
2683

    
2684
  set_recv_buffer_usage(onesided_winsize);
2685

    
2686
  init_synchronization();
2687
}
2688

    
2689
double measure_Put_Shift(int count, MPI_Datatype datatype, MPI_Info info, int distance)
2690
{
2691
  double start_time = 1.0, end_time = 0.0;
2692
  int rank = get_measurement_rank();
2693
  int size = get_measurement_size();
2694
  int dstrank = (rank+size+distance)%size;
2695

    
2696
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2697
                 get_measurement_comm(), &onesided_win);
2698

    
2699
  start_time = start_synchronization();
2700
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
2701
  MPI_Put(get_send_buffer(), count, datatype, dstrank,
2702
          0, count, datatype, onesided_win);
2703
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2704
  end_time = stop_synchronization();
2705

    
2706
  MPI_Win_free(&onesided_win);
2707
  
2708
  return end_time - start_time;
2709
}
2710

    
2711
/*---------------------------------------------------------------------------*/
2712

    
2713
void init_Exchange(int count, MPI_Datatype datatype, int msg_count)
2714
{
2715
  onesided_winsize = get_extent(count*msg_count, datatype);
2716

    
2717
  set_send_buffer_usage(get_extent(count, datatype));
2718
  set_reported_message_size(onesided_winsize);
2719

    
2720
  set_recv_buffer_usage(onesided_winsize);
2721

    
2722
  init_synchronization();
2723
}
2724

    
2725
double measure_Exchange(int count, MPI_Datatype datatype, int msg_count)
2726
{
2727
  double start_time = 1.0, end_time = 0.0;
2728
  int rank = get_measurement_rank();
2729
  int size = get_measurement_size();
2730
  int dstrank = rank, srcrank = rank;
2731
  int extent = get_extent(count, datatype);
2732
  int displacement, msg;
2733
  MPI_Request *rreq, *sreq;
2734

    
2735
  rreq = skampi_malloc_reqs(msg_count);
2736
  sreq = skampi_malloc_reqs(msg_count);
2737
  start_time = start_synchronization();
2738
  for(msg=0; msg < msg_count; msg++)
2739
    {
2740
      displacement = msg*extent;
2741
      srcrank = (srcrank-1+size)%size;
2742
      MPI_Irecv((char*)get_recv_buffer()+displacement, count, datatype,
2743
                srcrank, 0, get_measurement_comm(), &rreq[msg]);
2744
      dstrank = (dstrank+1)%size;
2745
      MPI_Isend(get_send_buffer(), count, datatype,
2746
                dstrank, 0, get_measurement_comm(), &sreq[msg]);
2747
    }
2748
  MPI_Waitall(msg_count, rreq, MPI_STATUSES_IGNORE);
2749
  MPI_Waitall(msg_count, sreq, MPI_STATUSES_IGNORE);
2750
  end_time = stop_synchronization();
2751

    
2752
  free(rreq);
2753
  free(sreq);
2754
  
2755
  return end_time - start_time;
2756
}
2757

    
2758
/*---------------------------------------------------------------------------*/
2759

    
2760
void init_Put_Exchange(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2761
{
2762
  onesided_winsize = get_extent(count*msg_count, datatype);
2763

    
2764
  set_send_buffer_usage(get_extent(count, datatype));
2765
  set_reported_message_size(onesided_winsize);
2766

    
2767
  set_recv_buffer_usage(onesided_winsize);
2768

    
2769
  init_synchronization();
2770
}
2771

    
2772
double measure_Put_Exchange(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2773
{
2774
  double start_time = 1.0, end_time = 0.0;
2775
  int rank = get_measurement_rank();
2776
  int size = get_measurement_size();
2777
  int dstrank = rank;
2778
  int extent = get_extent(count, datatype);
2779
  int displacement, msg;
2780

    
2781
  MPI_Win_create(get_send_buffer(), onesided_winsize, 1, info,
2782
                 get_measurement_comm(), &onesided_win);
2783

    
2784
  start_time = start_synchronization();
2785
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
2786
  for(msg=0; msg < msg_count; msg++)
2787
    {
2788
      displacement = msg*extent;
2789
      dstrank = (dstrank+1)%size;
2790
      MPI_Put(get_send_buffer(), count, datatype, dstrank,
2791
              displacement, count, datatype, onesided_win);
2792
    }
2793
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2794
  end_time = stop_synchronization();
2795

    
2796
  MPI_Win_free(&onesided_win);
2797
  
2798
  return end_time - start_time;
2799
}
2800

    
2801
/*---------------------------------------------------------------------------*/
2802

    
2803
void init_Put_Exchange_passive(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2804
{
2805
  onesided_winsize = get_extent(count*msg_count, datatype);
2806

    
2807
  set_send_buffer_usage(get_extent(count, datatype));
2808
  set_reported_message_size(onesided_winsize);
2809

    
2810
  set_recv_buffer_usage(onesided_winsize);
2811

    
2812
  init_synchronization();
2813
}
2814

    
2815
double measure_Put_Exchange_passive(int count, MPI_Datatype datatype, MPI_Info info, int msg_count)
2816
{
2817
  double start_time = 1.0, end_time = 0.0;
2818
  int rank = get_measurement_rank();
2819
  int size = get_measurement_size();
2820
  int dstrank = rank;
2821
  int extent = get_extent(count, datatype);
2822
  int displacement, msg;
2823

    
2824
  MPI_Win_create(get_send_buffer(), onesided_winsize, 1, info,
2825
                 get_measurement_comm(), &onesided_win);
2826

    
2827
  start_time = start_synchronization();
2828
  for(msg=0; msg < msg_count; msg++)
2829
    {
2830
      displacement = msg*extent;
2831
      dstrank = (dstrank+1)%size;
2832
      MPI_Win_lock(MPI_LOCK_SHARED, dstrank, 0, onesided_win);
2833
      MPI_Put(get_send_buffer(), count, datatype, dstrank,
2834
              displacement, count, datatype, onesided_win);
2835
      MPI_Win_unlock(dstrank, onesided_win);
2836
    }
2837
  end_time = stop_synchronization();
2838

    
2839
  MPI_Win_free(&onesided_win);
2840
  
2841
  return end_time - start_time;
2842
}
2843

    
2844
/*---------------------------------------------------------------------------*/
2845

    
2846
void init_Accumulate_concurrent_multi(int count, MPI_Datatype datatype, MPI_Info info, int msg_count, MPI_Op operator, int disjoint)
2847
{
2848
  if(disjoint)
2849
    onesided_winsize = get_extent(count*msg_count, datatype);
2850
  else
2851
    onesided_winsize = get_extent(count, datatype);
2852

    
2853
  set_send_buffer_usage(onesided_winsize);
2854
  set_reported_message_size(get_extent(count*msg_count, datatype));
2855

    
2856
  set_recv_buffer_usage(onesided_winsize);
2857

    
2858
  init_synchronization();
2859
}
2860

    
2861
double measure_Accumulate_concurrent_multi(int count, MPI_Datatype datatype, MPI_Info info, int msg_count, MPI_Op operator, int disjoint)
2862
{
2863
  double start_time = 1.0, end_time = 0.0;
2864
  int rank = get_measurement_rank();
2865
  int size = get_measurement_size();
2866
  int dstrank = rank;
2867
  int extent = get_extent(count, datatype);
2868
  int displacement, msg;
2869

    
2870
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2871
                 get_measurement_comm(), &onesided_win);
2872

    
2873
  start_time = start_synchronization();
2874
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
2875
  for(msg=0; msg < msg_count; msg++)
2876
    {
2877
      if (disjoint)
2878
        displacement = msg*extent;
2879
      else
2880
        displacement = 0;
2881
      dstrank = (dstrank+1)%size;
2882
      MPI_Accumulate(get_send_buffer(), count, datatype, dstrank,
2883
              displacement, count, datatype, operator, onesided_win);
2884
    }
2885
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2886
  end_time = stop_synchronization();
2887

    
2888
  MPI_Win_free(&onesided_win);
2889
  
2890
  return end_time - start_time;
2891
}
2892

    
2893
/*---------------------------------------------------------------------------*/
2894

    
2895
void init_onesided_bcast(int count, MPI_Datatype datatype, MPI_Info info, int bcast_count)
2896
{
2897
  onesided_winsize = get_extent(bcast_count * count, datatype);
2898

    
2899
  set_send_buffer_usage(get_extent(count, datatype));
2900
  set_reported_message_size(onesided_winsize);
2901

    
2902
  set_recv_buffer_usage(onesided_winsize);
2903

    
2904
  init_synchronization();
2905
}
2906

    
2907
double measure_onesided_bcast(int count, MPI_Datatype datatype, MPI_Info info, int bcast_count)
2908
{
2909
  double start_time = 1.0, end_time = 0.0;
2910
  int rank = get_measurement_rank();
2911
  int size = get_measurement_size();
2912
  int i,dstrank=rank;
2913
  int j;
2914
  MPI_Win_create(get_recv_buffer(), onesided_winsize,
2915
                 get_extent(count, datatype), info,
2916
                 get_measurement_comm(), &onesided_win);
2917

    
2918
  start_time = start_synchronization();
2919
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
2920
  if (get_measurement_rank()==0)
2921
    {
2922
      for(j=0; j < bcast_count; j++)
2923
        for(i=0; i <= size; i++)
2924
          {
2925
            dstrank = (dstrank+1)%size;
2926
            MPI_Put(get_send_buffer(), count, datatype, dstrank,
2927
                    j, count, datatype, onesided_win);
2928
          }
2929
    }
2930
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2931
  end_time = stop_synchronization();
2932

    
2933
  MPI_Win_free(&onesided_win);
2934
  
2935
  if (get_measurement_rank() == 0)
2936
    return end_time - start_time;
2937
  else
2938
    return -1.0;
2939
}
2940

    
2941
/*---------------------------------------------------------------------------*/
2942

    
2943
void init_onesided_alltoall(int count, MPI_Datatype datatype, MPI_Info info, int alltoall_count)
2944
{
2945
  int size = get_measurement_size();
2946
  onesided_winsize = get_extent(count*size, datatype);
2947

    
2948
  set_send_buffer_usage(onesided_winsize);
2949

    
2950
  onesided_winsize = get_extent(count*size*alltoall_count, datatype);
2951
  set_reported_message_size(onesided_winsize);
2952

    
2953
  set_recv_buffer_usage(onesided_winsize);
2954

    
2955
  init_synchronization();
2956
}
2957

    
2958
double measure_onesided_alltoall(int count, MPI_Datatype datatype, MPI_Info info, int alltoall_count)
2959
{
2960
  double start_time = 1.0, end_time = 0.0;
2961
  int rank = get_measurement_rank();
2962
  int size = get_measurement_size();
2963
  int i,j,offset,dstrank=rank;
2964
  int msgsize = get_extent(count, datatype);
2965

    
2966
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
2967
                 get_measurement_comm(), &onesided_win);
2968

    
2969
  start_time = start_synchronization();
2970
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
2971
  for(j=0; j < alltoall_count; j++) {
2972
    offset = j * size * msgsize;
2973
    for(i=0; i <= size; i++)
2974
      {
2975
        dstrank = (dstrank+1)%size;
2976
        MPI_Put((char*)get_send_buffer()+(msgsize*dstrank), count, datatype,
2977
                dstrank, offset+rank*msgsize, count, datatype, onesided_win);
2978
      }
2979
  }
2980
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
2981
  end_time = stop_synchronization();
2982

    
2983
  MPI_Win_free(&onesided_win);
2984
  
2985
  return end_time - start_time;
2986
}
2987

    
2988
void init_multi_Alltoall(int send_count, MPI_Datatype send_dt, int recv_count, MPI_Datatype recv_dt, int alltoall_count)
2989
{
2990
  set_send_buffer_usage(get_measurement_size()*get_extent(send_count, send_dt));
2991
  set_recv_buffer_usage(get_measurement_size()*get_extent(recv_count, recv_dt)*alltoall_count);
2992
  set_reported_message_size(get_extent(send_count, send_dt)*alltoall_count);
2993
  init_synchronization();
2994
}
2995

    
2996
double measure_multi_Alltoall(int send_count, MPI_Datatype send_dt, int recv_count, MPI_Datatype recv_dt, int alltoall_count)
2997
{
2998
  double start_time, end_time;
2999
  int j, offset;
3000

    
3001
  start_time = start_synchronization();
3002
  for(j = 0 ; j < alltoall_count; j++) {
3003
    offset = j * get_measurement_size()*get_extent(recv_count, recv_dt);
3004
    MPI_Alltoall(get_send_buffer(), send_count, send_dt,
3005
                 (char*)get_recv_buffer()+offset, recv_count, recv_dt, get_measurement_comm());
3006
  }
3007
  end_time = stop_synchronization();
3008
  return end_time - start_time;
3009
}
3010

    
3011
/*---------------------------------------------------------------------------*/
3012

    
3013
void init_onesided_reduce(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op op)
3014
{
3015
  onesided_winsize = get_extent(count, datatype);
3016
  set_send_buffer_usage(onesided_winsize);
3017
  set_reported_message_size(onesided_winsize);
3018
  set_recv_buffer_usage(onesided_winsize);
3019

    
3020
  init_synchronization();
3021
}
3022

    
3023
double measure_onesided_reduce(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op op)
3024
{
3025
  double start_time = 1.0, end_time = 0.0;
3026

    
3027
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
3028
                 get_measurement_comm(), &onesided_win);
3029

    
3030
  start_time = start_synchronization();
3031
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
3032
  MPI_Accumulate(get_send_buffer(), count, datatype, 0,
3033
                0, count, datatype, op, onesided_win);
3034
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
3035
  end_time = stop_synchronization();
3036

    
3037
  MPI_Win_free(&onesided_win);
3038
  
3039
  return end_time - start_time;
3040
}
3041

    
3042
void init_onesided_allreduce(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op op)
3043
{
3044
  onesided_winsize = get_extent(count, datatype);
3045
  set_send_buffer_usage(onesided_winsize);
3046
  set_reported_message_size(onesided_winsize);
3047
  set_recv_buffer_usage(onesided_winsize);
3048

    
3049
  init_synchronization();
3050
}
3051

    
3052
double measure_onesided_allreduce(int count, MPI_Datatype datatype, MPI_Info info, MPI_Op op)
3053
{
3054
  double start_time = 1.0, end_time = 0.0;
3055
  int i, dest;
3056

    
3057
  MPI_Win_create(get_recv_buffer(), onesided_winsize, 1, info,
3058
                 get_measurement_comm(), &onesided_win);
3059

    
3060
  start_time = start_synchronization();
3061
  MPI_Win_fence(MPI_MODE_NOPRECEDE, onesided_win);
3062
  for(i = 1; i <= get_measurement_size(); i++) {
3063
    dest = (get_measurement_rank() + i) % get_measurement_size();
3064
    MPI_Accumulate(get_send_buffer(), count, datatype, dest,
3065
                   0, count, datatype, op, onesided_win);
3066
  }
3067
  MPI_Win_fence(MPI_MODE_NOSUCCEED, onesided_win);
3068
  end_time = stop_synchronization();
3069

    
3070
  MPI_Win_free(&onesided_win);
3071
  
3072
  return end_time - start_time;
3073
}
3074

    
3075
/*---------------------------------------------------------------------------*/
3076

    
3077
static MPI_Win to_win, from_win;
3078
static double *to_buffer, *from_buffer;
3079
static int border_rows, border_cols;
3080
static double t_wait, t_work, t_start;
3081
#if TIMINGDETAILS
3082
static FILE* timingFile;
3083
#endif
3084

    
3085
void init_onesided_borderexchange(int elemcount, MPI_Info info, int iteration_count, int compute)
3086
{
3087
  int bufsize;
3088
  MPI_Group group;
3089
  int size,rank, ranks[2];
3090
  int rankcount;
3091
#if TIMINGDETAILS
3092
  char timingfname[32];
3093
#endif
3094

    
3095
  border_rows = sqrt(elemcount/2);
3096
  border_cols = 2*border_rows;
3097
  bufsize = (2+border_rows)*border_cols*sizeof(double);
3098

    
3099
  /* 2 buffers: old state, new state */
3100
  onesided_winsize = bufsize;
3101
  set_recv_buffer_usage(onesided_winsize);
3102
  set_send_buffer_usage(onesided_winsize);
3103

    
3104
  /* number of bytes each proc sends */
3105
  set_reported_message_size(2*border_cols*sizeof(double));
3106

    
3107
  rank = get_measurement_rank();
3108
  size = get_measurement_size();
3109
  ranks[0]=(rank+1)%size;
3110
  ranks[1]=(rank+size-1)%size;
3111
  rankcount = 2;
3112
  if (ranks[0]==ranks[1])
3113
    rankcount=1;
3114
  MPI_Comm_group(get_measurement_comm(), &group);
3115
  MPI_Group_incl(group,rankcount,ranks,&onesided_group);
3116
  MPI_Group_free(&group);
3117

    
3118
#if TIMINGDETAILS
3119
  Snprintf(timingfname, 32, "border_onesided_rank%d", get_measurement_rank());
3120
  timingFile = fopen(timingfname,"a");
3121
  fprintf(timingFile, "onesided elemcount:%d\n", elemcount);
3122
#endif
3123
  init_synchronization();
3124
}
3125

    
3126

    
3127
void onesided_exchange_border_cells(void)
3128
{
3129
  double start;
3130
  /* send cells to upper and lower neighbours */
3131
  double* first_row = &to_buffer[                0 * border_cols];
3132
  double* last_row =  &to_buffer[(border_rows + 1) * border_cols];
3133
  int first_row_displacement =          1 * border_cols;
3134
  int last_row_displacement = border_rows * border_cols;
3135
  int rank = get_measurement_rank();
3136
  int size = get_measurement_size();
3137
  int next_rank=(rank+1)%size;
3138
  int prev_rank=(rank+size-1)%size;
3139

    
3140
  start = MPI_Wtime();
3141
  MPI_Win_post(onesided_group, MPI_MODE_NOPUT, to_win);
3142
  MPI_Win_start(onesided_group, 0, to_win);
3143

    
3144
  MPI_Get(first_row, border_cols, MPI_DOUBLE,
3145
          prev_rank, last_row_displacement,
3146
          border_cols, MPI_DOUBLE, to_win);
3147
  MPI_Get(last_row, border_cols, MPI_DOUBLE,
3148
          next_rank, first_row_displacement,
3149
          border_cols, MPI_DOUBLE, to_win);
3150

    
3151
  t_start += MPI_Wtime() - start;
3152
}
3153

    
3154

    
3155
void onesided_wait_for_border_cell_arrival(void)
3156
{
3157
  double start = MPI_Wtime();
3158
  /* wait until data has arrived */
3159
  MPI_Win_complete(from_win);
3160
  MPI_Win_wait(from_win);
3161
  t_wait += MPI_Wtime() - start;
3162
}
3163

    
3164
void onesided_exchange_buffers(void)
3165
{
3166
  MPI_Win temp_win;
3167
  double* temp_buffer;
3168

    
3169
  temp_buffer = to_buffer;
3170
  to_buffer = from_buffer;
3171
  from_buffer = temp_buffer;
3172

    
3173
  temp_win = to_win;
3174
  to_win = from_win;
3175
  from_win = temp_win;
3176
}
3177

    
3178
void simulate_outer_cells(int compute)
3179
{
3180
  double start = MPI_Wtime();
3181
  /* simulate buffer lines 1 and N */
3182
  if (compute) {
3183
    int j;
3184
    for(j=0; j < border_cols; j++) {
3185
      to_buffer[1*border_cols+j]=(
3186
        from_buffer[0*border_cols+j]+
3187
        from_buffer[1*border_cols+j]+
3188
        from_buffer[2*border_cols+j])/3;
3189
      to_buffer[border_rows*border_cols+j]=(
3190
        from_buffer[(border_rows-1)*border_cols+j]+
3191
        from_buffer[(border_rows  )*border_cols+j]+
3192
        from_buffer[(border_rows+1)*border_cols+j])/3;
3193
    } 
3194
  }
3195
  t_work += MPI_Wtime() - start;
3196
}
3197

    
3198
void simulate_inner_cells(int compute)
3199
{
3200
  double start = MPI_Wtime();
3201
  /* simulate buffer lines 2 to N-1 */
3202
  if (compute) {
3203
    int i,j;
3204

    
3205
    for(i=2; i < border_rows; i++)
3206
      for(j=0; j < border_cols; j++)
3207
        to_buffer[i*border_cols+j]=(
3208
          from_buffer[(i-1)*border_cols+j]+
3209
          from_buffer[(i  )*border_cols+j]+
3210
          from_buffer[(i+1)*border_cols+j])/3;
3211
  }
3212
  t_work += MPI_Wtime() - start;
3213
}
3214

    
3215

    
3216
double measure_onesided_borderexchange(int count, MPI_Info info, int iteration_count, int compute)
3217
{
3218
  double start_time = 1.0, end_time = 0.0;
3219
  int iteration;
3220

    
3221
  from_buffer = (double*) get_send_buffer();
3222
  to_buffer = (double*) get_recv_buffer();
3223
  MPI_Win_create(from_buffer, onesided_winsize, sizeof(double), info,
3224
                 get_measurement_comm(), &from_win);
3225
  MPI_Win_create(to_buffer, onesided_winsize, sizeof(double), info,
3226
                 get_measurement_comm(), &to_win);
3227

    
3228
  t_start = t_wait = t_work = 0;
3229
  start_time = start_synchronization();
3230

    
3231
  if (border_rows >= 3 && border_cols > 1)
3232
    {
3233
      onesided_exchange_buffers();
3234
      onesided_exchange_border_cells();
3235
      onesided_exchange_buffers();
3236
      for(iteration = 0; iteration < iteration_count; iteration++)
3237
        {
3238
          onesided_wait_for_border_cell_arrival();
3239
          simulate_outer_cells(compute);
3240
          onesided_exchange_border_cells();
3241
          simulate_inner_cells(compute);
3242
          onesided_exchange_buffers();
3243
        }
3244
      onesided_wait_for_border_cell_arrival();
3245
      simulate_outer_cells(compute);
3246
      simulate_inner_cells(compute);
3247
    }
3248

    
3249
  end_time = stop_synchronization();
3250

    
3251
#if TIMINGDETAILS
3252
  fprintf(timingFile, "total: %7f start: %7f work: %7f wait: %7f\n", end_time-start_time, t_start, t_work, t_wait);
3253
  fflush(timingFile);
3254
#endif
3255
  MPI_Win_free(&to_win);
3256
  MPI_Win_free(&from_win);
3257
  
3258
  return end_time - start_time;
3259
}
3260

    
3261

    
3262
void finalize_onesided_borderexchange(int elemcount, MPI_Info info, int iteration_count, int compute)
3263
{
3264
#if TIMINGDETAILS
3265
  fclose(timingFile);
3266
#endif
3267
  MPI_Group_free(&onesided_group);
3268
}
3269

    
3270
/*---------------------------------------------------------------------------*/
3271

    
3272
static MPI_Request twosided_requests[4];
3273
char* sendbuf1,*sendbuf2;
3274

    
3275
void init_twosided_borderexchange(int elemcount, int iteration_count, int compute)
3276
{
3277
  int bufsize;
3278
#if TIMINGDETAILS
3279
  char timingfname[32];
3280
#endif  
3281
  border_rows = sqrt(elemcount/2);
3282
  border_cols = 2*border_rows;
3283
  bufsize = (4+border_rows)*border_cols*sizeof(double);
3284

    
3285
  /* 2 buffers: old state, new state */
3286
  onesided_winsize = bufsize;
3287
  set_recv_buffer_usage(onesided_winsize);
3288
  set_send_buffer_usage(onesided_winsize);
3289

    
3290
  /* number of bytes each proc sends */
3291
  set_reported_message_size(2*border_cols*sizeof(double));
3292

    
3293
#if TIMINGDETAILS
3294
  snprintf(timingfname, 32, "border_twosided_rank%d", get_measurement_rank());
3295
  timingFile = fopen(timingfname,"a");
3296
  fprintf(timingFile, "onesided elemcount:%d\n", elemcount);
3297
#endif
3298

    
3299
  init_synchronization();
3300
}
3301

    
3302
void twosided_exchange_border_cells(void)
3303
{
3304
  double start;
3305

    
3306
  /* send cells to upper and lower neighbours */
3307
  double* first_row = &to_buffer[                0 * border_cols];
3308
  double* last_row =  &to_buffer[(border_rows + 1) * border_cols];
3309
  double* first_row_displacement = &to_buffer[1 * border_cols];
3310
  double* last_row_displacement = &to_buffer[border_rows * border_cols];
3311
  int rank = get_measurement_rank();
3312
  int size = get_measurement_size();
3313
  int next_rank=(rank+1)%size;
3314
  int prev_rank=(rank+size-1)%size;
3315

    
3316
  start = MPI_Wtime();
3317
  memcpy(sendbuf1, first_row_displacement, border_cols*sizeof(double));
3318
  memcpy(sendbuf2, last_row_displacement, border_cols*sizeof(double));
3319
  MPI_Irecv(first_row, border_cols, MPI_DOUBLE,
3320
            prev_rank, 0, get_measurement_comm(),
3321
            &twosided_requests[0]);
3322
  MPI_Irecv(last_row, border_cols, MPI_DOUBLE,
3323
            next_rank, 1, get_measurement_comm(),
3324
            &twosided_requests[1]);
3325
  MPI_Isend(sendbuf1, border_cols, MPI_DOUBLE,
3326
            prev_rank, 1, get_measurement_comm(), 
3327
            &twosided_requests[2]);
3328
  MPI_Isend(sendbuf2, border_cols, MPI_DOUBLE,
3329
            next_rank, 0, get_measurement_comm(),
3330
            &twosided_requests[3]);
3331
  t_start += MPI_Wtime() - start;
3332
}
3333

    
3334
void twosided_wait_for_border_cell_arrival(void)
3335
{
3336
  double start = MPI_Wtime();
3337
  /* wait until data has arrived */
3338
  MPI_Waitall(4, twosided_requests, MPI_STATUSES_IGNORE);
3339
  t_wait += MPI_Wtime() - start;
3340
}
3341

    
3342
void twosided_exchange_buffers(void)
3343
{
3344
  double* temp_buffer;
3345

    
3346
  temp_buffer = to_buffer;
3347
  to_buffer = from_buffer;
3348
  from_buffer = temp_buffer;
3349
}
3350

    
3351
double measure_twosided_borderexchange(int count, int iteration_count, int compute)
3352
{
3353
  double start_time = 1.0, end_time = 0.0;
3354
  int iteration;
3355

    
3356
  from_buffer = (double*) get_send_buffer();
3357
  to_buffer = (double*) get_recv_buffer();
3358
  sendbuf1 = (char*) get_send_buffer() + (2+border_rows)*border_cols*sizeof(double);
3359
  sendbuf2 = (char*) get_send_buffer() + (3+border_rows)*border_cols*sizeof(double);
3360

    
3361
  t_start = t_wait = t_work = 0;
3362
  start_time = start_synchronization();
3363
  
3364
  if (border_rows >= 3 && border_cols > 1)
3365
    {
3366
      twosided_exchange_buffers();
3367
      twosided_exchange_border_cells();
3368
      twosided_exchange_buffers();
3369
      for(iteration = 0; iteration < iteration_count; iteration++)
3370
        {
3371
          twosided_wait_for_border_cell_arrival();
3372
          simulate_outer_cells(compute);
3373
          twosided_exchange_border_cells();
3374
          simulate_inner_cells(compute);
3375
          twosided_exchange_buffers();
3376
        }
3377
      twosided_wait_for_border_cell_arrival();
3378
      simulate_outer_cells(compute);
3379
      simulate_inner_cells(compute);
3380
    }
3381

    
3382
  end_time = stop_synchronization();
3383

    
3384
#if TIMINGDETAILS
3385
  fprintf(timingFile, "total: %7f start: %7f work: %7f wait: %7f\n", end_time-start_time, t_start, t_work, t_wait);
3386
  fflush(timingFile);
3387
#endif  
3388
  return end_time - start_time;
3389
}
3390

    
3391
void finalize_twosided_borderexchange(int count, int iteration_count, int compute)
3392
{
3393
#if TIMINGDETAILS
3394
  fclose(timingFile);
3395
#endif
3396
}
3397

    
3398
/*---------------------------------------------------------------------------*/
3399

    
3400
void init_onesided_borderexchange_fence(int elemcount, MPI_Info info, int iteration_count, int compute)
3401
{
3402
  int bufsize;
3403

    
3404
  border_rows = sqrt(elemcount/2);
3405
  border_cols = 2*border_rows;
3406
  bufsize = (2+border_rows)*border_cols*sizeof(double);
3407

    
3408
  /* 2 buffers: old state, new state */
3409
  onesided_winsize = bufsize;
3410
  set_recv_buffer_usage(onesided_winsize);
3411
  set_send_buffer_usage(onesided_winsize);
3412

    
3413
  /* number of bytes each proc sends */
3414
  set_reported_message_size(2*border_cols*sizeof(double));
3415

    
3416
  init_synchronization();
3417
}
3418

    
3419
void onesided_exchange_border_cells_fence(void)
3420
{
3421
  /* send cells to upper and lower neighbours */
3422
  double* first_row = &to_buffer[                0 * border_cols];
3423
  double* last_row =  &to_buffer[(border_rows + 1) * border_cols];
3424
  int first_row_displacement =          1 * border_cols;
3425
  int last_row_displacement = border_rows * border_cols;
3426
  int rank = get_measurement_rank();
3427
  int size = get_measurement_size();
3428
  int next_rank=(rank+1)%size;
3429
  int prev_rank=(rank+size-1)%size;
3430

    
3431
  MPI_Win_fence(0, to_win);
3432

    
3433
  MPI_Get(first_row, border_cols, MPI_DOUBLE,
3434
          prev_rank, last_row_displacement,
3435
          border_cols, MPI_DOUBLE, to_win);
3436
  MPI_Get(last_row, border_cols, MPI_DOUBLE,
3437
          next_rank, first_row_displacement,
3438
          border_cols, MPI_DOUBLE, to_win);
3439
}
3440

    
3441
void onesided_wait_for_border_cell_arrival_fence(void)
3442
{
3443
  /* wait until data has arrived */
3444
  MPI_Win_fence(0, from_win);
3445
}
3446

    
3447
double measure_onesided_borderexchange_fence(int count, MPI_Info info, int iteration_count, int compute)
3448
{
3449
  double start_time = 1.0, end_time = 0.0;
3450
  int iteration;
3451

    
3452
  from_buffer = (double*) get_send_buffer();
3453
  to_buffer = (double*) get_recv_buffer();
3454
  MPI_Win_create(from_buffer, onesided_winsize, sizeof(double), info,
3455
                 get_measurement_comm(), &from_win);
3456
  MPI_Win_create(to_buffer, onesided_winsize, sizeof(double), info,
3457
                 get_measurement_comm(), &to_win);
3458

    
3459
  start_time = start_synchronization();
3460

    
3461
  if (border_rows >= 3 && border_cols > 1)
3462
    {
3463
      onesided_exchange_buffers();
3464
      onesided_exchange_border_cells_fence();
3465
      onesided_exchange_buffers();
3466
      for(iteration = 0; iteration < iteration_count; iteration++)
3467
        {
3468
          onesided_wait_for_border_cell_arrival_fence();
3469
          simulate_outer_cells(compute);
3470
          onesided_exchange_border_cells_fence();
3471
          simulate_inner_cells(compute);
3472
          onesided_exchange_buffers();
3473
        }
3474
      onesided_wait_for_border_cell_arrival_fence();
3475
      simulate_outer_cells(compute);
3476
      simulate_inner_cells(compute);
3477
    }
3478

    
3479
  end_time = stop_synchronization();
3480
  MPI_Win_free(&to_win);
3481
  MPI_Win_free(&from_win);
3482
  
3483
  return end_time - start_time;
3484
}
3485

    
3486
void init_Send(int count, MPI_Datatype datatype, int tag)
3487
{
3488
  MPI_Aint extent;
3489

    
3490
  extent = get_extent(count, datatype);
3491
  set_send_buffer_usage(extent);
3492
  set_reported_message_size(extent);
3493
  set_recv_buffer_usage(extent);
3494
}
3495

    
3496
double measure_Send(int count, MPI_Datatype datatype, int tag)
3497
{
3498
  double start_time;
3499
  MPI_Status status;
3500
  
3501
  if( get_measurement_rank() == 0 ) {
3502
    start_time = MPI_Wtime();
3503
    MPI_Ssend(get_send_buffer(), count, datatype, 1, tag, get_measurement_comm());
3504
    return MPI_Wtime() - start_time;
3505
  } else {
3506
    MPI_Recv(get_recv_buffer(), count, datatype, 0, tag, get_measurement_comm(), &status);
3507
    return -1.0;
3508
  }
3509
}
3510

    
3511
#pragma weak end_skampi_extensions
3512
#endif /* USE_ONESIDED */