Skip to content

Commit 569527f

Browse files
committed
add option -c to allocate user buffers in a contiguous space
1 parent 3eb34d9 commit 569527f

1 file changed

Lines changed: 50 additions & 11 deletions

File tree

examples/C/nonblocking_write.c

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ static void
5454
usage(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

Comments
 (0)