Skip to content

Commit 7a03f8d

Browse files
committed
IMB-MPI4: allreduce,scatter/v,reduce_scatter persistent benchmarks
1 parent f673333 commit 7a03f8d

25 files changed

+934
-154
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,4 @@ clean:
8080
make -C src_cpp -f Makefile TARGET=MPI1 clean GPU_ENABLE=1
8181
rm -f IMB-MPI1 IMB-NBC IMB-RMA IMB-EXT IMB-IO IMB-MT IMB-P2P
8282
if [ -e IMB-MPI1-GPU ]; then rm -f IMB-MPI1-GPU; fi
83-
if [ -e IMB-MPI4 ]; then make -C src_cpp -f Makefile TARGET=MPI4 clean; rm -f IMB-MPI4; fi
83+
if [ -e IMB-MPI4 ]; then make -C src_cpp -f Makefile TARGET=MPI4 clean; rm -f IMB-MPI4; fi

src_c/IMB_allgather.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,8 @@ Output variables:
305305

306306
/* GET SIZE OF DATA TYPE */
307307
MPI_Type_size(c_info->s_data_type, &s_size);
308-
MPI_Type_size(c_info->s_data_type, &r_size);
308+
MPI_Type_size(c_info->r_data_type, &r_size);
309+
309310
if ((s_size != 0) && (r_size != 0)) {
310311
s_num = size / s_size;
311312
r_num = size / r_size;
@@ -348,11 +349,9 @@ void IMB_allgather_persist(struct comm_info* c_info,
348349
MODES RUN_MODE,
349350
double* time) {
350351
/*
351-
352352
MPI4 benchmark kernel
353353
Benchmarks MPI_Allgather_init
354354
355-
356355
Input variables:
357356
358357
-c_info (type struct comm_info*)
@@ -389,13 +388,14 @@ Output variables:
389388
/* GET SIZE OF DATA TYPE */
390389
MPI_Type_size(c_info->s_data_type, &s_size);
391390
MPI_Type_size(c_info->r_data_type, &r_size);
391+
392392
if ((s_size != 0) && (r_size != 0)) {
393393
s_num = size / s_size;
394394
r_num = size / r_size;
395395
}
396396

397397
if (c_info->rank != -1) {
398-
IMB_allgather_pure_persist(c_info, size, ITERATIONS, RUN_MODE, &t_pure);
398+
IMB_allgather_persist_pure(c_info, size, ITERATIONS, RUN_MODE, &t_pure);
399399

400400
/* INITIALIZATION CALL */
401401
IMB_cpu_exploit(t_pure, 1);
@@ -412,7 +412,8 @@ Output variables:
412412
c_info->communicator,
413413
c_info->info,
414414
&request));
415-
for (i = 0; i < ITERATIONS->n_sample; i++) {
415+
for (i = 0; i < ITERATIONS->n_sample; i++)
416+
{
416417
t_ovrlp -= MPI_Wtime();
417418
// Start the persistent request
418419
MPI_ERRHAND(MPI_Start(&request));
@@ -440,7 +441,7 @@ Output variables:
440441

441442
/*************************************************************************/
442443

443-
void IMB_allgather_pure_persist(struct comm_info* c_info,
444+
void IMB_allgather_persist_pure(struct comm_info* c_info,
444445
int size,
445446
struct iter_schedule* ITERATIONS,
446447
MODES RUN_MODE,
@@ -481,11 +482,13 @@ Output variables:
481482

482483
/* GET SIZE OF DATA TYPE */
483484
MPI_Type_size(c_info->s_data_type, &s_size);
484-
MPI_Type_size(c_info->s_data_type, &r_size);
485+
MPI_Type_size(c_info->r_data_type, &r_size);
486+
485487
if ((s_size != 0) && (r_size != 0)) {
486488
s_num = size / s_size;
487489
r_num = size / r_size;
488490
}
491+
489492
if (c_info->rank != -1) {
490493
IMB_do_n_barriers(c_info->communicator, N_BARR);
491494

@@ -499,10 +502,12 @@ Output variables:
499502
c_info->communicator,
500503
c_info->info,
501504
&request));
502-
for (i = 0; i < ITERATIONS->n_sample; i++) {
505+
for (i = 0; i < ITERATIONS->n_sample; i++)
506+
{
503507
t_pure -= MPI_Wtime();
504508
// Start the persistent request
505509
MPI_ERRHAND(MPI_Start(&request));
510+
506511
MPI_Wait(&request, &status);
507512
t_pure += MPI_Wtime();
508513

@@ -513,6 +518,7 @@ Output variables:
513518

514519
t_pure /= ITERATIONS->n_sample;
515520
}
521+
516522
time[0] = t_pure;
517523
}
518524

src_c/IMB_allgatherv.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ Output variables:
118118
/* GET SIZE OF DATA TYPE */
119119
MPI_Type_size(c_info->s_data_type, &s_size);
120120
MPI_Type_size(c_info->r_data_type, &r_size);
121+
121122
if ((s_size != 0) && (r_size != 0)) {
122123
s_num = size / s_size;
123124
r_num = size / r_size;
@@ -318,7 +319,8 @@ Output variables:
318319

319320
/* GET SIZE OF DATA TYPE */
320321
MPI_Type_size(c_info->s_data_type, &s_size);
321-
MPI_Type_size(c_info->s_data_type, &r_size);
322+
MPI_Type_size(c_info->r_data_type, &r_size);
323+
322324
if ((s_size != 0) && (r_size != 0)) {
323325
s_num = size / s_size;
324326
r_num = size / r_size;
@@ -361,7 +363,7 @@ Output variables:
361363
time[0] = t_pure;
362364
}
363365

364-
#elif defined MPI4 // MPI1
366+
#elif defined MPI4 // NBC
365367

366368
/*************************************************************************/
367369

@@ -373,7 +375,7 @@ void IMB_allgatherv_persist(struct comm_info* c_info,
373375
/*
374376
375377
MPI4 benchmark kernel
376-
Benchmarks MPI_Iallgatherv
378+
Benchmarks MPI_Allgatherv_init
377379
378380
Input variables:
379381
@@ -415,7 +417,7 @@ Output variables:
415417

416418
if (c_info->rank != -1) {
417419
/* GET PURE TIME. DISPLACEMENT AND RECEIVE COUNT WILL BE INITIALIZED HERE */
418-
IMB_allgatherv_pure_persist(c_info, size, ITERATIONS, RUN_MODE, &t_pure);
420+
IMB_allgatherv_persist_pure(c_info, size, ITERATIONS, RUN_MODE, &t_pure);
419421

420422
/* INITIALIZATION CALL */
421423
IMB_cpu_exploit(t_pure, 1);
@@ -433,7 +435,7 @@ Output variables:
433435
c_info->communicator,
434436
c_info->info,
435437
&request));
436-
for(i = 0; i < ITERATIONS->n_sample; i++)
438+
for (i = 0; i < ITERATIONS->n_sample; i++)
437439
{
438440
t_ovrlp -= MPI_Wtime();
439441
// Start the persistent request
@@ -462,24 +464,22 @@ Output variables:
462464

463465
/*************************************************************************/
464466

465-
void IMB_allgatherv_pure_persist(struct comm_info* c_info,
467+
void IMB_allgatherv_persist_pure(struct comm_info* c_info,
466468
int size,
467469
struct iter_schedule* ITERATIONS,
468470
MODES RUN_MODE,
469471
double* time) {
470472
/*
471473
472474
MPI4 benchmark kernel
473-
Benchmarks IMB_Allgatherv_init
474-
475+
Benchmarks MPI_Allgatherv_init
475476
476477
Input variables:
477478
478479
-c_info (type struct comm_info*)
479480
Collection of all base data for MPI;
480481
see [1] for more information
481482
482-
483483
-size (type int)
484484
Basic message size in bytes
485485
@@ -489,12 +489,10 @@ Input variables:
489489
-RUN_MODE (type MODES)
490490
(only MPI-2 case: see [1])
491491
492-
493492
Output variables:
494493
495494
-time (type double*)
496495
Timing result per sample
497-
498496
*/
499497
int i = 0;
500498
Type_Size s_size,
@@ -507,7 +505,8 @@ Output variables:
507505

508506
/* GET SIZE OF DATA TYPE */
509507
MPI_Type_size(c_info->s_data_type, &s_size);
510-
MPI_Type_size(c_info->s_data_type, &r_size);
508+
MPI_Type_size(c_info->r_data_type, &r_size);
509+
511510
if ((s_size != 0) && (r_size != 0)) {
512511
s_num = size / s_size;
513512
r_num = size / r_size;
@@ -518,10 +517,11 @@ Output variables:
518517
c_info->reccnt[i] = r_num;
519518
}
520519

521-
if(c_info->rank != -1) {
520+
if (c_info->rank != -1) {
522521

523522
IMB_do_n_barriers(c_info->communicator, N_BARR);
524523

524+
// Create a persistent collective operation
525525
MPI_ERRHAND(MPI_Allgatherv_init((char*)c_info->s_buffer + i % ITERATIONS->s_cache_iter * ITERATIONS->s_offs,
526526
s_num,
527527
c_info->s_data_type,
@@ -532,9 +532,10 @@ Output variables:
532532
c_info->communicator,
533533
c_info->info,
534534
&request));
535-
for(i = 0; i < ITERATIONS->n_sample; i++)
535+
for (i = 0; i < ITERATIONS->n_sample; i++)
536536
{
537537
t_pure -= MPI_Wtime();
538+
// Start the persistent request
538539
MPI_ERRHAND(MPI_Start(&request));
539540

540541
MPI_Wait(&request, &status);

src_c/IMB_allreduce.c

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,4 +268,121 @@ void IMB_iallreduce_pure(struct comm_info* c_info,
268268
time[0] = t_pure;
269269
}
270270

271-
#endif // NBC // MPI1
271+
#elif defined MPI4 // NBC
272+
273+
/*************************************************************************/
274+
275+
void IMB_allreduce_persist(struct comm_info* c_info,
276+
int size,
277+
struct iter_schedule* ITERATIONS,
278+
MODES RUN_MODE,
279+
double* time) {
280+
int i = 0;
281+
Type_Size s_size;
282+
int s_num = 0;
283+
MPI_Request request;
284+
MPI_Status status;
285+
double t_pure = 0.,
286+
t_comp = 0.,
287+
t_ovrlp = 0.;
288+
289+
/* GET SIZE OF DATA TYPE */
290+
MPI_Type_size(c_info->red_data_type, &s_size);
291+
if (s_size != 0)
292+
s_num = size / s_size;
293+
294+
if(c_info->rank != -1) {
295+
IMB_allreduce_persist_pure(c_info, size, ITERATIONS, RUN_MODE, &t_pure);
296+
297+
/* INITIALIZATION CALL */
298+
IMB_cpu_exploit(t_pure, 1);
299+
300+
IMB_do_n_barriers(c_info->communicator, N_BARR);
301+
302+
// Create a persistent collective operation
303+
MPI_ERRHAND(MPI_Allreduce_init((char*)c_info->s_buffer + i % ITERATIONS->s_cache_iter * ITERATIONS->s_offs,
304+
(char*)c_info->r_buffer + i % ITERATIONS->r_cache_iter * ITERATIONS->r_offs,
305+
s_num,
306+
c_info->red_data_type,
307+
c_info->op_type,
308+
c_info->communicator,
309+
c_info->info,
310+
&request));
311+
for(i = 0; i < ITERATIONS->n_sample; i++)
312+
{
313+
t_ovrlp -= MPI_Wtime();
314+
// Start the persistent request
315+
MPI_ERRHAND(MPI_Start(&request));
316+
317+
t_comp -= MPI_Wtime();
318+
IMB_cpu_exploit(t_pure, 0);
319+
t_comp += MPI_Wtime();
320+
321+
MPI_Wait(&request, &status);
322+
t_ovrlp += MPI_Wtime();
323+
324+
IMB_do_n_barriers(c_info->communicator, c_info->sync);
325+
}
326+
// Clean up
327+
MPI_Request_free(&request);
328+
329+
t_ovrlp /= ITERATIONS->n_sample;
330+
t_comp /= ITERATIONS->n_sample;
331+
}
332+
333+
time[0] = t_pure;
334+
time[1] = t_ovrlp;
335+
time[2] = t_comp;
336+
}
337+
338+
/*************************************************************************/
339+
340+
void IMB_allreduce_persist_pure(struct comm_info* c_info,
341+
int size,
342+
struct iter_schedule* ITERATIONS,
343+
MODES RUN_MODE,
344+
double* time) {
345+
int i = 0;
346+
Type_Size s_size;
347+
int s_num = 0;
348+
MPI_Request request;
349+
MPI_Status status;
350+
double t_pure = 0.;
351+
352+
/* GET SIZE OF DATA TYPE */
353+
MPI_Type_size(c_info->red_data_type, &s_size);
354+
if (s_size != 0)
355+
s_num = size / s_size;
356+
357+
if (c_info->rank != -1) {
358+
IMB_do_n_barriers(c_info->communicator, N_BARR);
359+
360+
// Create a persistent collective operation
361+
MPI_ERRHAND(MPI_Allreduce_init((char*)c_info->s_buffer + i % ITERATIONS->s_cache_iter * ITERATIONS->s_offs,
362+
(char*)c_info->r_buffer + i % ITERATIONS->r_cache_iter * ITERATIONS->r_offs,
363+
s_num,
364+
c_info->red_data_type,
365+
c_info->op_type,
366+
c_info->communicator,
367+
c_info->info,
368+
&request));
369+
for (i = 0; i < ITERATIONS->n_sample; i++)
370+
{
371+
t_pure -= MPI_Wtime();
372+
// Start the persistent request
373+
MPI_ERRHAND(MPI_Start(&request));
374+
MPI_Wait(&request, &status);
375+
t_pure += MPI_Wtime();
376+
377+
IMB_do_n_barriers (c_info->communicator, c_info->sync);
378+
}
379+
// Clean up
380+
MPI_Request_free(&request);
381+
382+
t_pure /= ITERATIONS->n_sample;
383+
}
384+
385+
time[0] = t_pure;
386+
}
387+
388+
#endif // NBC // MPI1 // MPI4

0 commit comments

Comments
 (0)