diff --git a/src/h5core/h5_attach.c b/src/h5core/h5_attach.c index 486075c..33a85b5 100644 --- a/src/h5core/h5_attach.c +++ b/src/h5core/h5_attach.c @@ -30,9 +30,9 @@ h5_add_attachment ( h5_file_p f = (h5_file_p)f_; H5_CORE_API_ENTER (h5_err_t, "f=%p, fname='%s'", f, fname); // allowed file modes: O_RDWR, O_WRONLY; O_APPEND - if (f->props->mode == H5_O_RDONLY) { + if (f->props->flags & H5_O_RDONLY) { H5_PRIV_FUNC_LEAVE ( - h5priv_handle_file_mode_error (f->props->mode)); + h5priv_handle_file_mode_error (f->props->flags)); } struct stat st; @@ -86,11 +86,9 @@ h5_add_attachment ( TRY (loc_id = h5priv_open_group (1, f->file, H5_ATTACHMENT)); h5_err_t exists; TRY (exists = hdf5_link_exists (loc_id, fname)); - if (exists && (f->props->mode == H5_O_RDWR || f->props->mode == H5_O_WRONLY)) { - // remove - } else if (exists && f->props->mode == H5_O_APPEND) { + if (exists && (f->props->flags & H5_O_APPENDONLY)) { H5_PRIV_FUNC_LEAVE ( - h5priv_handle_file_mode_error (f->props->mode)); + h5priv_handle_file_mode_error (f->props->flags)); } hid_t diskspace_id; TRY (diskspace_id = hdf5_create_dataspace (1, &fsize, &fsize)); @@ -227,18 +225,18 @@ h5_get_attachment ( H5_CORE_API_ENTER (h5_err_t, "f=%p, fname='%s'", f, fname); // allowed modes: O_RDWR, O_RDONLY; O_APPEND // forbidden modes: O_WRONLY - if (f->props->mode == H5_O_WRONLY) { + if (f->props->flags & H5_O_WRONLY) { H5_PRIV_FUNC_LEAVE ( - h5priv_handle_file_mode_error (f->props->mode)); + h5priv_handle_file_mode_error (f->props->flags)); } hid_t loc_id; TRY (loc_id = hdf5_open_group (f->file, H5_ATTACHMENT)); h5_err_t exists; TRY (exists = hdf5_link_exists (loc_id, fname)); - if (f->props->mode == H5_O_WRONLY) { + if (f->props->flags & H5_O_WRONLY) { H5_PRIV_FUNC_LEAVE ( - h5priv_handle_file_mode_error (f->props->mode)); + h5priv_handle_file_mode_error (f->props->flags)); } else if (!exists) { H5_PRIV_FUNC_LEAVE ( h5_error ( diff --git a/src/h5core/h5_errorhandling.c b/src/h5core/h5_errorhandling.c index 5001d7a..19320f4 100644 --- a/src/h5core/h5_errorhandling.c +++ b/src/h5core/h5_errorhandling.c @@ -1,5 +1,5 @@ /* - Copyright (c) 2006-2012, The Regents of the University of California, + Copyright (c) 2006-2013, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy) and the Paul Scherrer Institut (Switzerland). All rights reserved. @@ -12,7 +12,7 @@ static h5_errorhandler_t h5_errhandler = h5_report_errorhandler; h5_err_t h5_errno; -h5_int32_t h5_debug_level = 1; +h5_int32_t h5_debug_level = H5_VERBOSE_ERROR; struct call_stack h5_call_stack; char *h5_rfmts[] = { @@ -44,12 +44,19 @@ char *h5_rfmts[] = { /*! \ingroup h5_core \defgroup h5_core_errorhandling + + TODO: this is broken by design ... */ const char* const H5_O_MODES[] = { - "H5_O_RDWR", - "H5_O_RDONLY", - "H5_O_WRONLY", - "H5_O_APPEND" + "unknown", // 0 + "H5_O_RDWR", // 1 + "H5_O_RDONLY", // 2 + "unknown", // 3 + "H5_O_WRONLY", // 4 + "unknown", // 5 + "unknown", // 6 + "unknown", // 7 + "H5_O_APPENDONLY" }; /*! @@ -71,7 +78,7 @@ h5_set_debuglevel ( const h5_id_t level /*!< debug level */ ) { if (level < 0) - h5_debug_level = (1 << 20) - 1; + h5_debug_level = ((1 << 20) - 1) & ~0x7; else h5_debug_level = level; return H5_SUCCESS; @@ -238,6 +245,6 @@ h5_verror ( va_list ap ) { - if (h5_debug_level < 1) return; + if ((h5_debug_level & 0x3) < 1) return; h5priv_vprintf (stderr, "E", h5_call_stack.entry[0].name, fmt, ap); } diff --git a/src/h5core/h5_errorhandling_private.h b/src/h5core/h5_errorhandling_private.h index 9e8f050..03ea390 100644 --- a/src/h5core/h5_errorhandling_private.h +++ b/src/h5core/h5_errorhandling_private.h @@ -7,7 +7,7 @@ h5_error( \ H5_ERR_BADF, \ "Operation not permitted in mode '%s'", \ - H5_O_MODES[mode_id] ); + H5_O_MODES[mode_id & 0xff] ); #define HANDLE_H5_OVERFLOW_ERR( max ) \ h5_error( \ diff --git a/src/h5core/h5_model.c b/src/h5core/h5_model.c index b97ca25..1df7f93 100644 --- a/src/h5core/h5_model.c +++ b/src/h5core/h5_model.c @@ -165,7 +165,8 @@ h5_set_throttle ( ) { h5_file_p f = (h5_file_p)f_; H5_CORE_API_ENTER (h5_err_t, "f=%p, factor=%d", f, factor); - if ( (f->props->mode & H5_VFD_MPIIO_IND) || (f->props->mode & H5_VFD_MPIPOSIX) ) { + if ( (f->props->flags & H5_VFD_MPIO_INDEPENDENT) || + (f->props->flags & H5_VFD_MPIO_POSIX) ) { f->props->throttle = factor; h5_info ( "Throttling enabled with factor = %lld", diff --git a/src/h5core/h5_openclose.c b/src/h5core/h5_openclose.c index 01854c6..58f57af 100644 --- a/src/h5core/h5_openclose.c +++ b/src/h5core/h5_openclose.c @@ -79,27 +79,30 @@ mpi_init ( TRY (f->props->access_prop = hdf5_create_property(H5P_FILE_ACCESS)); /* select the HDF5 VFD */ - if (f->props->mode & H5_VFD_MPIPOSIX) { + if ((f->props->flags & H5_VFD_MPIO_POSIX)) { h5_info("Selecting MPI-POSIX VFD"); hbool_t use_gpfs = 0; // TODO autodetect GPFS? TRY (hdf5_set_fapl_mpiposix_property (f->props->access_prop, f->props->comm, use_gpfs)); - } else if (f->props->mode & H5_VFD_CORE) { + } else if ((f->props->flags & H5_VFD_CORE)) { h5_info("Selecting CORE VFD"); TRY (hdf5_set_fapl_core (f->props->access_prop, f->props->align, 1)); - } else { - h5_info("Selecting MPI-IO VFD"); + } + else if ((f->props->flags & H5_VFD_MPIO_INDEPENDENT)){ + h5_info("Selecting MPI-IO VFD, using independent mode"); TRY (hdf5_set_fapl_mpio_property (f->props->access_prop, f->props->comm, MPI_INFO_NULL)); - if (f->props->mode & H5_VFD_MPIIO_IND) { - h5_info("MPI-IO: Using independent mode"); - } else { - h5_info("MPI-IO: Using collective mode"); - TRY (hdf5_set_dxpl_mpio_property (f->props->xfer_prop, - H5FD_MPIO_COLLECTIVE) ); - } + TRY (hdf5_set_dxpl_mpio_property (f->props->xfer_prop, + H5FD_MPIO_INDEPENDENT) ); + } else { + // default is MPI-IO colloctive mode + h5_info("Selecting MPI-IO VFD, using collective mode"); + TRY (hdf5_set_fapl_mpio_property (f->props->access_prop, + f->props->comm, MPI_INFO_NULL)); + TRY (hdf5_set_dxpl_mpio_property (f->props->xfer_prop, + H5FD_MPIO_COLLECTIVE) ); } #ifdef H5_USE_LUSTRE if (f->flags & H5_FS_LUSTRE) { @@ -134,85 +137,145 @@ set_alignment ( static inline h5_err_t set_default_file_props ( - h5_prop_file_t* props + h5_prop_file_t* _props ) { H5_INLINE_FUNC_ENTER (h5_err_t); - h5_prop_file_t* file_props = (h5_prop_file_t*)props; - bzero (file_props, sizeof (file_props)); - file_props->class = H5_PROP_FILE; - TRY (file_props->prefix_step_name = h5_calloc (1, H5_STEPNAME_LEN)); + h5_prop_file_p props = (h5_prop_file_p)_props; + bzero (props, sizeof (props)); + props->class = H5_PROP_FILE; + TRY (props->prefix_step_name = h5_calloc (1, H5_STEPNAME_LEN)); strncpy ( - file_props->prefix_step_name, + props->prefix_step_name, H5_STEPNAME, H5_STEPNAME_LEN - 1); - file_props->width_step_idx = H5_STEPWIDTH; -#ifdef PARALLEL_IO - file_props->comm = MPI_COMM_WORLD; -#endif + props->width_step_idx = H5_STEPWIDTH; + props->comm = MPI_COMM_WORLD; H5_INLINE_FUNC_RETURN (H5_SUCCESS); } h5_err_t -h5_set_prop_file_mpio ( - h5_prop_t _prop, +h5_set_prop_file_mpio_collective ( + h5_prop_t _props, MPI_Comm* comm ) { - h5_prop_p prop = (h5_prop_p)_prop; - H5_CORE_API_ENTER (h5_err_t, "prop=%p, comm=%p", prop, comm); + h5_prop_file_p props = (h5_prop_file_p)_props; + H5_CORE_API_ENTER (h5_err_t, "props=%p, comm=%p", props, comm); - if (prop->class != H5_PROP_FILE) { + if (props->class != H5_PROP_FILE) { H5_INLINE_FUNC_LEAVE ( h5_error ( H5_ERR_INVAL, "Invalid property class: %lld", - (long long int)prop->class)); + (long long int)props->class)); } - h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; - file_prop->comm = *comm; + props->flags &= ~(H5_VFD_MPIO_POSIX | H5_VFD_MPIO_INDEPENDENT | H5_VFD_CORE); + props->flags |= H5_VFD_MPIO_COLLECTIVE; + props->comm = *comm; H5_CORE_API_RETURN (H5_SUCCESS); } h5_err_t -h5_set_prop_file_align ( - h5_prop_t _prop, - h5_int64_t align +h5_set_prop_file_mpio_independent ( + h5_prop_t _props, + MPI_Comm* comm ) { - h5_prop_p prop = (h5_prop_p)_prop; - H5_CORE_API_ENTER ( - h5_err_t, - "prop=%p, align=%lld", - prop, (long long int)align); - if (prop->class != H5_PROP_FILE) { + h5_prop_file_p props = (h5_prop_file_p)_props; + H5_CORE_API_ENTER (h5_err_t, "props=%p, comm=%p", props, comm); + + if (props->class != H5_PROP_FILE) { H5_INLINE_FUNC_LEAVE ( h5_error ( H5_ERR_INVAL, "Invalid property class: %lld", - (long long int)prop->class)); + (long long int)props->class)); } - h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; - file_prop->align = align; + props->flags &= ~(H5_VFD_MPIO_COLLECTIVE | H5_VFD_MPIO_POSIX | H5_VFD_CORE); + props->flags |= H5_VFD_MPIO_INDEPENDENT; + props->comm = *comm; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_set_prop_file_mpio_posix ( + h5_prop_t _props, + MPI_Comm* comm + ) { + h5_prop_file_p props = (h5_prop_file_p)_props; + H5_CORE_API_ENTER (h5_err_t, "props=%p, comm=%p", props, comm); + + if (props->class != H5_PROP_FILE) { + H5_INLINE_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", + (long long int)props->class)); + } + props->flags &= ~(H5_VFD_MPIO_COLLECTIVE | H5_VFD_MPIO_POSIX | H5_VFD_CORE); + props->flags |= H5_VFD_MPIO_INDEPENDENT; + props->comm = *comm; + H5_CORE_API_RETURN (H5_SUCCESS); +} + +h5_err_t +h5_set_prop_file_core_vfd ( + h5_prop_t _props + ) { + h5_prop_file_p props = (h5_prop_file_p)_props; + H5_CORE_API_ENTER (h5_err_t, "props=%p", props); + + if (props->class != H5_PROP_FILE) { + H5_INLINE_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", + (long long int)props->class)); + } + props->flags &= ~(H5_VFD_MPIO_COLLECTIVE | H5_VFD_MPIO_INDEPENDENT | H5_VFD_MPIO_POSIX); + props->flags |= H5_VFD_MPIO_INDEPENDENT; + props->comm = MPI_COMM_SELF; + H5_CORE_API_RETURN (H5_SUCCESS); +} + + +h5_err_t +h5_set_prop_file_align ( + h5_prop_t _props, + h5_int64_t align + ) { + h5_prop_file_p props = (h5_prop_file_p)_props; + H5_CORE_API_ENTER ( + h5_err_t, + "props=%p, align=%lld", + props, (long long int)align); + if (props->class != H5_PROP_FILE) { + H5_INLINE_FUNC_LEAVE ( + h5_error ( + H5_ERR_INVAL, + "Invalid property class: %lld", + (long long int)props->class)); + } + props->align = align; H5_CORE_API_RETURN (H5_SUCCESS); } h5_err_t h5_set_prop_file_throttle ( - h5_prop_t _prop, + h5_prop_t _props, h5_int64_t throttle ) { - h5_prop_p prop = (h5_prop_p)_prop; + h5_prop_file_p props = (h5_prop_file_p)_props; H5_CORE_API_ENTER ( h5_err_t, - "prop=%p, throttle=%lld", - prop, (long long int)throttle); - if (prop->class != H5_PROP_FILE) { + "props=%p, throttle=%lld", + props, (long long int)throttle); + if (props->class != H5_PROP_FILE) { H5_INLINE_FUNC_LEAVE ( h5_error ( H5_ERR_INVAL, "Invalid property class: %lld", - (long long int)prop->class)); + (long long int)props->class)); } - h5_prop_file_t* file_prop = (h5_prop_file_t*)prop; - file_prop->throttle = throttle; + props->throttle = throttle; H5_CORE_API_RETURN (H5_SUCCESS); } @@ -272,7 +335,7 @@ open_file ( H5_INLINE_FUNC_ENTER (h5_err_t); h5_info ("Opening file %s.", filename); - f->props->mode = mode; + f->props->flags |= mode; f->nprocs = 1; // queried later f->myproc = 0; // queried later @@ -292,19 +355,21 @@ open_file ( TRY (mpi_init (f)); // noop if serial TRY (set_alignment (f)); - if (f->props->mode & H5_O_RDONLY) { + if (f->props->flags & H5_O_RDONLY) { f->file = H5Fopen (filename, H5F_ACC_RDONLY, f->props->access_prop); } - else if (f->props->mode & H5_O_WRONLY){ - f->file = H5Fcreate (filename, H5F_ACC_TRUNC, f->props->create_prop, - f->props->access_prop); + else if (f->props->flags & H5_O_WRONLY){ + f->file = H5Fcreate ( + filename, H5F_ACC_TRUNC, f->props->create_prop, + f->props->access_prop); f->empty = 1; } - else if (f->props->mode & H5_O_APPEND || f->props->mode & H5_O_RDWR) { + else if (f->props->flags & H5_O_APPENDONLY || f->props->flags & H5_O_RDWR) { int fd = open (filename, O_RDONLY, 0); if ((fd == -1) && (errno == ENOENT)) { - f->file = H5Fcreate (filename, H5F_ACC_TRUNC, - f->props->create_prop, f->props->access_prop); + f->file = H5Fcreate ( + filename, H5F_ACC_TRUNC, + f->props->create_prop, f->props->access_prop); f->empty = 1; } else if (fd != -1) { @@ -318,15 +383,15 @@ open_file ( h5_error ( H5_ERR_INVAL, "Invalid file access mode '%lld'.", - (long long int)f->props->mode)); + (long long int)f->props->flags & 0xff)); } if (f->file < 0) H5_PRIV_FUNC_LEAVE ( h5_error ( H5_ERR_HDF5, - "Cannot open file '%s' with mode '%lld'", - filename, (long long int)f->props->mode)); + "Cannot open file '%s' with mode '%s'", + filename, H5_O_MODES[f->props->flags & 0xff])); TRY (f->root_gid = hdf5_open_group (f->file, "/" )); TRY (h5upriv_open_file (f)); @@ -362,7 +427,7 @@ h5_open_file2 ( (long long int)props->class)); } f->props->comm = props->comm; - f->props->mode |= props->mode; + f->props->flags = props->flags; f->props->throttle = props->throttle; f->props->align = props->align; @@ -395,7 +460,7 @@ h5_open_file2 ( */ h5_file_t -h5_open_file ( +h5_open_file1 ( const char* filename, h5_int32_t mode, MPI_Comm comm, @@ -408,7 +473,7 @@ h5_open_file ( h5_prop_file_t* props; h5_file_t f; TRY (props = (h5_prop_file_t*)h5_create_prop (H5_PROP_FILE)); - TRY (h5_set_prop_file_mpio ((h5_prop_t)props, &comm)); + TRY (h5_set_prop_file_mpio_collective ((h5_prop_t)props, &comm)); TRY (h5_set_prop_file_align ((h5_prop_t)props, align)); TRY (f = h5_open_file2 (filename, mode, (h5_prop_t)props)); TRY (h5_close_prop ((h5_prop_t)props)); diff --git a/src/h5core/h5_readwrite.c b/src/h5core/h5_readwrite.c index 1738e8d..9694566 100644 --- a/src/h5core/h5_readwrite.c +++ b/src/h5core/h5_readwrite.c @@ -44,10 +44,10 @@ h5priv_write_dataset_by_name ( h5_err_t exists; TRY (exists = hdf5_link_exists (loc_id, dsinfo->name)); - if ((exists > 0) && ((f->props->mode==H5_O_WRONLY) || (f->props->mode==H5_O_APPEND))) { + if ((exists > 0) && (f->props->flags & H5_O_APPENDONLY)) { h5_warn ("Dataset %s/%s already exist.", hdf5_get_objname (loc_id), dsinfo->name); - H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->props->mode)); + H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->props->flags)); } /* @@ -112,7 +112,7 @@ h5priv_write_dataset_by_name ( */ h5_err_t h5priv_write_dataset_by_name_id ( - const h5_file_p f, + const h5_file_p f, const hid_t loc_id, h5_dsinfo_t* dsinfo, hid_t dset_id, @@ -132,10 +132,10 @@ h5priv_write_dataset_by_name_id ( h5_err_t exists; TRY (exists = hdf5_link_exists (loc_id, dsinfo->name)); - if ((exists > 0) && ((f->props->mode==H5_O_WRONLY) || (f->props->mode==H5_O_APPEND))) { + if ((exists > 0) && (f->props->flags & H5_O_APPENDONLY)) { h5_warn ("Dataset %s/%s already exist.", hdf5_get_objname (loc_id), dsinfo->name); - H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->props->mode)); + H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->props->flags)); } #ifdef PARALLEL_IO diff --git a/src/h5core/h5_readwrite_private.h b/src/h5core/h5_readwrite_private.h index 6948607..a8d8414 100644 --- a/src/h5core/h5_readwrite_private.h +++ b/src/h5core/h5_readwrite_private.h @@ -13,20 +13,16 @@ #include "h5core/h5_types.h" -#define is_writable(f) (f->props->mode != H5_O_RDONLY) -#define is_readonly(f) (f->props->mode == H5_O_RDONLY) -#define is_appendonly(f) (f->props->mode == H5_O_APPEND) +#define is_writable(f) (f->props->flags & (H5_O_RDWR | H5_O_WRONLY | H5_O_APPENDONLY)) +#define is_readable(f) (f->props->flags & (H5_O_RDWR | H5_O_RDONLY)) +#define is_readonly(f) (f->props->flags & H5_O_RDONLY) +#define is_appendonly(f) (f->props->flags & H5_O_APPENDONLY) #define CHECK_WRITABLE_MODE(f) \ TRY (is_writable (f) ? H5_SUCCESS : h5_error ( \ H5_ERR_INVAL, \ "Attempting to write to read-only file")); -#define CHECK_READONLY_MODE(f) \ - TRY (is_readonly (f) ? H5_SUCCESS : h5_error ( \ - H5_ERR_INVAL, \ - "Operation is not allowed on writable files.")); - #define CHECK_TIMEGROUP(f) \ TRY ((f->step_gid > 0) ? H5_SUCCESS : h5_error ( \ H5_ERR_INVAL, \ diff --git a/src/h5core/h5_types_private.h b/src/h5core/h5_types_private.h index 827b63e..652ff9a 100644 --- a/src/h5core/h5_types_private.h +++ b/src/h5core/h5_types_private.h @@ -18,11 +18,10 @@ struct h5_prop { // generic property class char pad[248]; // sizeof (struct h5_prop) == 256 }; -typedef struct { // file property +struct h5_prop_file { // file property h5_int64_t class; // property class == H5_PROP_FILE - h5_int64_t mode; - h5_int64_t flags; - h5_int64_t align; + h5_int64_t flags; // file access mode (read-write, readonly ... + h5_int64_t align; // HDF5 alignment h5_int64_t throttle; MPI_Comm comm; hid_t xfer_prop; // dataset transfer properties @@ -30,8 +29,9 @@ typedef struct { // file property hid_t create_prop; // file create properties char* prefix_step_name; // Prefix of step name int width_step_idx; // pad step index with 0 up to this -} h5_prop_file_t; - +}; +typedef struct h5_prop_file h5_prop_file_t; +typedef h5_prop_file_t* h5_prop_file_p; /** \struct h5_file @@ -43,7 +43,7 @@ typedef struct { // file property */ struct h5_file { hid_t file; // HDF5 file id - h5_prop_file_t* props; // file properties + h5_prop_file_p props; // file properties char empty; // flag (should be int?!) /* MPI */ diff --git a/src/h5core/h5u_model.c b/src/h5core/h5u_model.c index f18ca84..b4eebc2 100644 --- a/src/h5core/h5u_model.c +++ b/src/h5core/h5u_model.c @@ -109,10 +109,6 @@ h5u_set_num_particles ( "Invalid number particles: %lld!\n", (long long)nparticles)); - hsize_t hstride = (hsize_t)stride; - if (hstride > 1) - h5_debug ("Striding by %lld elements.", (long long)hstride); - #ifndef PARALLEL_IO /* if we are not using parallel-IO, there is enough information @@ -139,8 +135,10 @@ h5u_set_num_particles ( /* we need a hyperslab selection if there is striding * (otherwise, the default H5S_ALL selection is ok) */ - if (hstride > 1) { + if (stride > 1) { + h5_debug ("Striding by %lld elements.", (long long)stride); start = 0; + hsize_t hstride = (hsize_t)stride; count = u->nparticles; TRY (hdf5_select_hyperslab_of_dataspace ( u->memshape, @@ -189,8 +187,8 @@ h5u_set_num_particles ( TRY( u->diskshape = hdf5_create_dataspace(1, &count, NULL) ); count = nparticles; - hstride = 1; if (count > 0) { + hsize_t hstride = 1; TRY( hdf5_select_hyperslab_of_dataspace( u->diskshape, H5S_SELECT_SET, diff --git a/src/h5core/h5u_readwrite.c b/src/h5core/h5u_readwrite.c index 2328129..bf2f941 100644 --- a/src/h5core/h5u_readwrite.c +++ b/src/h5core/h5u_readwrite.c @@ -230,7 +230,7 @@ h5u_write_data ( #ifdef PARALLEL_IO TRY (h5priv_end_throttle (f)); #endif - if (f->props->mode & H5_FLUSH_STEP) + if (f->props->flags & H5_FLUSH_STEP) TRY (hdf5_flush (f->step_gid, H5F_SCOPE_LOCAL)); TRY (hdf5_close_dataset (dset_id)); diff --git a/src/include/H5.h b/src/include/H5.h index 7e0162c..bb04d4e 100644 --- a/src/include/H5.h +++ b/src/include/H5.h @@ -27,13 +27,49 @@ H5CreateFileProp ( H5_API_RETURN (h5_create_prop (H5_PROP_FILE)); } + static inline h5_err_t H5SetPropFileMPIO ( h5_prop_t prop, MPI_Comm* comm ) { H5_API_ENTER (h5_err_t, "prop=%p, comm=%p", (void*)prop, comm); - H5_API_RETURN (h5_set_prop_file_mpio (prop, comm)); + H5_API_RETURN (h5_set_prop_file_mpio_collective (prop, comm)); +} + +static inline h5_err_t +H5SetPropFileMPIOCollective ( + h5_prop_t prop, + MPI_Comm* comm + ) { + H5_API_ENTER (h5_err_t, "prop=%p, comm=%p", (void*)prop, comm); + H5_API_RETURN (h5_set_prop_file_mpio_collective (prop, comm)); +} + +static inline h5_err_t +H5SetPropFileMPIOIndependent ( + h5_prop_t prop, + MPI_Comm* comm + ) { + H5_API_ENTER (h5_err_t, "prop=%p, comm=%p", (void*)prop, comm); + H5_API_RETURN (h5_set_prop_file_mpio_independent (prop, comm)); +} + +static inline h5_err_t +H5SetPropFileMPIOPosix ( + h5_prop_t prop, + MPI_Comm* comm + ) { + H5_API_ENTER (h5_err_t, "prop=%p, comm=%p", (void*)prop, comm); + H5_API_RETURN (h5_set_prop_file_mpio_posix (prop, comm)); +} + +static inline h5_err_t +H5SetPropFileCoreVFD ( + h5_prop_t prop + ) { + H5_API_ENTER (h5_err_t, "prop=%p", (void*)prop); + H5_API_RETURN (h5_set_prop_file_core_vfd (prop)); } static inline h5_err_t @@ -55,8 +91,8 @@ H5SetPropFileAlign ( use independent writes from overwhelming the underlying parallel file system. - Throttling only works with the H5_VFD_MPIPOSIX or - H5_VFD_MPIIO_IND drivers and is only available in + Throttling only works with the H5_VFD_MPIO_POSIX or + H5_VFD_MPIO_INDEPENDENT drivers and is only available in the parallel library. \return \c H5_SUCCESS or \c H5_FAILURE @@ -89,11 +125,11 @@ H5CloseProp ( File mode flags are: - \c H5_O_RDONLY: Only reading allowed - \c H5_O_WRONLY: create new file, dataset must not exist - - \c H5_O_APPEND: allows to append a new datasets to an existing file + - \c H5_O_APPENDONLY: allows to append new data to an existing file - \c H5_O_RDWR: dataset may exist - \c H5_FS_LUSTRE - enable optimizations for the Lustre file system - - \c H5_VFD_MPIPOSIX - use the HDF5 MPI-POSIX virtual file driver - - \c H5_VFD_MPIIO_IND - use MPI-IO in indepedent mode + - \c H5_VFD_MPIO_POSIX - use the HDF5 MPI-POSIX virtual file driver + - \c H5_VFD_MPIO_INDEPENDENT - use MPI-IO in indepedent mode The typical file extension is \c .h5. diff --git a/src/include/h5core/h5.h b/src/include/h5core/h5.h index 88036c3..7415751 100644 --- a/src/include/h5core/h5.h +++ b/src/include/h5core/h5.h @@ -15,6 +15,15 @@ #define UNUSED_ARGUMENT(x) (void)x +// dummy MPI calls for serial code +#if !defined (PARALLEL_IO) +#define MPI_Init(argc, argv) +#define MPI_Comm_size(comm, nprocs) { *nprocs = 1; } +#define MPI_Comm_rank(comm, myproc) { *myproc = 0; } +#define MPI_Finalize() +#define MPI_COMM_WORLD (0) +#define MPI_COMM_SELF (1) +#endif #ifdef __cplusplus extern "C" { @@ -42,15 +51,27 @@ h5_set_prop_file_align ( h5_prop_t, const h5_int64_t); h5_err_t -h5_set_prop_file_mpio ( +h5_set_prop_file_mpio_collective ( h5_prop_t, MPI_Comm* const); +h5_err_t +h5_set_prop_file_mpio_independent ( + h5_prop_t, MPI_Comm* const); + +h5_err_t +h5_set_prop_file_mpio_posix ( + h5_prop_t, MPI_Comm* const); + +h5_err_t +h5_set_prop_file_core_vfd ( + h5_prop_t); + h5_err_t h5_close_prop ( h5_prop_t); h5_file_t -h5_open_file ( +h5_open_file1 ( const char*, const h5_int32_t, MPI_Comm, const h5_size_t); h5_file_t diff --git a/src/include/h5core/h5_debug.h b/src/include/h5core/h5_debug.h index 21b3ce2..5f49f4c 100644 --- a/src/include/h5core/h5_debug.h +++ b/src/include/h5core/h5_debug.h @@ -32,7 +32,7 @@ extern "C" { #define H5_DEBUG_MALLOC (1<<9) #define H5_DEBUG_CLIB (1<<10) -#define H5_DEBUG_ALL (-1) +#define H5_DEBUG_ALL (-1 & ~0x3) extern char* h5_rfmts[]; diff --git a/src/include/h5core/h5_errorhandling.h b/src/include/h5core/h5_errorhandling.h index 9e3881b..f1233f5 100644 --- a/src/include/h5core/h5_errorhandling.h +++ b/src/include/h5core/h5_errorhandling.h @@ -246,7 +246,7 @@ h5_warn ( const char* fmt, ... ) { - if (h5_debug_level >= 2) { + if ((h5_debug_level & 0x3) >= 2) { va_list ap; va_start (ap, fmt); h5priv_vprintf (stderr, "W", h5_get_funcname(), fmt, ap); @@ -274,7 +274,7 @@ h5_info ( const char* fmt, ... ) { - if (h5_debug_level >= 3) { + if ((h5_debug_level & 0x3) == 3) { va_list ap; va_start (ap, fmt); h5priv_vprintf (stdout, "I", h5_get_funcname(), fmt, ap); diff --git a/src/include/h5core/h5_types.h b/src/include/h5core/h5_types.h index 306d0f8..8c0cf76 100644 --- a/src/include/h5core/h5_types.h +++ b/src/include/h5core/h5_types.h @@ -20,20 +20,20 @@ extern "C" { /* file modes: - H5_O_RDONLY: only reading allowed - H5_O_WRONLY: create new file, dataset must not exist - H5_O_APPEND: allows to append a new datasets to an existing file - H5_O_RDWR: dataset may exist + H5_O_RDONLY: read data from existing file + H5_O_WRONLY: create new file, if file not exists; write new or overwrite existing data + H5_O_APPENDONLY: allows to append new data to an existing file + H5_O_RDWR: create new file, if file not exists; read and (over-)write data */ #define H5_O_RDWR 0x00000001 #define H5_O_RDONLY 0x00000002 #define H5_O_WRONLY 0x00000004 -#define H5_O_APPEND 0x00000008 +#define H5_O_APPENDONLY 0x00000008 -#define H5_VFD_MPIPOSIX 0x00000010 -#define H5_VFD_MPIIO_IND 0x00000020 -#define H5_VFD_INDEPENDENT H5_VFD_MPIIO_IND // obsolete(?) -#define H5_VFD_CORE 0x00000040 +#define H5_VFD_MPIO_POSIX 0x00000010 +#define H5_VFD_MPIO_INDEPENDENT 0x00000020 +#define H5_VFD_MPIO_COLLECTIVE 0x00000040 +#define H5_VFD_CORE 0x00000080 #define H5_FLUSH_FILE 0x00001000 #define H5_FLUSH_STEP 0x00002000 @@ -101,9 +101,6 @@ struct h5_prop; typedef struct h5_prop* h5_prop_p; typedef uintptr_t h5_prop_t; -struct h5_prop_file; -typedef struct h5_prop_file* h5_prop_file_p; - struct h5_file; typedef struct h5_file* h5_file_p; typedef uintptr_t h5_file_t;