/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the files COPYING and Copyright.html. COPYING can be found at the root * * of the source code distribution tree; Copyright.html can be found at the * * root level of an installed copy of the electronic HDF5 document set and * * is linked from the top-level documents page. It can also be found at * * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * Programmer: Raymond Lu * Friday, Oct 3, 2004 * * Purpose: Tests performance of metadata */ #include "h5test.h" #include #ifdef H5_HAVE_PARALLEL #define MAINPROCESS (!mpi_rank) /* define process 0 as main process */ #endif /*H5_HAVE_PARALLEL*/ /* File_Access_type bits */ #define FACC_DEFAULT 0x0 /* serial as default */ #define FACC_MPIO 0x1 /* MPIO */ #define FACC_MPIPOSIX 0x8 /* MPIPOSIX */ const char *FILENAME[] = { "meta_perf_1.h5", "meta_perf_2.h5", "meta_perf_3.h5", "meta_perf_4.h5", NULL }; /* Default values for performance. Can be changed through command line options */ int NUM_DSETS = 16; int NUM_ATTRS = 8; int BATCH_ATTRS = 2; int nerrors = 0; /* errors count */ hid_t fapl; /* Data space IDs */ hid_t space; hid_t small_space; /* Performance data */ typedef struct p_time { double total; double avg; double max; double min; double start; char func[32]; } p_time; /*Test file access type for parallel. MPIO as default */ int facc_type = FACC_DEFAULT; double retrieve_time(void); void perf(p_time *perf_t, double start_t, double end_t); void print_perf(p_time, p_time, p_time); /*------------------------------------------------------------------------- * Function: parse_options * Purpose: Parse command line options * * Programmer: Raymond Lu * Friday, Oct 3, 2003 * * Modifications: * *------------------------------------------------------------------------- */ static int parse_options(int argc, char **argv) { /* Use default values */ if(argc==1) return(0); while (--argc){ if (**(++argv) != '-'){ break; }else{ switch(*(*argv+1)){ case 'h': /* Help page */ return(1); case 'd': /* Number of datasets */ NUM_DSETS = atoi((*argv+1)+1); if (NUM_DSETS < 0){ nerrors++; return(1); } break; case 'a': /* Number of attributes per dataset */ NUM_ATTRS = atoi((*argv+1)+1); if (NUM_ATTRS < 0){ nerrors++; return(1); } break; case 'n': /* Number of attributes to be created in batch */ BATCH_ATTRS = atoi((*argv+1)+1); if (BATCH_ATTRS < 0){ nerrors++; return(1); } break; case 'p': /* Use the MPI-POSIX driver access */ facc_type = FACC_MPIPOSIX; break; case 'm': /* Use the MPI-POSIX driver access */ facc_type = FACC_MPIO; break; default: nerrors++; return(1); } } } /*while*/ /* Check valid values */ if(facc_type == FACC_MPIO || facc_type == FACC_MPIPOSIX) #ifdef H5_HAVE_PARALLEL ; #else { nerrors++; return(1); } #endif /*H5_HAVE_PARALLEL*/ if(!NUM_DSETS) { nerrors++; return(1); } if((NUM_ATTRS && !BATCH_ATTRS) || (!NUM_ATTRS && BATCH_ATTRS)) { nerrors++; return(1); } if(NUM_ATTRS && BATCH_ATTRS) { if(BATCH_ATTRS > NUM_ATTRS || NUM_ATTRS % BATCH_ATTRS) { nerrors++; return(1); } } return(0); } /*------------------------------------------------------------------------- * Function: usage * Purpose: Prints help page * * Programmer: Raymond Lu * Friday, Oct 3, 2003 * * Modifications: * *------------------------------------------------------------------------- */ static void usage(void) { printf("Usage: perf_meta [-h] [-m] [-p] [-d] [-a] [-n\n"); printf("\t-h" "\t\t\thelp page.\n"); printf("\t-m" "\t\t\tset MPIO as the file driver when parallel HDF5 is enabled." " either -m or -p has be to specified when running parallel program\n"); printf("\t-p" "\t\t\tset MPI POSIX as the file driver when parallel HDF5 is enabled." " either -m or -p has be to specified when running parallel program\n"); printf("\t-d" "\tset number of datasets for meta data performance test\n"); printf("\t-a" "\tset number of attributes per dataset for meta data performance test\n"); printf("\t-n" "\tset batch of attributes for dataset for meta data performance test\n"); printf("\n"); } /*------------------------------------------------------------------------- * Function: create_dspace * * Purpose: Attempts to create data space. * * Return: Success: 0 * * Failure: -1 * * Programmer: Raymond Lu * Friday, Oct 3, 2003 * * Modifications: * *------------------------------------------------------------------------- */ static herr_t create_dspace(void) { hsize_t dims[2]; hsize_t small_dims[2]; /* Create the data space */ dims[0] = 256; dims[1] = 512; if((space = H5Screate_simple(2, dims, NULL)) < 0) goto error; /* Create a small data space for attributes */ small_dims[0] = 16; small_dims[1] = 8; if((small_space = H5Screate_simple(2, small_dims, NULL)) < 0) goto error; return 0; error: return -1; } /*------------------------------------------------------------------------- * Function: create_dsets * * Purpose: Attempts to create some datasets. * * Return: Success: 0 * * Failure: -1 * * Programmer: Raymond Lu * Friday, Oct 3, 2003 * * Modifications: * *------------------------------------------------------------------------- */ static herr_t create_dsets(hid_t file) { hid_t dataset; char dset_name[32]; int i; /* * Create a dataset using the default dataset creation properties. */ for(i=0; itotal += reduced_t; if(t_max > perf_t->max) perf_t->max = t_max; if(t_min < perf_t->min) perf_t->min = t_min; } #endif /*H5_HAVE_PARALLEL*/ } else { perf_t->total += t; if(t > perf_t->max) perf_t->max = t; if(t < perf_t->min) perf_t->min = t; } } /*------------------------------------------------------------------------- * Function: print_perf * * Purpose: Print out performance data. * * Programmer: Raymond Lu * Friday, Oct 3, 2003 * * Modifications: * *------------------------------------------------------------------------- */ void print_perf(p_time open_t, p_time close_t, p_time attr_t) { fprintf(stderr, "\t%s:\t\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n", open_t.func, open_t.avg, open_t.max, open_t.min); fprintf(stderr, "\tH5Dclose:\t\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n", close_t.avg, close_t.max, close_t.min); if(NUM_ATTRS) fprintf(stderr, "\tH5A(create & close):\tavg=%.6fs;\tmax=%.6fs;\tmin=%.6fs\n", attr_t.avg, attr_t.max, attr_t.min); } /*------------------------------------------------------------------------- * Function: main * * Purpose: Tests * * Return: Success: exit(0) * * Failure: exit(1) * * Programmer: Raymond Lu * Friday, Oct 3, 2003 * * Modifications: * *------------------------------------------------------------------------- */ int main(int argc, char **argv) { #ifdef H5_HAVE_PARALLEL int mpi_size, mpi_rank; /* mpi variables */ #endif /*H5_HAVE_PARALLEL*/ if(parse_options(argc, argv) != 0) { usage(); return 0; } if(facc_type == FACC_MPIO || facc_type == FACC_MPIPOSIX) { #ifdef H5_HAVE_PARALLEL MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); #endif /*H5_HAVE_PARALLEL*/ } #ifdef H5_HAVE_PARALLEL if (facc_type == FACC_DEFAULT || (facc_type != FACC_DEFAULT && MAINPROCESS)) #endif /*H5_HAVE_PARALLEL*/ fprintf(stderr, "\t\tPerformance result of metadata for datasets and attributes\n\n"); fapl = H5Pcreate (H5P_FILE_ACCESS); if(facc_type == FACC_MPIO || facc_type == FACC_MPIPOSIX) { #ifdef H5_HAVE_PARALLEL if(facc_type == FACC_DEFAULT || facc_type == FACC_MPIO) H5Pset_fapl_mpio(fapl, MPI_COMM_WORLD, MPI_INFO_NULL); else if(facc_type == FACC_MPIPOSIX) H5Pset_fapl_mpiposix(fapl, MPI_COMM_WORLD, FALSE); #endif /*H5_HAVE_PARALLEL*/ } nerrors += create_dspace()<0 ?1:0; nerrors += create_attrs_1()<0 ?1:0; nerrors += create_attrs_2()<0 ?1:0; if(NUM_ATTRS) nerrors += create_attrs_3()<0 ?1:0; if(BATCH_ATTRS) nerrors += create_attrs_4()<0 ?1:0; if (H5Sclose(space)<0) goto error; if (H5Sclose(small_space)<0) goto error; h5_cleanup(FILENAME, fapl); if(facc_type == FACC_MPIO || facc_type == FACC_MPIPOSIX) { #ifdef H5_HAVE_PARALLEL /* MPI_Finalize must be called AFTER H5close which may use MPI calls */ MPI_Finalize(); #endif /*H5_HAVE_PARALLEL*/ } if (nerrors) goto error; #ifdef H5_HAVE_PARALLEL if (facc_type != FACC_DEFAULT && MAINPROCESS) #endif /*H5_HAVE_PARALLEL*/ printf("All metadata performance tests passed.\n"); return 0; error: nerrors = MAX(1, nerrors); #ifdef H5_HAVE_PARALLEL if (facc_type != FACC_DEFAULT && MAINPROCESS) #endif /*H5_HAVE_PARALLEL*/ printf("***** %d PERFORMANCE TEST%s FAILED! *****\n", nerrors, 1 == nerrors ? "" : "S"); return 1; }