@@ -54,9 +54,10 @@ static void
5454usage (char * argv0 )
5555{
5656 char * help =
57- "Usage: %s [-h | -q | -b | -l len] [file_name]\n"
57+ "Usage: %s [-h | -q | -c | - b | -l len] [file_name]\n"
5858 " [-h] Print help\n"
5959 " [-q] Quiet mode (reports when fail)\n"
60+ " [-c] Allocate all write buffers in a contiguous space (default no)\n"
6061 " [-b] Use bput APIs instead of iput APIs (default iput)\n"
6162 " [-l len] size of each dimension of the local array\n"
6263 " [file_name] output netCDF file name\n" ;
@@ -124,9 +125,9 @@ int main(int argc, char **argv)
124125{
125126 extern int optind ;
126127 extern char * optarg ;
127- int i , j , k , err , nerrs = 0 , debug = 0 , use_bput = 0 ;
128+ int i , j , k , err , nerrs = 0 , debug = 0 , use_contig_buf = 0 , use_bput = 0 ;
128129 int nprocs , len = 0 , bufsize , rank ;
129- int sca_buf [ SCA_NVARS ] , * fix_buf [FIX_NVARS ], * rec_buf [REC_NVARS ];
130+ int * sca_buf , * fix_buf [FIX_NVARS ], * rec_buf [REC_NVARS ];
130131 int gsizes [NDIMS ], psizes [NDIMS ];
131132 double write_timing , max_write_timing , write_bw ;
132133 char filename [256 ], str [512 ];
@@ -143,10 +144,12 @@ int main(int argc, char **argv)
143144 verbose = 1 ;
144145
145146 /* get command-line arguments */
146- while ((i = getopt (argc , argv , "hqbl :" )) != EOF )
147+ while ((i = getopt (argc , argv , "hqcbl :" )) != EOF )
147148 switch (i ) {
148149 case 'q' : verbose = 0 ;
149150 break ;
151+ case 'c' : use_contig_buf = 1 ;
152+ break ;
150153 case 'b' : use_bput = 1 ;
151154 break ;
152155 case 'l' : len = atoi (optarg );
@@ -187,16 +190,39 @@ int main(int argc, char **argv)
187190 rank , starts [0 ], starts [1 ], starts [2 ], starts [3 ],
188191 counts [0 ], counts [1 ], counts [2 ], counts [3 ]);
189192
190- /* allocate buffer and initialize with some non-zero numbers */
193+ /* allocate buffers */
194+ if (use_contig_buf ) {
195+ /* all write buffers are allocated in a single contiguous space */
196+ size_t total_bufsize ;
197+
198+ total_bufsize = SCA_NVARS + (FIX_NVARS + REC_NVARS ) * bufsize ;
199+ sca_buf = (int * ) malloc (total_bufsize * sizeof (int ));
200+
201+ fix_buf [0 ] = sca_buf + SCA_NVARS ;
202+ for (i = 1 ; i < FIX_NVARS ; i ++ )
203+ fix_buf [i ] = fix_buf [i - 1 ] + bufsize ;
204+
205+ rec_buf [0 ] = fix_buf [FIX_NVARS - 1 ] + bufsize ;
206+ for (i = 1 ; i < REC_NVARS ; i ++ )
207+ rec_buf [i ] = rec_buf [i - 1 ] + bufsize ;
208+ }
209+ else {
210+ /* allocate individual buffers separately */
211+ sca_buf = (int * ) malloc (SCA_NVARS * sizeof (int ));
212+ for (i = 0 ; i < FIX_NVARS ; i ++ )
213+ fix_buf [i ] = (int * ) malloc (bufsize * sizeof (int ));
214+ for (i = 0 ; i < REC_NVARS ; i ++ )
215+ rec_buf [i ] = (int * ) malloc (bufsize * sizeof (int ));
216+ }
217+
218+ /* initialize buffer contents */
219+ for (j = 0 ; j < SCA_NVARS ; j ++ ) sca_buf [j ] = rank + j ;
191220 for (i = 0 ; i < FIX_NVARS ; i ++ ) {
192- fix_buf [i ] = (int * ) malloc (bufsize * sizeof (int ));
193221 for (j = 0 ; j < bufsize ; j ++ ) fix_buf [i ][j ] = rank ;
194222 }
195223 for (i = 0 ; i < REC_NVARS ; i ++ ) {
196- rec_buf [i ] = (int * ) malloc (bufsize * sizeof (int ));
197224 for (j = 0 ; j < bufsize ; j ++ ) rec_buf [i ][j ] = rank ;
198225 }
199- for (j = 0 ; j < SCA_NVARS ; j ++ ) sca_buf [j ] = rank + j ;
200226
201227 MPI_Barrier (MPI_COMM_WORLD );
202228 write_timing = MPI_Wtime ();
@@ -206,6 +232,11 @@ int main(int argc, char **argv)
206232 MPI_Info_create (& info );
207233 MPI_Info_set (info , "nc_var_align_size" , "1" );
208234
235+ /* Optional: disable PnetCDF internal buffering for noncontiguous user
236+ * buffers */
237+ if (!use_contig_buf )
238+ MPI_Info_set (info , "nc_ibuf_size" , "0" );
239+
209240 /* create the file */
210241 err = ncmpi_create (MPI_COMM_WORLD , filename , NC_CLOBBER |NC_64BIT_DATA ,
211242 info , & ncid );
@@ -350,9 +381,13 @@ int main(int argc, char **argv)
350381 err = ncmpi_close (ncid );
351382 ERR
352383
353- for (i = 0 ; i < FIX_NVARS ; i ++ ) free (fix_buf [i ]);
354- for (i = 0 ; i < REC_NVARS ; i ++ ) free (rec_buf [i ]);
355-
384+ if (use_contig_buf )
385+ free (sca_buf );
386+ else {
387+ free (sca_buf );
388+ for (i = 0 ; i < FIX_NVARS ; i ++ ) free (fix_buf [i ]);
389+ for (i = 0 ; i < REC_NVARS ; i ++ ) free (rec_buf [i ]);
390+ }
356391 free (req );
357392 free (st );
358393
@@ -374,6 +409,10 @@ int main(int argc, char **argv)
374409 printf ("Using PnetCDF nonblocking APIs: bput\n" );
375410 else
376411 printf ("Using PnetCDF nonblocking APIs: iput\n" );
412+ if (use_contig_buf )
413+ printf ("All write buffers are in a contiguous space\n" );
414+ else
415+ printf ("All write buffers are allocated separately\n" );
377416 printf ("Total amount writes (include header) = %lld bytes\n" , sum_write_size );
378417 printf ("Total amount writes reported by pnetcdf (include header) = %lld bytes\n" , sum_put_size );
379418 printf ("\n" );
0 commit comments