diff options
Diffstat (limited to 'testpar')
-rw-r--r-- | testpar/Makefile.am | 2 | ||||
-rw-r--r-- | testpar/Makefile.in | 19 | ||||
-rw-r--r-- | testpar/t_fphdf5.c | 1034 |
3 files changed, 6 insertions, 1049 deletions
diff --git a/testpar/Makefile.am b/testpar/Makefile.am index fca0d6f..18ee0a0 100644 --- a/testpar/Makefile.am +++ b/testpar/Makefile.am @@ -24,7 +24,7 @@ INCLUDES+=-I$(top_srcdir)/src -I$(top_srcdir)/test # Test programs and scripts. These are our main targets. # -TEST_PROG_PARA=t_mpi t_posix_compliant t_fphdf5 testphdf5 t_cache +TEST_PROG_PARA=t_mpi t_posix_compliant testphdf5 t_cache TEST_SCRIPT_PARA=testph5.sh check_PROGRAMS = $(TEST_PROG_PARA) diff --git a/testpar/Makefile.in b/testpar/Makefile.in index ea252e2..f3d0141 100644 --- a/testpar/Makefile.in +++ b/testpar/Makefile.in @@ -29,7 +29,7 @@ # # hdf5 Parallel Library Test Makefile(.in) # -SOURCES = t_cache.c t_fphdf5.c t_mpi.c t_posix_compliant.c $(testphdf5_SOURCES) +SOURCES = t_cache.c t_mpi.c t_posix_compliant.c $(testphdf5_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -66,17 +66,13 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/H5config.h CONFIG_CLEAN_FILES = testph5.sh am__EXEEXT_1 = t_mpi$(EXEEXT) t_posix_compliant$(EXEEXT) \ - t_fphdf5$(EXEEXT) testphdf5$(EXEEXT) t_cache$(EXEEXT) + testphdf5$(EXEEXT) t_cache$(EXEEXT) t_cache_SOURCES = t_cache.c t_cache_OBJECTS = t_cache.$(OBJEXT) t_cache_LDADD = $(LDADD) am__DEPENDENCIES_1 = $(top_builddir)/test/libh5test.la am__DEPENDENCIES_2 = $(top_builddir)/src/libhdf5.la t_cache_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) -t_fphdf5_SOURCES = t_fphdf5.c -t_fphdf5_OBJECTS = t_fphdf5.$(OBJEXT) -t_fphdf5_LDADD = $(LDADD) -t_fphdf5_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) t_mpi_SOURCES = t_mpi.c t_mpi_OBJECTS = t_mpi.$(OBJEXT) t_mpi_LDADD = $(LDADD) @@ -104,9 +100,8 @@ LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = t_cache.c t_fphdf5.c t_mpi.c t_posix_compliant.c \ - $(testphdf5_SOURCES) -DIST_SOURCES = t_cache.c t_fphdf5.c t_mpi.c t_posix_compliant.c \ +SOURCES = t_cache.c t_mpi.c t_posix_compliant.c $(testphdf5_SOURCES) +DIST_SOURCES = t_cache.c t_mpi.c t_posix_compliant.c \ $(testphdf5_SOURCES) ETAGS = etags CTAGS = ctags @@ -359,7 +354,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog MPItest.h5 Para*.h5 # Test programs and scripts. These are our main targets. # -TEST_PROG_PARA = t_mpi t_posix_compliant t_fphdf5 testphdf5 t_cache +TEST_PROG_PARA = t_mpi t_posix_compliant testphdf5 t_cache TEST_SCRIPT_PARA = testph5.sh check_SCRIPTS = $(TEST_SCRIPT) testphdf5_SOURCES = testphdf5.c t_dset.c t_file.c t_mdset.c t_ph5basic.c \ @@ -431,9 +426,6 @@ clean-checkPROGRAMS: t_cache$(EXEEXT): $(t_cache_OBJECTS) $(t_cache_DEPENDENCIES) @rm -f t_cache$(EXEEXT) $(LINK) $(t_cache_LDFLAGS) $(t_cache_OBJECTS) $(t_cache_LDADD) $(LIBS) -t_fphdf5$(EXEEXT): $(t_fphdf5_OBJECTS) $(t_fphdf5_DEPENDENCIES) - @rm -f t_fphdf5$(EXEEXT) - $(LINK) $(t_fphdf5_LDFLAGS) $(t_fphdf5_OBJECTS) $(t_fphdf5_LDADD) $(LIBS) t_mpi$(EXEEXT): $(t_mpi_OBJECTS) $(t_mpi_DEPENDENCIES) @rm -f t_mpi$(EXEEXT) $(LINK) $(t_mpi_LDFLAGS) $(t_mpi_OBJECTS) $(t_mpi_LDADD) $(LIBS) @@ -455,7 +447,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_coll_chunk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_dset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_file.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_fphdf5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_mdset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_mpi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_ph5basic.Po@am__quote@ diff --git a/testpar/t_fphdf5.c b/testpar/t_fphdf5.c deleted file mode 100644 index b1e9535..0000000 --- a/testpar/t_fphdf5.c +++ /dev/null @@ -1,1034 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Flexible Parallel HDF5 test: Create a file using the FPHDF5 file - * driver. Populate it with groups and datasets to make sure that FPHDF5 - * can handle it. - * - * Author: - * Bill Wendling (wendling@ncsa.uiuc.edu) - * 20. February 2003 - */ -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "testphdf5.h" - -#ifdef H5_HAVE_FPHDF5 - -/*===----------------------------------------------------------------------=== - * Local Functions - *===----------------------------------------------------------------------=== - */ -static hid_t create_file(const char *filename); -static hid_t create_group(hid_t loc, const char *grp_name, size_t size_hint); -static hid_t create_dset(hid_t loc, const char *dset_name); -static void access_dset(hid_t loc, const char *dset_name); -static void slab_set(hsize_t start[], hsize_t count[], - hsize_t stride[], hsize_t block[]); -static void fill_data(void); -static void write_data(hid_t loc, const char *dset_name, - hsize_t start[], hsize_t count[], - hsize_t stride[], hsize_t block[]); -static void verify_complete_dataset(hid_t loc, const char *dset_name); -static void verify_partial_dataset(hid_t loc, const char *dset_name, - hsize_t start[], hsize_t count[], - hsize_t stride[], hsize_t block[], - int * buf, hsize_t buf_len); -static void test_group_creation(hid_t loc); -static void test_dataset_creation(hid_t loc); -static void test_dataset_access(hid_t loc); -static void test_dataset_write(hid_t loc); -static void usage(const char *prog); - -/*===----------------------------------------------------------------------=== - * Filenames - *===----------------------------------------------------------------------=== - * The names of the test files for - */ -static const char *FILENAME[2] = { /* List of files we want to create */ - "FPHDF5Test", - NULL -}; -static char filenames[2][PATH_MAX]; /* "Fixed" filenames */ - -/*===----------------------------------------------------------------------=== - * Global Variables - *===----------------------------------------------------------------------=== - */ -#ifdef RANK -#undef RANK -#endif /* RANK */ -#ifdef DIM0 -#undef DIM0 -#endif /* !DIM0 */ -#ifdef DIM1 -#undef DIM1 -#endif /* !DIM1 */ - -enum { - SAP_RANK = 1, /* The rank acting as the SAP */ - RANK = 2, - DIM0 = 6, - DIM1 = 12 -}; - -int nerrors = 0; /* Errors count */ -int verbose = 0; /* Verbose, default is no */ - -static MPI_Comm SAP_Comm = MPI_COMM_NULL; /* COMM for FPHDF5 */ -static MPI_Comm SAP_Barrier_Comm = MPI_COMM_NULL; /* COMM used in barriers*/ - -static hid_t fapl = -1; /* FPHDF5 file access property list */ -static int mpi_rank; /* Rank of this process */ -static int mpi_size; /* Size of the COMM passed to FPHDF5 */ -static int *orig_data = NULL; /* Data that's written to datasets */ -static int *local_orig_data = NULL; /* data that's written to datasets */ - /* by this process. */ - -/* dimensions of file data space -- initialized in slab_set() */ -static hsize_t dims[RANK] = {0, 0}; - -/* Hyperslab settings */ -static hsize_t start[RANK]; -static hsize_t count[RANK]; -static hsize_t stride[RANK]; -static hsize_t block[RANK]; - -static const char *progname = "t_fphdf5"; - -/* Dataset Name Template */ -static const char *dset_tmpl = "Dataset %d"; -static char dset_name[128]; - -/* Group Name Template */ -static const char *grp_tmpl = "Process %d's Datasets"; -static char grp_name[128]; - -#if 0 -/* A useful debugging function, but no need to compile it unless - * we are going to use it. JRM - 4/13/4 - */ -/*------------------------------------------------------------------------- - * Function: check_globals - * Purpose: Debugging Function. Check the current values of some - * globals, and generate a message when they change. - * Return: void - * Programmer: John Mainzer - 3/3/04 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -check_globals(char * location_name) -{ - static hsize_t local_dims[RANK] = {0,0}; - static hsize_t local_start[RANK] = {0,0}; - static hsize_t local_count[RANK] = {0,0}; - static hsize_t local_stride[RANK] = {0,0}; - static hsize_t local_block[RANK] = {0,0}; - - if ( ( dims[0] != local_dims[0] ) || - ( dims[1] != local_dims[1] ) || - ( start[0] != local_start[0] ) || - ( start[1] != local_start[1] ) || - ( count[0] != local_count[0] ) || - ( count[1] != local_count[1] ) || - ( stride[0] != local_stride[0] ) || - ( stride[1] != local_stride[1] ) || - ( block[0] != local_block[0] ) || - ( block[1] != local_block[1] ) ) { - printf("%d: globals have changed at %s.\n old: dims=[%d,%d], start=[%d,%d], count=[%d, %d], stride=[%d,%d], block=[%d,%d]\n new: dims=[%d,%d], start=[%d,%d], count=[%d, %d], stride=[%d,%d], block=[%d,%d]\n", - mpi_rank, - location_name, - (int)(local_dims[0]), (int)(local_dims[1]), - (int)(local_start[0]), (int)(local_start[1]), - (int)(local_count[0]), (int)(local_count[1]), - (int)(local_stride[0]), (int)(local_stride[1]), - (int)(local_block[0]), (int)(local_block[1]), - (int)(dims[0]), (int)(dims[1]), - (int)(start[0]), (int)(start[1]), - (int)(count[0]), (int)(count[1]), - (int)(stride[0]), (int)(stride[1]), - (int)(block[0]), (int)(block[1])); - local_dims[0] = dims[0]; - local_dims[1] = dims[1]; - local_start[0] = start[0]; - local_start[1] = start[1]; - local_count[0] = count[0]; - local_count[1] = count[1]; - local_stride[0] = stride[0]; - local_stride[1] = stride[1]; - local_block[0] = block[0]; - local_block[1] = block[1]; - } - return; -} /* check_globals() */ -#endif - - -#if 0 -/* Another useful debugging function, again no need to compile it unless - * we are going to use it. JRM - 4/13/04 - */ -/*------------------------------------------------------------------------- - * Function: print_globals - * Purpose: Debugging Function. Display the current values of some - * globals. - * Return: void - * Programmer: John Mainzer - 3/9/04 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -print_globals(void) -{ - printf("%d: dims=[%d,%d], start=[%d,%d], count=[%d, %d], stride=[%d,%d], block=[%d,%d]\n", - (int)mpi_rank, - (int)(dims[0]), (int)(dims[1]), - (int)(start[0]), (int)(start[1]), - (int)(count[0]), (int)(count[1]), - (int)(stride[0]), (int)(stride[1]), - (int)(block[0]), (int)(block[1])); - return; -} /* print_globals() */ -#endif - -/*------------------------------------------------------------------------- - * Function: create_file - * Purpose: Create a new file with the given filename. - * Return: Success: Valid file ID - * Failure: -1 - * Programmer: Bill Wendling - * 29. October 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static hid_t -create_file(const char *filename) -{ - hid_t fid = -1; - - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - VRFY((fid >= 0), "H5Fcreate"); - printf("%d: Created file %s\n", mpi_rank, filename); - return fid; -} - -/*------------------------------------------------------------------------- - * Function: create_group - * Purpose: Helper function that creates a group at the given - * location with the given name and size_hint. - * Return: Success: The handle to the new group - * Failure: Aborts - * Programmer: Bill Wendling - * 29. October 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static hid_t -create_group(hid_t loc, const char *group_name, size_t size_hint) -{ - hid_t group; - - VRFY(((group = H5Gcreate(loc, group_name, size_hint)) >= 0), "H5Gcreate"); - printf("%d: Created group \"%s\"\n", mpi_rank, group_name); - return group; -} - -/*------------------------------------------------------------------------- - * Function: create_dset - * Purpose: Helper function that creates a dataset at the given - * location with the given name and dimensions - * Return: Success: The handle to the new dataset - * Failure: Aborts - * Programmer: Bill Wendling - * 29. October 2003 - * Modifications: - * Altered function to use the global dims array, instead - * of a locally declared and initialized version. - * JRM - 3/3/04 - *------------------------------------------------------------------------- - */ -static hid_t -create_dset(hid_t loc, const char *dataset_name) -{ - hid_t dset, sid; - - VRFY((dims[0] != 0), "dims array initialized."); - - VRFY(((sid = H5Screate_simple(RANK, dims, NULL)) >= 0), "H5Screate_simple"); - printf("%d: Created simple dataspace\n", mpi_rank); - - dset = H5Dcreate(loc, dataset_name, H5T_NATIVE_INT, sid, H5P_DEFAULT); - VRFY((dset >= 0), "H5Dcreate"); - printf("%d: Created dataset \"%s\"\n", mpi_rank, dataset_name); - - VRFY((H5Sclose(sid) >= 0), "H5Sclose"); - return dset; -} - -/*------------------------------------------------------------------------- - * Function: access_dset - * Purpose: Quickly check to see if we can access this dataset. - * Return: Nothing, but aborts if an error occurs. - * Programmer: Bill Wendling - * 03. November 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -access_dset(hid_t loc, const char *dataset_name) -{ - hid_t dataset; - - VRFY(((dataset = H5Dopen(loc, dataset_name)) >= 0), "H5Dopen"); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); -} - -/*------------------------------------------------------------------------- - * Function: slab_set - * Purpose: Setup the dimensions of the hyperslab. - * Return: Nothing - * Programmer: Bill Wendling - * 05. November 2003 - * Modifications: - * Modified function to initialize the dims array. Also - * altered the initialization of block[0] so that the - * the test program will run with mpi_size > 6. - * JRM - 3/3/04 - *------------------------------------------------------------------------- - */ -static void -slab_set(hsize_t my_start[], hsize_t my_count[], hsize_t my_stride[], hsize_t my_block[]) -{ - /* initialize dims according to the number of processes: */ - dims[0] = DIM0 * mpi_size; - dims[1] = DIM1; - - /* Each process takes a slab of rows. */ - my_block[0] = DIM0; - my_block[1] = DIM1; - - my_stride[0] = my_block[0]; - my_stride[1] = my_block[1]; - - my_count[0] = 1; - my_count[1] = 1; - - my_start[0] = mpi_rank * my_block[0]; - my_start[1] = 0; -} - -/*------------------------------------------------------------------------- - * Function: fill_data - * Purpose: Fill data buffer with some data. - * Return: Nothing - * Programmer: Bill Wendling - * 13. November 2003 - * Modifications: - * Complete re-write of function. The orig_data array is - * now allocated (in main) with size equal the size of the - * array on file, and is loaded with the data we expect to - * find there. - * - * The new local_orig_data array is allocated to match the - * size of this processes contribution to the on file data - * set, and is loaded with this processes data. - * - * Note how mpi_rank, row, and column are encoded in each - * cell of the arrays. - * JRM - 3/8/04 - *------------------------------------------------------------------------- - */ -static void -fill_data(void) -{ - int col; - int row; - int offset = 0; - int local_offset = 0; - int proc_num = -1; - - for ( proc_num = 0; proc_num < mpi_size; proc_num++ ) { - for ( row = 0 ; row < DIM0; row++ ) { - if ( proc_num == SAP_RANK ) { - for ( col = 0; col < DIM1; col++ ) { - /* The SAP doesn't write to file, so its section */ - /* of the matrix will be filled with zeros. */ - orig_data[offset++] = 0; - } - } else if ( proc_num == mpi_rank ) { - for ( col = 0; col < DIM1; col++ ) { - local_orig_data[local_offset++] = - orig_data[offset++] = - (proc_num * 1000) + (row * 100) + col; - } - } else { - for ( col = 0; col < DIM1; col++ ) { - orig_data[offset++] = (proc_num * 1000) + (row * 100) + col; - } - } - } - } - - VRFY((offset == (mpi_size * DIM0 * DIM1)), "offset OK"); - VRFY((local_offset == (DIM0 * DIM1)), "local_offset OK"); - - return; - -} /* fill_data() */ - -/*------------------------------------------------------------------------- - * Function: write_data - * Purpose: Writes data to a dataset. - * Return: Nothing, but aborts if an error occurs. - * Programmer: Bill Wendling - * 29. October 2003 - * Modifications: - * Modified to use local_orig_data, instead of initializing - * a portion of orig_data. Also removed some orphan code. - * JRM - 3/8/04 - *------------------------------------------------------------------------- - */ -static void -write_data(hid_t loc, const char *dataset_name, hsize_t my_start[], hsize_t my_count[], - hsize_t my_stride[], hsize_t my_block[]) -{ - herr_t hrc; - hid_t file_dataspace, mem_dataspace; - hid_t dataset; - - /* See if dataset is there */ - VRFY(((dataset = H5Dopen(loc, dataset_name)) >= 0), "H5Dopen"); - - file_dataspace = H5Dget_space(dataset); - VRFY((file_dataspace >= 0), "H5Dget_space"); - - hrc = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, - my_start, my_stride, my_count, my_block); -#if 0 - /* some debugging code we may want to keep for a time. JRM - 4/13/04 */ - if ( hrc < 0 ) { /* dump the parameters */ - printf("%d: start=[%d,%d], count=[%d, %d], stride=[%d,%d], block=[%d,%d]\n", - mpi_rank, - (int)(my_start[0]), (int)(my_start[1]), - (int)(my_count[0]), (int)(my_count[1]), - (int)(my_stride[0]), (int)(my_stride[1]), - (int)(my_block[0]), (int)(my_block[1])); - } -#endif - VRFY((hrc >= 0), "H5Sselect_hyperslab in write_data"); - - /* create a memory dataspace independently */ - mem_dataspace = H5Screate_simple(RANK, my_block, NULL); - VRFY((mem_dataspace >= 0), "H5Screate_simple"); - - hrc = H5Dwrite(dataset, H5T_NATIVE_INT, mem_dataspace, - file_dataspace, H5P_DEFAULT, local_orig_data); - VRFY((hrc >= 0), "H5Dwrite"); - - VRFY((H5Sclose(mem_dataspace) >= 0), "H5Sclose"); - VRFY((H5Sclose(file_dataspace) >= 0), "H5Sclose"); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - -} /* write_data() */ - -/*------------------------------------------------------------------------- - * Function: verify_complete_dataset - * Purpose: Verify that all the data in the dataset is correct -- - * including that written by other processes. - * Return: Nothing - * Programmer: John Mainzer - * 3/8/04 - * Modifications: - * None. - *------------------------------------------------------------------------- - */ -static void -verify_complete_dataset(hid_t loc, const char *dataset_name) -{ - hid_t dataset; - int *data_array = NULL; - size_t data_array_len = 0; - unsigned col; - unsigned row; - int offset = 0; - int vrfyerrs = 0; - - /* Open the dataset */ - VRFY(((dataset = H5Dopen(loc, dataset_name)) >= 0), "H5Dopen"); - - /* allocate a buffer to receive the contents of the file dataset */ - VRFY((dims[0] != 0), "dims array initialized."); - data_array_len = ((size_t)dims[0]) * ((size_t)dims[1]) * sizeof(int); - data_array = (int *)malloc(data_array_len); - VRFY((data_array != NULL), "data_array allocated."); - - /* Read the dataset */ - VRFY((H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, - H5P_DEFAULT, data_array) >= 0), "H5Dread"); - - - /* Verify the contents of the dataset */ - for ( row = 0; row < dims[0]; row++ ) { - for ( col = 0; col < DIM1; col++ ) { - if ( data_array[offset] != orig_data[offset] ) { - if ( vrfyerrs++ < MAX_ERR_REPORT ) { - fprintf(stdout, "%d: Dataset Verify failed at " - "row %u, col %u: expect %d, got %d\n", mpi_rank, - row, col, orig_data[offset], data_array[offset]); - } - } - offset++; - } - } - VRFY((offset == (mpi_size * DIM0 * DIM1)), "offset OK"); - - if (vrfyerrs) { - fprintf(stdout, "%d: %d errors found in verify_complete_dataset\n", - mpi_rank, vrfyerrs); - ++nerrors; - } - - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - - if ( data_array != NULL ) { - free(data_array); - } - - return; - -} /* verify_complete_dataset() */ - -/*------------------------------------------------------------------------- - * Function: verify_partial_dataset - * Purpose: Verify that the data in the specified section of the - * dataset matches the contents of the provided buffer. - * Return: Nothing - * Programmer: John Mainzer - * 3/8/04 - * Modifications: - * None. - *------------------------------------------------------------------------- - */ -static void -verify_partial_dataset(hid_t loc, const char *dataset_name, - hsize_t my_start[], hsize_t my_count[], - hsize_t my_stride[], hsize_t my_block[], - int * buf, hsize_t buf_len) -{ - hid_t dataset, file_dataspace, mem_dataspace; - int *data_array; - unsigned col; - unsigned row; - hsize_t offset = 0; - int vrfyerrs = 0; - - /* Open the dataset */ - VRFY(((dataset = H5Dopen(loc, dataset_name)) >= 0), "H5Dopen"); - - /* Create a file dataspace */ - file_dataspace = H5Dget_space(dataset); - VRFY((file_dataspace >= 0), "H5Dget_space"); - VRFY((H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, - my_start, my_stride, my_count, my_block) >= 0), - "H5Sselect_hyperslab in verify_partial_dataset"); - - /* Create a memory dataspace */ - mem_dataspace = H5Screate_simple(RANK, my_block, NULL); - VRFY((mem_dataspace >= 0), "H5Screate_simple"); - VRFY(((block[0] * block[1]) == buf_len), "buf_len matches."); - - /* Read the dataset */ - VRFY((dims[0] != 0), "dims array initialized."); - data_array = (int *)malloc(((size_t)block[0]) * - ((size_t)block[1]) * - sizeof(int)); - VRFY((H5Dread(dataset, H5T_NATIVE_INT, mem_dataspace, file_dataspace, - H5P_DEFAULT, data_array) >= 0), "H5Dread"); - - /* Verify the contents of the dataset */ - for ( row = 0; row < block[0]; row++ ) { - for ( col = 0; col < block[1]; col++ ) { - if ( data_array[offset] != buf[offset] ) { - if ( vrfyerrs++ < MAX_ERR_REPORT ) { - fprintf(stdout, "%d: Dataset Verify failed at " - "row %u, col %u: expected %d, got %d\n", mpi_rank, - row, col, buf[offset], data_array[offset]); - } - } - offset++; - } - } - VRFY((offset == buf_len), "offset OK"); - - if (vrfyerrs) { - fprintf(stdout, "%d: %d errors found in verify_partial_dataset\n", - mpi_rank, vrfyerrs); - ++nerrors; - } - - VRFY((H5Sclose(mem_dataspace) >= 0), "H5Sclose"); - VRFY((H5Sclose(file_dataspace) >= 0), "H5Sclose"); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - - if ( data_array != NULL ) { - free(data_array); - } - - return; - -} /* verify_partial_dataset() */ - -/*------------------------------------------------------------------------- - * Function: test_group_creation - * Purpose: Test creation of multiple groups in the file. - * Return: Nothing - * Programmer: Bill Wendling - * 11. November 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -test_group_creation(hid_t loc) -{ - if (mpi_rank == 0) { - int i; - - for (i = 0; i < mpi_size; ++i) - if (i != SAP_RANK) { - hid_t group; - - sprintf(grp_name, grp_tmpl, i); - group = create_group(loc, grp_name, 4); - VRFY((H5Gclose(group) >= 0), "H5Gclose"); - } - } - - SYNC(SAP_Barrier_Comm); - -} /* test_group_creation() */ - -/*------------------------------------------------------------------------- - * Function: test_dataset_creation - * Purpose: Test simultaneous creation of multiple datasets in a - * non-root group. - * Return: Nothing - * Programmer: Bill Wendling - * 11. November 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -test_dataset_creation(hid_t loc) -{ - hid_t dataset, group; - - sprintf(grp_name, grp_tmpl, mpi_rank); - group = H5Gopen(loc, grp_name); - VRFY((group >= 0), "H5Gopen"); - - sprintf(dset_name, dset_tmpl, 0); - dataset = create_dset(group, dset_name); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - - /* Create 3x5x(mpi_size) dataset */ - sprintf(dset_name, dset_tmpl, 1); - dataset = create_dset(group, dset_name); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - - /* Create 2x4x(mpi_size) dataset */ - sprintf(dset_name, dset_tmpl, 2); - dataset = create_dset(group, dset_name); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - - /* Create 5x7x(mpi_size) dataset */ - sprintf(dset_name, dset_tmpl, 3); - dataset = create_dset(group, dset_name); - VRFY((H5Dclose(dataset) >= 0), "H5Dclose"); - VRFY((H5Gclose(group) >= 0), "H5Gclose"); - - SYNC(SAP_Barrier_Comm); -} /* test_dataset_creation() */ - -/*------------------------------------------------------------------------- - * Function: test_dataset_access - * Purpose: Test that we can access the datasets in the file from all - * processes. - * Return: Nothing - * Programmer: Bill Wendling - * 11. November 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -test_dataset_access(hid_t loc) -{ - int i; - - for (i = 0; i < mpi_size; ++i) - if (i != SAP_RANK) { - hid_t group; - - sprintf(grp_name, grp_tmpl, i); - VRFY(((group = H5Gopen(loc, grp_name)) >= 0), "H5Gopen"); - - sprintf(dset_name, dset_tmpl, 0); - printf("%d: Accessing dataset \"%s/%s\"\n", mpi_rank, grp_name, dset_name); - access_dset(group, dset_name); - - sprintf(dset_name, dset_tmpl, 1); - printf("%d: Accessing dataset \"%s/%s\"\n", mpi_rank, grp_name, dset_name); - access_dset(group, dset_name); - - sprintf(dset_name, dset_tmpl, 2); - printf("%d: Accessing dataset \"%s/%s\"\n", mpi_rank, grp_name, dset_name); - access_dset(group, dset_name); - - sprintf(dset_name, dset_tmpl, 3); - printf("%d: Accessing dataset \"%s/%s\"\n", mpi_rank, grp_name, dset_name); - access_dset(group, dset_name); - - VRFY((H5Gclose(group) >= 0), "H5Gclose"); - } - - SYNC(SAP_Barrier_Comm); -} /* test_dataset_access() */ - -/*------------------------------------------------------------------------- - * Function: test_dataset_write - * Purpose: Test that we can write to the datasets in the file from - * all processes simultaneously. - * Return: Nothing - * Programmer: Bill Wendling - * 11. November 2003 - * Modifications: - * Replaced calls to verify_dataset() with calls to - * verify_partial_dataset(). In the absence of a barrier, - * we don't know that the other processes have done their - * writes to the datasets as well. Thus we only check the - * data we have written for now. - * - * Also re-formatted code in passing. JRM - 3/8/04 - *------------------------------------------------------------------------- - */ -static void -test_dataset_write(hid_t loc) -{ - int i; - - /*===-------------------------------------------------------------------=== - * All processes write to each dataset. - *===-------------------------------------------------------------------=== - */ - for (i = 0; i < mpi_size; ++i) { - if (i != SAP_RANK) { - hid_t group; - - sprintf(grp_name, grp_tmpl, i); - VRFY(((group = H5Gopen(loc, grp_name)) >= 0), "H5Gopen"); - - /* Write to this dataset */ - sprintf(dset_name, dset_tmpl, 0); - printf("%d: Writing to \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - write_data(group, dset_name, start, count, stride, block); - printf("%d: Verifying dataset \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - verify_partial_dataset(group, dset_name, - start, count, stride, block, - local_orig_data, (block[0] * block[1])); - - sprintf(dset_name, dset_tmpl, 1); - printf("%d: Writing to \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - write_data(group, dset_name, start, count, stride, block); - printf("%d: Verifying dataset \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - verify_partial_dataset(group, dset_name, - start, count, stride, block, - local_orig_data, (block[0] * block[1])); - - sprintf(dset_name, dset_tmpl, 2); - printf("%d: Writing to \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - write_data(group, dset_name, start, count, stride, block); - printf("%d: Verifying dataset \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - verify_partial_dataset(group, dset_name, - start, count, stride, block, - local_orig_data, (block[0] * block[1])); - - sprintf(dset_name, dset_tmpl, 3); - printf("%d: Writing to \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - write_data(group, dset_name, start, count, stride, block); - printf("%d: Verifying dataset \"/%s/%s\"\n", - mpi_rank, grp_name, dset_name); - verify_partial_dataset(group, dset_name, - start, count, stride, block, - local_orig_data, (block[0] * block[1])); - - /* Close the group */ - VRFY((H5Gclose(group) >= 0), "H5Gclose"); - } - } -} /* test_dataset_write() */ - -/*------------------------------------------------------------------------- - * Function: usage - * Purpose: Print a usage message. - * Return: Nothing - * Programmer: Bill Wendling - * 11. November 2003 - * Modifications: - *------------------------------------------------------------------------- - */ -static void -usage(const char *prog) -{ - if (mpi_rank == 0) { - fprintf(stderr, "usage: %s [OPTIONS]\n", prog); - fprintf(stderr, " OPTIONS\n"); - fprintf(stderr, " -h, --help Print a usage message and exit\n"); - fprintf(stderr, " -v, --verbose Verbose output [default: no]\n"); - fprintf(stderr, "\n"); - fflush(stdout); - } -} - -/*------------------------------------------------------------------------- - * Function: main - * Purpose: Parse the command line variables and run the test - * program. - * Return: Success: 0 - * Failure: >0 - * Programmer: Bill Wendling - * 11. November 2003 - * Modifications: - * Moved the malloc of orig_data to just after the call to - * slab_set(), and modified the call to use the global dims - * array instead of the DIM0 and DIM1 constants. - * JRM - 3/3/04 - * - * Added the allocation and deletion of local_orig_data. - * This array is used to store the data written by this - * process. JRM - 3/5/04 - * - * Replaced calls to verify_dataset() with calls to - * verify_complete_dataset(). JRM - 3/8/04 - *------------------------------------------------------------------------- - */ -int -main(int argc, char *argv[]) -{ - hid_t fid; - herr_t hrc; - int nargs; - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); - MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); - - H5open(); - - for (nargs = argc; nargs > 1; --nargs) - if (strcmp(argv[nargs - 1], "-v") == 0 || - strcmp(argv[nargs - 1], "--verbose") == 0 || - strcmp(argv[nargs - 1], "--verbos") == 0 || - strcmp(argv[nargs - 1], "--verbo") == 0 || - strcmp(argv[nargs - 1], "--verb") == 0 || - strcmp(argv[nargs - 1], "--ver") == 0 || - strcmp(argv[nargs - 1], "--ve") == 0) { - verbose = 1; - } else if (strcmp(argv[nargs - 1], "-h") == 0 || - strcmp(argv[nargs - 1], "--help") == 0 || - strcmp(argv[nargs - 1], "--hel") == 0 || - strcmp(argv[nargs - 1], "--he") == 0) { - usage(progname); - return 0; - } else { - fprintf(stderr, "Unknown option: %s\n", argv[nargs - 1]); - usage(progname); - return 1; - } - - h5_show_hostname(); - - if (MAINPROCESS) { - printf("===================================\n"); - printf("FPHDF5 functionality tests\n"); - printf("===================================\n"); - } - - hrc = H5FPinit(MPI_COMM_WORLD, SAP_RANK, &SAP_Comm, &SAP_Barrier_Comm); - VRFY((hrc == MPI_SUCCESS), "H5FP_init"); - printf("%d: Initialized FPHDF5\n", mpi_rank); - - if (mpi_rank != SAP_RANK) { - /* - * Setup the file access property list that's used to create the - * file. - */ - unsigned i; - - fapl = H5Pcreate(H5P_FILE_ACCESS); - VRFY((fapl >= 0), "H5Pcreate"); - printf("%d: Created access property list\n", mpi_rank); - - hrc = H5Pset_fapl_fphdf5(fapl, SAP_Comm, SAP_Barrier_Comm, - MPI_INFO_NULL, (unsigned)SAP_RANK); - VRFY((fapl >= 0), "H5Pset_fapl_fphdf5"); - printf("%d: Set access property list\n", mpi_rank); - - slab_set(start, count, stride, block); - - VRFY((dims[0] != 0), "dims array initialized."); - orig_data = (int *)malloc(((size_t)dims[0]) * - ((size_t)dims[1]) * - sizeof(int)); - VRFY((orig_data != NULL), "orig_data malloc succeeded"); - - VRFY((block[0] != 0), "block array initialized."); - local_orig_data = (int *)malloc(((size_t)block[0]) * - ((size_t)block[1]) * - sizeof(int)); - VRFY((orig_data != NULL), "local_orig_data malloc succeeded"); - - fill_data(); - - for (i = 0; i < sizeof(FILENAME) / sizeof(FILENAME[0]) - 1; ++i) { - if (h5_fixname(FILENAME[i], fapl, filenames[i], sizeof(filenames[i])) == NULL) { - fprintf(stderr, "h5_fixname failed\n"); - ++nerrors; - break; - } - - fid = create_file(filenames[i]); - - if (fid < 0) - break; - - test_group_creation(fid); - test_dataset_creation(fid); - test_dataset_access(fid); - test_dataset_write(fid); - - VRFY((H5Fclose(fid) >= 0), "H5Fclose"); - SYNC(SAP_Barrier_Comm); - printf("%d: Closed file\n", mpi_rank); - - fid = H5Fopen(filenames[i], H5F_ACC_RDONLY, fapl); - VRFY((fid >= 0), "H5Fopen"); - SYNC(SAP_Barrier_Comm); - - /*===------------------------------------------------------------=== - * Reverify that the data is still "correct" - *===------------------------------------------------------------=== - */ - for (i = 0; i < (unsigned)mpi_size; ++i) - if (i != SAP_RANK) { - hid_t group; - - sprintf(grp_name, grp_tmpl, i); - VRFY(((group = H5Gopen(fid, grp_name)) >= 0), "H5Gopen"); - - - /* Write to this dataset */ - sprintf(dset_name, dset_tmpl, 0); - printf("%d: Reverifying dataset \"/%s/%s\"\n", mpi_rank, - grp_name, dset_name); - verify_complete_dataset(group, dset_name); - - sprintf(dset_name, dset_tmpl, 1); - printf("%d: Reverifying dataset \"/%s/%s\"\n", mpi_rank, - grp_name, dset_name); - verify_complete_dataset(group, dset_name); - - sprintf(dset_name, dset_tmpl, 2); - printf("%d: Reverifying dataset \"/%s/%s\"\n", mpi_rank, - grp_name, dset_name); - verify_complete_dataset(group, dset_name); - - sprintf(dset_name, dset_tmpl, 3); - printf("%d: Reverifying dataset \"/%s/%s\"\n", mpi_rank, - grp_name, dset_name); - verify_complete_dataset(group, dset_name); - - /* Close the group */ - printf("%d: Closing group.", mpi_rank); - VRFY((H5Gclose(group) >= 0), "H5Gclose"); - } - - SYNC(SAP_Barrier_Comm); - VRFY((H5Fclose(fid) >= 0), "H5Fclose"); - } - - if ( orig_data != NULL ) { - free(orig_data); - } - if ( local_orig_data != NULL ) { - free(local_orig_data); - } -#if 1 - /* It is useful to keep the hdf file created by this test for - * debugging purposes. However, this code should always be - * turned on for checkin. JRM - 4/13/04 - */ - if (fapl > -1) - h5_cleanup(FILENAME, fapl); -#endif - } - - VRFY((H5FPfinalize() >= 0), "H5FPfinalize"); - printf("%d: H5FP finalized\n", mpi_rank); - - if (MAINPROCESS) { /* only process 0 reports */ - fprintf(stderr, "===================================\n"); - - if (nerrors) - fprintf(stderr, "***FPHDF5 test detected %d errors***\n", nerrors); - else - fprintf(stderr, "FPHDF5 test finished with no errors\n"); - - fprintf(stderr, "===================================\n"); - } - - H5close(); - MPI_Finalize(); - return nerrors; -} - -#else - -/* Dummy program since FPHDF5 is not configured in */ -int -main(int argc, char *argv[]) -{ - int mpi_rank; - - MPI_Init(&argc, &argv); - MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); - - if (mpi_rank == 0) - printf("No t_fphdf5 test because FPHDF5 is not configured in\n"); - - MPI_Finalize(); - return 0; -} -#endif /* H5_HAVE_FPHDF5 */ |