Skip to content

Commit e475964

Browse files
committed
use vars for start-cyclic pattern
fix bug for start-cyclic pattern fix bug of malloc buf of type double run all partitioning patterns in make ptest
1 parent 4d3d8c1 commit e475964

File tree

2 files changed

+97
-60
lines changed

2 files changed

+97
-60
lines changed

benchmarks/C/aggregation.c

Lines changed: 91 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ int benchmark_write(char *filename,
163163
double **buf;
164164
double start_t, end_t;
165165
MPI_Comm comm=MPI_COMM_WORLD;
166-
MPI_Offset gsizes[2], start[3], count[3], lenlen;
166+
MPI_Offset bb_gsizes[3], sc_gsizes[3], bs_gsizes[3], sb_gsizes[3];
167+
MPI_Offset start[3], count[3], stride[3], lenlen;
167168
MPI_Info info=MPI_INFO_NULL;
168169

169170
MPI_Comm_rank(comm, &rank);
@@ -190,7 +191,7 @@ int benchmark_write(char *filename,
190191
lenlen = cfg->len * cfg->len;
191192
buf = (double**) malloc(nvars * sizeof(double*));
192193
for (i=0; i<nvars; i++) {
193-
buf[i] = (double*) malloc(lenlen * sizeof(double*));
194+
buf[i] = (double*) malloc(lenlen * sizeof(double));
194195
assert(buf[i] != NULL);
195196
for (j=0; j<lenlen; j++) buf[i][j] = (double)rank;
196197
}
@@ -210,38 +211,38 @@ int benchmark_write(char *filename,
210211
/* define dimensions */
211212
err = ncmpi_def_dim(ncid, "time", NC_UNLIMITED, &time_id); ERR(err)
212213
if (cfg->block_block) {
213-
gsizes[0] = cfg->len * psizes[0];
214-
gsizes[1] = cfg->len * psizes[1];
215-
err = ncmpi_def_dim(ncid, "Block_Block_Y", gsizes[0], &bb_dimids[1]);
214+
bb_gsizes[1] = cfg->len * psizes[0];
215+
bb_gsizes[2] = cfg->len * psizes[1];
216+
err = ncmpi_def_dim(ncid, "Block_Block_Y", bb_gsizes[1], &bb_dimids[1]);
216217
ERR(err)
217-
err = ncmpi_def_dim(ncid, "Block_Block_X", gsizes[1], &bb_dimids[2]);
218+
err = ncmpi_def_dim(ncid, "Block_Block_X", bb_gsizes[2], &bb_dimids[2]);
218219
ERR(err)
219220
bb_dimids[0] = time_id;
220221
}
221222
if (cfg->star_cyclic) {
222-
gsizes[0] = cfg->len;
223-
gsizes[1] = cfg->len * nprocs;
224-
err = ncmpi_def_dim(ncid, "Star_Cyclic_Y", gsizes[0], &sc_dimids[1]);
223+
sc_gsizes[1] = cfg->len;
224+
sc_gsizes[2] = cfg->len * nprocs;
225+
err = ncmpi_def_dim(ncid, "Star_Cyclic_Y", sc_gsizes[1], &sc_dimids[1]);
225226
ERR(err)
226-
err = ncmpi_def_dim(ncid, "Star_Cyclic_X", gsizes[1], &sc_dimids[2]);
227+
err = ncmpi_def_dim(ncid, "Star_Cyclic_X", sc_gsizes[2], &sc_dimids[2]);
227228
ERR(err)
228229
sc_dimids[0] = time_id;
229230
}
230231
if (cfg->block_star) {
231-
gsizes[0] = cfg->len * nprocs;
232-
gsizes[1] = cfg->len;
233-
err = ncmpi_def_dim(ncid, "Block_Star_Y", gsizes[0], &bs_dimids[1]);
232+
bs_gsizes[1] = cfg->len * nprocs;
233+
bs_gsizes[2] = cfg->len;
234+
err = ncmpi_def_dim(ncid, "Block_Star_Y", bs_gsizes[1], &bs_dimids[1]);
234235
ERR(err)
235-
err = ncmpi_def_dim(ncid, "Block_Star_X", gsizes[1], &bs_dimids[2]);
236+
err = ncmpi_def_dim(ncid, "Block_Star_X", bs_gsizes[2], &bs_dimids[2]);
236237
ERR(err)
237238
bs_dimids[0] = time_id;
238239
}
239240
if (cfg->star_block) {
240-
gsizes[0] = cfg->len;
241-
gsizes[1] = cfg->len * nprocs;
242-
err = ncmpi_def_dim(ncid, "Star_Block_Y", gsizes[0], &sb_dimids[1]);
241+
sb_gsizes[1] = cfg->len;
242+
sb_gsizes[2] = cfg->len * nprocs;
243+
err = ncmpi_def_dim(ncid, "Star_Block_Y", sb_gsizes[1], &sb_dimids[1]);
243244
ERR(err)
244-
err = ncmpi_def_dim(ncid, "Star_Block_X", gsizes[1], &sb_dimids[2]);
245+
err = ncmpi_def_dim(ncid, "Star_Block_X", sb_gsizes[2], &sb_dimids[2]);
245246
ERR(err)
246247
sb_dimids[0] = time_id;
247248
}
@@ -262,7 +263,7 @@ int benchmark_write(char *filename,
262263
sprintf(name,"star_cyclic_var_%d",v);
263264
err = ncmpi_def_var(ncid, name, XTYPE, 3, sc_dimids, &varid[v++]);
264265
ERR(err)
265-
num_reqs += cfg->len;
266+
num_reqs++;
266267
}
267268
if (cfg->block_star) {
268269
/* variables are block-* partitioned */
@@ -296,10 +297,11 @@ int benchmark_write(char *filename,
296297
k = v = 0;
297298
start[0] = n;
298299
count[0] = 1;
300+
stride[0] = 1;
299301
for (i=0; i<cfg->nvars; i++) {
300302
if (cfg->block_block) {
301-
start[1] = cfg->len * (rank % psizes[0]);
302-
start[2] = cfg->len * ((rank / psizes[1]) % psizes[1]);
303+
start[2] = cfg->len * (rank % psizes[1]);
304+
start[1] = cfg->len * (rank / psizes[1]);
303305
count[1] = cfg->len;
304306
count[2] = cfg->len;
305307
if (cfg->blocking_io)
@@ -313,30 +315,27 @@ int benchmark_write(char *filename,
313315
v++;
314316
}
315317
if (cfg->star_cyclic) {
316-
double *ptr = buf[v];
317318
start[1] = 0;
318319
start[2] = rank;
319-
count[1] = cfg->len;
320-
count[2] = 1;
321-
for (j=0; j<cfg->len; j++) {
322-
if (cfg->blocking_io)
323-
err = ncmpi_put_vara_double_all(ncid, varid[v], start,
324-
count, ptr);
325-
else
326-
err = ncmpi_iput_vara_double(ncid, varid[v], start, count,
327-
ptr, &reqs[k++]);
328-
ERR(err)
329-
ptr += cfg->len;
330-
start[2] += nprocs;
331-
if (debug) DBG_PRINT("*-cyclic", i, j)
332-
}
320+
count[1] = sc_gsizes[1];
321+
count[2] = cfg->len;
322+
stride[1] = 1;
323+
stride[2] = nprocs;
324+
if (cfg->blocking_io)
325+
err = ncmpi_put_vars_double_all(ncid, varid[v], start,
326+
count, stride, buf[v]);
327+
else
328+
err = ncmpi_iput_vars_double(ncid, varid[v], start, count,
329+
stride, buf[v], &reqs[k++]);
330+
ERR(err)
331+
if (debug) DBG_PRINT("*-cyclic", i, j)
333332
v++;
334333
}
335334
if (cfg->block_star) {
336335
start[1] = cfg->len * rank;
337336
start[2] = 0;
338337
count[1] = cfg->len;
339-
count[2] = cfg->len;
338+
count[2] = bs_gsizes[2];
340339
if (cfg->blocking_io)
341340
err = ncmpi_put_vara_double_all(ncid, varid[v], start,
342341
count, buf[v]);
@@ -350,7 +349,7 @@ int benchmark_write(char *filename,
350349
if (cfg->star_block) {
351350
start[1] = 0;
352351
start[2] = cfg->len * rank;
353-
count[1] = cfg->len;
352+
count[1] = sb_gsizes[1];
354353
count[2] = cfg->len;
355354
if (cfg->blocking_io)
356355
err = ncmpi_put_vara_double_all(ncid, varid[v], start,
@@ -415,11 +414,12 @@ int benchmark_read(char *filename,
415414
double *timing) /* [5] */
416415
{
417416
int i, j, k, v, n, rank, nprocs, nerrs=0, err, num_reqs, nvars;
418-
int ncid, *reqs, *sts, psizes[2];
417+
int ncid, dimid, *reqs, *sts, psizes[2];
419418
double **buf;
420419
double start_t, end_t;
421420
MPI_Comm comm=MPI_COMM_WORLD;
422-
MPI_Offset start[3], count[3], lenlen;
421+
MPI_Offset bb_gsizes[3], sc_gsizes[3], bs_gsizes[3], sb_gsizes[3];
422+
MPI_Offset start[3], count[3], stride[3], lenlen;
423423
MPI_Info info=MPI_INFO_NULL;
424424

425425
MPI_Comm_rank(comm, &rank);
@@ -439,7 +439,7 @@ int benchmark_read(char *filename,
439439
/* allocate I/O buffer */
440440
buf = (double**) malloc(nvars * sizeof(double*));
441441
for (i=0; i<nvars; i++) {
442-
buf[i] = (double*) malloc(lenlen * sizeof(double*));
442+
buf[i] = (double*) malloc(lenlen * sizeof(double));
443443
assert(buf[i] != NULL);
444444
}
445445
MPI_Barrier(comm);
@@ -456,12 +456,45 @@ int benchmark_read(char *filename,
456456
err = ncmpi_inq_header_size(ncid, &cfg->header_size); ERR(err)
457457
err = ncmpi_inq_header_extent(ncid, &cfg->header_extent); ERR(err)
458458

459+
if (cfg->block_block) {
460+
err = ncmpi_inq_dimid(ncid, "time", &dimid); ERR(err)
461+
err = ncmpi_inq_dimlen(ncid, dimid, &bb_gsizes[0]); ERR(err)
462+
err = ncmpi_inq_dimid(ncid, "Block_Block_Y", &dimid); ERR(err)
463+
err = ncmpi_inq_dimlen(ncid, dimid, &bb_gsizes[1]); ERR(err)
464+
err = ncmpi_inq_dimid(ncid, "Block_Block_X", &dimid); ERR(err)
465+
err = ncmpi_inq_dimlen(ncid, dimid, &bb_gsizes[2]); ERR(err)
466+
}
467+
if (cfg->star_cyclic) {
468+
err = ncmpi_inq_dimid(ncid, "time", &dimid); ERR(err)
469+
err = ncmpi_inq_dimlen(ncid, dimid, &sc_gsizes[0]); ERR(err)
470+
err = ncmpi_inq_dimid(ncid, "Star_Cyclic_Y", &dimid); ERR(err)
471+
err = ncmpi_inq_dimlen(ncid, dimid, &sc_gsizes[1]); ERR(err)
472+
err = ncmpi_inq_dimid(ncid, "Star_Cyclic_X", &dimid); ERR(err)
473+
err = ncmpi_inq_dimlen(ncid, dimid, &sc_gsizes[2]); ERR(err)
474+
}
475+
if (cfg->block_star) {
476+
err = ncmpi_inq_dimid(ncid, "time", &dimid); ERR(err)
477+
err = ncmpi_inq_dimlen(ncid, dimid, &bs_gsizes[0]); ERR(err)
478+
err = ncmpi_inq_dimid(ncid, "Block_Star_Y", &dimid); ERR(err)
479+
err = ncmpi_inq_dimlen(ncid, dimid, &bs_gsizes[1]); ERR(err)
480+
err = ncmpi_inq_dimid(ncid, "Block_Star_X", &dimid); ERR(err)
481+
err = ncmpi_inq_dimlen(ncid, dimid, &bs_gsizes[2]); ERR(err)
482+
}
483+
if (cfg->star_block) {
484+
err = ncmpi_inq_dimid(ncid, "time", &dimid); ERR(err)
485+
err = ncmpi_inq_dimlen(ncid, dimid, &sb_gsizes[0]); ERR(err)
486+
err = ncmpi_inq_dimid(ncid, "Star_Block_Y", &dimid); ERR(err)
487+
err = ncmpi_inq_dimlen(ncid, dimid, &sb_gsizes[1]); ERR(err)
488+
err = ncmpi_inq_dimid(ncid, "Star_Block_X", &dimid); ERR(err)
489+
err = ncmpi_inq_dimlen(ncid, dimid, &sb_gsizes[2]); ERR(err)
490+
}
491+
459492
num_reqs = 0;
460493
for (i=0; i<cfg->nvars; i++) {
461494
if (cfg->block_block)
462495
num_reqs++; /* complete in 1 nonblocking call */
463496
if (cfg->star_cyclic)
464-
num_reqs += cfg->len; /* complete in cfg->len nonblocking calls */
497+
num_reqs++; /* complete in 1 nonblocking call */
465498
if (cfg->block_star)
466499
num_reqs++; /* complete in 1 nonblocking call */
467500
if (cfg->star_block)
@@ -476,10 +509,11 @@ int benchmark_read(char *filename,
476509
k = v = 0;
477510
start[0] = n;
478511
count[0] = 1;
512+
stride[0] = 1;
479513
for (i=0; i<cfg->nvars; i++) {
480514
if (cfg->block_block) {
481-
start[1] = cfg->len * (rank % psizes[0]);
482-
start[2] = cfg->len * ((rank / psizes[1]) % psizes[1]);
515+
start[2] = cfg->len * (rank % psizes[1]);
516+
start[1] = cfg->len * (rank / psizes[1]);
483517
count[1] = cfg->len;
484518
count[2] = cfg->len;
485519
if (cfg->blocking_io)
@@ -491,28 +525,26 @@ int benchmark_read(char *filename,
491525
v++;
492526
}
493527
if (cfg->star_cyclic) {
494-
double *ptr = buf[v];
495528
start[1] = 0;
496529
start[2] = rank;
497-
count[1] = cfg->len;
498-
count[2] = 1;
499-
for (j=0; j<cfg->len; j++) {
500-
if (cfg->blocking_io)
501-
err = ncmpi_get_vara_double_all(ncid, v, start, count, ptr);
502-
else
503-
err = ncmpi_iget_vara_double(ncid, v, start, count, ptr,
504-
&reqs[k++]);
505-
ERR(err)
506-
ptr += cfg->len;
507-
start[2] += nprocs;
508-
}
530+
count[1] = sc_gsizes[1];
531+
count[2] = cfg->len;
532+
stride[1] = 1;
533+
stride[2] = nprocs;
534+
if (cfg->blocking_io)
535+
err = ncmpi_get_vars_double_all(ncid, v, start, count,
536+
stride, buf[v]);
537+
else
538+
err = ncmpi_iget_vars_double(ncid, v, start, count, stride,
539+
buf[v], &reqs[k++]);
540+
ERR(err)
509541
v++;
510542
}
511543
if (cfg->block_star) {
512544
start[1] = cfg->len * rank;
513545
start[2] = 0;
514546
count[1] = cfg->len;
515-
count[2] = cfg->len;
547+
count[2] = bs_gsizes[2];
516548
if (cfg->blocking_io)
517549
err = ncmpi_get_vara_double_all(ncid, v, start, count, buf[v]);
518550
else
@@ -524,7 +556,7 @@ int benchmark_read(char *filename,
524556
if (cfg->star_block) {
525557
start[1] = 0;
526558
start[2] = cfg->len * rank;
527-
count[1] = cfg->len;
559+
count[1] = sb_gsizes[1];
528560
count[2] = cfg->len;
529561
if (cfg->blocking_io)
530562
err = ncmpi_get_vara_double_all(ncid, v, start, count, buf[v]);

benchmarks/C/parallel_run.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@ for i in ${check_PROGRAMS} ; do
3232
export PNETCDF_SAFE_MODE=$j
3333
# echo "set PNETCDF_SAFE_MODE ${PNETCDF_SAFE_MODE}"
3434

35-
${MPIRUN} ./$i -q -l 10 ${TESTOUTDIR}/$i.nc
35+
OPTS=
36+
if test "$i" = "aggregation" ; then
37+
OPTS="-b -c -i -j"
38+
fi
39+
echo "${MPIRUN} ./$i -q ${OPTS} -l 10 ${TESTOUTDIR}/$i.nc"
40+
${MPIRUN} ./$i -q ${OPTS} -l 10 ${TESTOUTDIR}/$i.nc
3641
if test $? = 0 ; then
3742
echo "PASS: C parallel run on $1 processes --------------- $i"
3843
fi

0 commit comments

Comments
 (0)