@@ -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 ]);
0 commit comments