/********************************************************************* * * Copyright (C) 2013, Northwestern University and Argonne National Laboratory * See COPYRIGHT notice in top-level directory. * *********************************************************************/ /* $Id$ */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This example sets two PnetCDF hints: * nc_header_align_size and nc_var_align_size * and prints the hint values as well as the header size, header extent, and * two variables' starting file offsets. * * The compile and run commands are given below. * * % mpicc -O2 -o hints hints.c -lpnetcdf * * % mpiexec -l -n 4 ./hints /pvfs2/wkliao/testfile.nc * * nc_header_align_size set to = 1024 * nc_var_align_size set to = 512 * nc_header_read_chunk_size set to = 256 * header size = 252 * header extent = 1024 * var_zy start file offset = 1024 * var_yx start file offset = 3072 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include #include /* strcpy(), strncpy() */ #include /* getopt() */ #include #include #define NZ 5 #define NY 5 #define NX 5 #define ERR {if(err!=NC_NOERR){printf("Error at line %d in %s: %s\n", __LINE__,__FILE__, ncmpi_strerror(err));nerrs++;}} static void usage(char *argv0) { char *help = "Usage: %s [-h] | [-q] [file_name]\n" " [-h] Print help\n" " [-q] Quiet mode (reports when fail)\n" " [filename] output netCDF file name\n"; fprintf(stderr, help, argv0); } static int print_hints(int ncid, int varid0, int varid1) { char value[MPI_MAX_INFO_VAL]; int err, len, flag, nerrs=0; MPI_Offset header_size, header_extent, var_zy_start, var_yx_start; MPI_Offset h_align=-1, v_align=-1, h_chunk=-1; MPI_Info info_used; err = ncmpi_inq_header_size (ncid, &header_size); ERR err = ncmpi_inq_header_extent(ncid, &header_extent); ERR err = ncmpi_inq_varoffset(ncid, varid0, &var_zy_start); ERR err = ncmpi_inq_varoffset(ncid, varid1, &var_yx_start); ERR err = ncmpi_inq_file_info(ncid, &info_used); ERR MPI_Info_get_valuelen(info_used, "nc_header_align_size", &len, &flag); if (flag) { MPI_Info_get(info_used, "nc_header_align_size", len+1, value, &flag); h_align = strtoll(value,NULL,10); } MPI_Info_get_valuelen(info_used, "nc_var_align_size", &len, &flag); if (flag) { MPI_Info_get(info_used, "nc_var_align_size", len+1, value, &flag); v_align = strtoll(value,NULL,10); } MPI_Info_get_valuelen(info_used, "nc_header_read_chunk_size", &len, &flag); if (flag) { MPI_Info_get(info_used, "nc_header_read_chunk_size", len+1, value,&flag); h_chunk = strtoll(value,NULL,10); } MPI_Info_free(&info_used); if (h_align == -1) printf("nc_header_align_size is NOT set\n"); else printf("nc_header_align_size set to = %lld\n", h_align); if (v_align == -1) printf("nc_var_align_size is NOT set\n"); else printf("nc_var_align_size set to = %lld\n", v_align); if (h_chunk == -1) printf("nc_header_read_chunk_size is NOT set\n"); else printf("nc_header_read_chunk_size set to = %lld\n", h_chunk); printf("header size = %lld\n", header_size); printf("header extent = %lld\n", header_extent); printf("var_zy start file offset = %lld\n", var_zy_start); printf("var_yx start file offset = %lld\n", var_yx_start); return nerrs; } int main(int argc, char** argv) { extern int optind; char filename[256]; int i, rank, nprocs, verbose=1, err, nerrs=0; int ncid, cmode, varid0, varid1, dimid[3], *buf_zy; float *buf_yx; MPI_Offset start[2], count[2]; MPI_Info info; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* get command-line arguments */ while ((i = getopt(argc, argv, "hq")) != EOF) switch(i) { case 'q': verbose = 0; break; case 'h': default: if (rank==0) usage(argv[0]); MPI_Finalize(); return 1; } if (argv[optind] == NULL) strcpy(filename, "testfile.nc"); else snprintf(filename, 256, "%s", argv[optind]); MPI_Info_create(&info); MPI_Info_set(info, "nc_header_align_size", "1024"); /* size in bytes */ MPI_Info_set(info, "nc_var_align_size", "512"); /* size in bytes */ MPI_Info_set(info, "nc_header_read_chunk_size", "256"); /* size in bytes */ /* note that set the above values to 1 to disable the alignment */ /* create a new file for writing ----------------------------------------*/ cmode = NC_CLOBBER | NC_64BIT_DATA; err = ncmpi_create(MPI_COMM_WORLD, filename, cmode, info, &ncid); ERR MPI_Info_free(&info); /* define 3 dimensions */ err = ncmpi_def_dim(ncid, "Z", NZ*nprocs, &dimid[0]); ERR err = ncmpi_def_dim(ncid, "Y", NY*nprocs, &dimid[1]); ERR err = ncmpi_def_dim(ncid, "X", NX*nprocs, &dimid[2]); ERR /* define a variable of size (NZ * nprocs) * (NY * nprocs) */ err = ncmpi_def_var(ncid, "var_zy", NC_INT, 2, &dimid[0], &varid0); ERR /* define a variable of size (NY * nprocs) * (NX * nprocs) */ err = ncmpi_def_var(ncid, "var_yx", NC_FLOAT, 2, &dimid[1], &varid1); ERR err = ncmpi_enddef(ncid); ERR /* var_zy is partitioned along Z dimension */ buf_zy = (int*) malloc(NZ * (NY * nprocs) * sizeof(int)); for (i=0; i 0) printf("heap memory allocated by PnetCDF internally has %lld bytes yet to be freed\n", sum_size); } MPI_Finalize(); return (nerrs > 0); }