diff options
-rw-r--r-- | perform/pio_engine.c | 36 | ||||
-rw-r--r-- | perform/pio_perf.c | 17 | ||||
-rw-r--r-- | perform/pio_perf.h | 5 |
3 files changed, 38 insertions, 20 deletions
diff --git a/perform/pio_engine.c b/perform/pio_engine.c index 54478a8..65d8d2d 100644 --- a/perform/pio_engine.c +++ b/perform/pio_engine.c @@ -445,7 +445,7 @@ do_write(results *res, file_descr *fd, parameters *parms, long ndsets, off_t nelmts, size_t buf_size, void *buffer) { int ret_code = SUCCESS; - long rc; /*routine return code */ + int rc; /*routine return code */ int mrc; /*MPI return code */ MPI_Offset mpi_offset; MPI_Status mpi_status; @@ -534,7 +534,7 @@ fprintf(stderr, "buffer size=%ld\n", buf_size); } /* end if */ } /* end if */ -#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4 +#ifdef H5_HAVE_NOFILL /* Disable writing fill values if asked */ if(parms->h5_no_fill) { hrc = H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER); @@ -618,14 +618,17 @@ fprintf(stderr, "proc %d: elmts_begin=%ld, elmts_count=%ld\n", file_offset = dset_offset + (off_t)(elmts_begin + nelmts_written)*ELMT_SIZE; #if AKCDEBUG -fprintf(stderr, "proc %d: writes %ld bytes at file-offset %ld\n", - pio_mpi_rank_g, nelmts_towrite*ELMT_SIZE, file_offset); +HDfprintf(stderr, "proc %d: write %Hd bytes at file-offset %Hd\n", + pio_mpi_rank_g, (long_long)nelmts_towrite*ELMT_SIZE, (long_long)file_offset); #endif - rc = POSIXSEEK(fd->posixfd, file_offset); - VRFY((rc>=0), "POSIXSEEK"); - rc = POSIXWRITE(fd->posixfd, buffer, (size_t)(nelmts_towrite * ELMT_SIZE)); - VRFY((rc == (nelmts_towrite*ELMT_SIZE)), "POSIXWRITE"); + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + /* check if all bytes are written */ + rc = ((nelmts_towrite*ELMT_SIZE) == + POSIXWRITE(fd->posixfd, buffer, nelmts_towrite*ELMT_SIZE)); + VRFY((rc != 0), "POSIXWRITE"); break; case MPIO: @@ -726,7 +729,7 @@ do_read(results *res, file_descr *fd, parameters *parms, long ndsets, off_t nelmts, size_t buf_size, void *buffer /*out*/) { int ret_code = SUCCESS; - long rc; /*routine return code */ + int rc; /*routine return code */ int mrc; /*MPI return code */ MPI_Offset mpi_offset; MPI_Status mpi_status; @@ -849,14 +852,17 @@ fprintf(stderr, "proc %d: elmts_begin=%ld, elmts_count=%ld\n", file_offset = dset_offset + (off_t)(elmts_begin + nelmts_read)*ELMT_SIZE; #if AKCDEBUG -fprintf(stderr, "proc %d: read %ld bytes at file-offset %ld\n", - pio_mpi_rank_g, nelmts_toread*ELMT_SIZE, file_offset); +HDfprintf(stderr, "proc %d: read %Hd bytes at file-offset %Hd\n", + pio_mpi_rank_g, (long_long)nelmts_towrite*ELMT_SIZE, (long_long)file_offset); #endif - rc = POSIXSEEK(fd->posixfd, file_offset); - VRFY((rc>=0), "POSIXSEEK"); - rc = POSIXREAD(fd->posixfd, buffer, (size_t)(nelmts_toread*ELMT_SIZE)); - VRFY((rc==(nelmts_toread*ELMT_SIZE)), "POSIXREAD"); + /* only care if seek returns error */ + rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0; + VRFY((rc==0), "POSIXSEEK"); + /* check if all bytes are read */ + rc = ((nelmts_toread*ELMT_SIZE) == + POSIXREAD(fd->posixfd, buffer, nelmts_toread*ELMT_SIZE)); + VRFY((rc != 0), "POSIXREAD"); break; case MPIO: diff --git a/perform/pio_perf.c b/perform/pio_perf.c index e44e2b8..72bfd06 100644 --- a/perform/pio_perf.c +++ b/perform/pio_perf.c @@ -1051,7 +1051,13 @@ parse_command_line(int argc, char *argv[]) cl_opts->num_iters = atoi(opt_arg); break; case 'n': /* Turn off writing fill values */ +#ifdef H5_HAVE_NOFILL cl_opts->h5_no_fill = 1; +#else + fprintf(stderr, "pio_perf: --no-fill not supported\n"); + usage(progname); + exit(1); +#endif break; case 'o': cl_opts->output_file = opt_arg; @@ -1147,7 +1153,7 @@ usage(const char *prog) MPI_Comm_rank(pio_comm_g, &myrank); if (myrank == 0) { - fflush(stdout); + print_version(prog); printf("usage: %s [OPTIONS]\n", prog); printf(" OPTIONS\n"); printf(" -h, --help Print a usage message and exit\n"); @@ -1164,6 +1170,7 @@ usage(const char *prog) printf(" -F N, --num-files=N Number of files [default: 1]\n"); printf(" -i, --num-iterations Number of iterations to perform [default: 1]\n"); printf(" -n, --no-fill Don't write fill values to HDF5 dataset\n"); + printf(" (Supported in HDF5 library v1.5 only)\n"); printf(" [default: off (i.e. write fill values)]\n"); printf(" -o F, --output=F Output raw data into file F [default: none]\n"); printf(" -P N, --max-num-processes=N Maximum number of processes to use\n"); @@ -1177,11 +1184,11 @@ usage(const char *prog) printf(" F - is a filename.\n"); printf(" N - is an integer >=0.\n"); printf(" S - is a size specifier, an integer >=0 followed by a size indicator:\n"); - printf(" K - Kilobyte\n"); - printf(" M - Megabyte\n"); - printf(" G - Gigabyte\n"); + printf(" K - Kilobyte (%d)\n", ONE_KB); + printf(" M - Megabyte (%d)\n", ONE_MB); + printf(" G - Gigabyte (%d)\n", ONE_GB); printf("\n"); - printf(" Example: 37M = 37 Megabytes\n"); + printf(" Example: 37M = 37 Megabytes = %d bytes\n", 37*ONE_MB); printf("\n"); printf(" AL - is an API list. Valid values are:\n"); printf(" phdf5 - Parallel HDF5\n"); diff --git a/perform/pio_perf.h b/perform/pio_perf.h index 89aa879..efb100d 100644 --- a/perform/pio_perf.h +++ b/perform/pio_perf.h @@ -10,6 +10,11 @@ #include "pio_timer.h" #include "H5private.h" +/* setup the dataset no fill option if this is v1.5 or more */ +#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4 +#define H5_HAVE_NOFILL 1 +#endif + typedef enum iotype_ { POSIXIO, MPIO, |