summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2012-10-31 14:40:23 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2012-10-31 14:40:23 (GMT)
commitefd4ae1f3775e3465b7b3425ed125e3b776b1565 (patch)
treefbae9db3b259d7c4b4d4fbc0ce1294a3ae49e1a1 /src
parente73031c90cb33d9d14de73cd2777eb3f99fa2c32 (diff)
parent51c5bf8aa76cf378ccd59b02247fb7cd0d9b3eaf (diff)
downloadhdf5-efd4ae1f3775e3465b7b3425ed125e3b776b1565.zip
hdf5-efd4ae1f3775e3465b7b3425ed125e3b776b1565.tar.gz
hdf5-efd4ae1f3775e3465b7b3425ed125e3b776b1565.tar.bz2
[svn-r22995] merge from trunk up to 22994.
Diffstat (limited to 'src')
-rw-r--r--src/H5Dmpio.c302
-rw-r--r--src/H5Dprivate.h2
-rw-r--r--src/H5Edefin.h4
-rw-r--r--src/H5Einit.h4
-rw-r--r--src/H5Eint.c4
-rw-r--r--src/H5Epubgen.h4
-rw-r--r--src/H5Eterm.h2
-rw-r--r--src/H5Fprivate.h2
-rw-r--r--src/H5Fsfile.c8
-rw-r--r--src/H5Ppublic.h3
-rw-r--r--src/H5T.c2
-rw-r--r--src/H5Tconv.c80
-rw-r--r--src/H5Tpkg.h4
-rw-r--r--src/H5err.txt6
-rw-r--r--src/H5trace.c4
-rw-r--r--src/Makefile.in2
16 files changed, 158 insertions, 275 deletions
diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c
index c2d964e..900ad6a 100644
--- a/src/H5Dmpio.c
+++ b/src/H5Dmpio.c
@@ -105,10 +105,9 @@ static herr_t H5D__chunk_collective_io(H5D_io_info_t *io_info,
static herr_t H5D__multi_chunk_collective_io(H5D_io_info_t *io_info,
const H5D_type_info_t *type_info, H5D_chunk_map_t *fm,
H5P_genplist_t *dx_plist);
-static herr_t H5D__multi_chunk_collective_io_no_opt(H5D_io_info_t *io_info,
- const H5D_type_info_t *type_info, H5D_chunk_map_t *fm, H5P_genplist_t *dx_plist);
static herr_t H5D__link_chunk_collective_io(H5D_io_info_t *io_info,
- const H5D_type_info_t *type_info, H5D_chunk_map_t *fm, int sum_chunk);
+ const H5D_type_info_t *type_info, H5D_chunk_map_t *fm, int sum_chunk,
+ H5P_genplist_t *dx_plist);
static herr_t H5D__inter_collective_io(H5D_io_info_t *io_info,
const H5D_type_info_t *type_info, const H5S_t *file_space,
const H5S_t *mem_space);
@@ -586,6 +585,12 @@ done:
* Programmer: Muqun Yang
* Monday, Feb. 13th, 2006
*
+ * Modification:
+ * - Refctore to remove multi-chunk-without-opimization feature and update for
+ * multi-chunk-io accordingly
+ * Programmer: Jonathan Kim
+ * Date: 2012-10-10
+ *
*-------------------------------------------------------------------------
*/
static herr_t
@@ -594,8 +599,6 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
{
H5P_genplist_t *dx_plist; /* Pointer to DXPL */
H5FD_mpio_chunk_opt_t chunk_opt_mode;
- H5D_mpio_actual_chunk_opt_mode_t actual_chunk_opt_mode;
- H5D_mpio_actual_io_mode_t actual_io_mode;
int io_option = H5D_MULTI_CHUNK_IO_MORE_OPT;
int sum_chunk = -1;
#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
@@ -617,10 +620,12 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
/* Check the optional property list on what to do with collective chunk IO. */
chunk_opt_mode = (H5FD_mpio_chunk_opt_t)H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME);
- if(chunk_opt_mode == H5FD_MPIO_CHUNK_ONE_IO)
+ if(H5FD_MPIO_CHUNK_ONE_IO == chunk_opt_mode)
io_option = H5D_ONE_LINK_CHUNK_IO; /*no opt*/
- else if(chunk_opt_mode == H5FD_MPIO_CHUNK_MULTI_IO)
- io_option = H5D_MULTI_CHUNK_IO; /*no opt */
+ /* direct request to multi-chunk-io */
+ else if(H5FD_MPIO_CHUNK_MULTI_IO == chunk_opt_mode)
+ io_option = H5D_MULTI_CHUNK_IO;
+ /* via default path. branch by num threshold */
else {
unsigned one_link_chunk_io_threshold; /* Threshhold to use single collective I/O for all chunks */
int mpi_size; /* Number of processes in MPI job */
@@ -649,7 +654,7 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
/*** Test collective chunk user-input optimization APIs. ***/
check_prop = H5Pexist(io_info->dxpl_id, H5D_XFER_COLL_CHUNK_LINK_HARD_NAME);
if(check_prop > 0) {
- if(io_option == H5D_ONE_LINK_CHUNK_IO) {
+ if(H5D_ONE_LINK_CHUNK_IO == io_option) {
new_value = 0;
if(H5Pset(io_info->dxpl_id, H5D_XFER_COLL_CHUNK_LINK_HARD_NAME, &new_value) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
@@ -657,7 +662,7 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
} /* end if */
check_prop = H5Pexist(io_info->dxpl_id, H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME);
if(check_prop > 0) {
- if(io_option == H5D_MULTI_CHUNK_IO) {
+ if(H5D_MULTI_CHUNK_IO == io_option) {
new_value = 0;
if(H5Pset(io_info->dxpl_id, H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME, &new_value) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
@@ -665,7 +670,7 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
} /* end if */
check_prop = H5Pexist(io_info->dxpl_id, H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME);
if(check_prop > 0) {
- if(io_option == H5D_ONE_LINK_CHUNK_IO_MORE_OPT) {
+ if(H5D_ONE_LINK_CHUNK_IO_MORE_OPT == io_option) {
new_value = 0;
if(H5Pset(io_info->dxpl_id, H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME, &new_value) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTSET, FAIL, "unable to set property value")
@@ -682,39 +687,16 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
#endif
/* step 2: Go ahead to do IO.*/
- if(io_option == H5D_ONE_LINK_CHUNK_IO || io_option == H5D_ONE_LINK_CHUNK_IO_MORE_OPT) {
- /* set the actual io mode properties to the correct values for link chunk io.
- * Link chunk I/O does not break to independent, so we can set the actual_io mode
- * as well as the optimisation mode. */
- actual_chunk_opt_mode = H5D_MPIO_LINK_CHUNK;
- actual_io_mode = H5D_MPIO_CHUNK_COLLECTIVE;
-
- /* Set the actual chunk opt mode property. */
- if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
-
- if(H5D__link_chunk_collective_io(io_info, type_info, fm, sum_chunk) < 0)
+ if(H5D_ONE_LINK_CHUNK_IO == io_option || H5D_ONE_LINK_CHUNK_IO_MORE_OPT == io_option) {
+ if(H5D__link_chunk_collective_io(io_info, type_info, fm, sum_chunk, dx_plist) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish linked chunk MPI-IO")
-
- /* Set the actual io mode property. */
- if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
} /* end if */
- else
- if(io_option == H5D_MULTI_CHUNK_IO) {
- /* Set the actual chunk opt mode property */
- actual_chunk_opt_mode = H5D_MPIO_MULTI_CHUNK_NO_OPT;
- if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
-
- if(H5D__multi_chunk_collective_io_no_opt(io_info, type_info, fm, dx_plist) < 0)
- HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish multiple chunk MPI-IO")
+ /* direct request to multi-chunk-io */
+ else if(H5D_MULTI_CHUNK_IO == io_option) {
+ if(H5D__multi_chunk_collective_io(io_info, type_info, fm, dx_plist) < 0)
+ HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish optimized multiple chunk MPI-IO")
} /* end if */
- else { /*multiple chunk IOs with opt */
- actual_chunk_opt_mode = H5D_MPIO_MULTI_CHUNK;
- if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
-
+ else { /* multiple chunk IO via threshold */
if(H5D__multi_chunk_collective_io(io_info, type_info, fm, dx_plist) < 0)
HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't finish optimized multiple chunk MPI-IO")
} /* end else */
@@ -801,11 +783,16 @@ done:
* Programmer: Muqun Yang
* Monday, Feb. 13th, 2006
*
+ * Modification:
+ * - Set H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME and H5D_MPIO_ACTUAL_IO_MODE_NAME
+ * dxpl in this.
+ * Programmer: Jonathan Kim
+ * Date: 2012-10-10
*-------------------------------------------------------------------------
*/
static herr_t
H5D__link_chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
- H5D_chunk_map_t *fm, int sum_chunk)
+ H5D_chunk_map_t *fm, int sum_chunk, H5P_genplist_t *dx_plist)
{
H5D_chunk_addr_info_t *chunk_addr_info_array = NULL;
MPI_Datatype chunk_final_mtype; /* Final memory MPI datatype for all chunks with seletion */
@@ -824,10 +811,21 @@ H5D__link_chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *typ
int *chunk_mpi_file_counts = NULL; /* Count of MPI file datatype for each chunk */
int *chunk_mpi_mem_counts = NULL; /* Count of MPI memory datatype for each chunk */
int mpi_code; /* MPI return code */
+ H5D_mpio_actual_chunk_opt_mode_t actual_chunk_opt_mode = H5D_MPIO_LINK_CHUNK;
+ H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_CHUNK_COLLECTIVE;
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
+ /* Set the actual-chunk-opt-mode property. */
+ if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
+
+ /* Set the actual-io-mode property.
+ * Link chunk I/O does not break to independent, so can set right away */
+ if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
+
/* Get the sum # of chunks, if not already available */
if(sum_chunk < 0) {
if(H5D__mpio_get_sum_chunk(io_info, fm, &sum_chunk) < 0)
@@ -1075,6 +1073,12 @@ if(H5DEBUG(D))
* Programmer: Muqun Yang
* Monday, Feb. 13th, 2006
*
+ * Modification:
+ * - Set H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME dxpl in this to go along with
+ * setting H5D_MPIO_ACTUAL_IO_MODE_NAME dxpl at the bottom.
+ * Programmer: Jonathan Kim
+ * Date: 2012-10-10
+ *
*-------------------------------------------------------------------------
*/
static herr_t
@@ -1096,11 +1100,16 @@ H5D__multi_chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *ty
int mpi_rank;
#endif
size_t u; /* Local index variable */
+ H5D_mpio_actual_chunk_opt_mode_t actual_chunk_opt_mode = H5D_MPIO_MULTI_CHUNK; /* actual chunk optimization mode */
H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_NO_COLLECTIVE; /* Local variable for tracking the I/O mode used. */
herr_t ret_value = SUCCEED;
FUNC_ENTER_STATIC
+ /* Set the actual chunk opt mode property */
+ if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, &actual_chunk_opt_mode) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual chunk opt mode property")
+
#ifdef H5Dmpio_DEBUG
mpi_rank = H5F_mpi_get_rank(io_info->dset->oloc.file);
#endif
@@ -1263,210 +1272,6 @@ done:
} /* end H5D__multi_chunk_collective_io */
-/*-------------------------------------------------------------------------
- * Function: H5D__multi_chunk_collective_io_no_opt
- *
- * Purpose: To do collective IO without any optimization per chunk base
- * The internal independent IO inside HDF5 cannot handle
- * non-contiguous(or with holes) storage efficiently.
- * Under this case, the one independent IO call may consist of
- * many small disk IOs. So we may use independent IO with derived datatype
- * to replace the independent IO when we find this chunk is not good to
- * do collective IO. However, according to our performance study,
- * this approach may not overcome the overhead caused by MPI gather/scatter.
- * So we decide to leave the original collective IO per chunk approach as
- * an option for users. NO MPI gather/scatter calls are used.
- * HDF5 will try to collective IO if possible.
- * If users choose to use
- * H5Pset_dxpl_mpio_chunk_opt(dxpl_id,H5FD_MPIO_OPT_MULTI_IO),
- * this function will be called.
- * The HDF5 library won't do any IO management but leave it to MPI-IO to figure
- * out.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Muqun Yang
- * Monday, Feb. 13th, 2006
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5D__multi_chunk_collective_io_no_opt(H5D_io_info_t *io_info,
- const H5D_type_info_t *type_info, H5D_chunk_map_t *fm, H5P_genplist_t *dx_plist)
-{
- H5SL_node_t *chunk_node; /* Current node in chunk skip list */
- H5D_io_info_t ctg_io_info; /* Contiguous I/O info object */
- H5D_storage_t ctg_store; /* Chunk storage information as contiguous dataset */
- H5D_io_info_t cpt_io_info; /* Compact I/O info object */
- H5D_storage_t cpt_store; /* Chunk storage information as compact dataset */
- hbool_t cpt_dirty; /* Temporary placeholder for compact storage "dirty" flag */
- int min_chunk = -1; /* Minimum # of chunks all processes will operate on */
- int count_chunk; /* How many chunks have we operated on? */
- H5D_storage_t store; /* union of EFL and chunk pointer in file space */
- H5D_mpio_actual_io_mode_t actual_io_mode = H5D_MPIO_NO_COLLECTIVE; /*Local variable for tracking the I/O modes used. */
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_STATIC
-
-#ifdef H5D_DEBUG
-if(H5DEBUG(D)) {
- int mpi_rank;
-
- mpi_rank = H5F_mpi_get_rank(io_info->dset->oloc.file);
- HDfprintf(H5DEBUG(D), "Rank %d: coming to multi_chunk_collective_io_no_opt\n", mpi_rank);
-}
-#endif
-
- /* Set up contiguous I/O info object */
- HDmemcpy(&ctg_io_info, io_info, sizeof(ctg_io_info));
- ctg_io_info.store = &ctg_store;
- ctg_io_info.layout_ops = *H5D_LOPS_CONTIG;
-
- /* Initialize temporary contiguous storage info */
- ctg_store.contig.dset_size = (hsize_t)io_info->dset->shared->layout.u.chunk.size;
-
- /* Set up compact I/O info object */
- HDmemcpy(&cpt_io_info, io_info, sizeof(cpt_io_info));
- cpt_io_info.store = &cpt_store;
- cpt_io_info.layout_ops = *H5D_LOPS_COMPACT;
-
- /* Initialize temporary compact storage info */
- cpt_store.compact.dirty = &cpt_dirty;
-
- /* Set dataset storage for I/O info */
- io_info->store = &store;
-
- /* Get the min. # of chunks */
- if(H5D__mpio_get_min_chunk(io_info, fm, &min_chunk) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get minimum number of chunk")
- HDassert(min_chunk >= 0);
-
- /* Get first node in chunk skip list */
- chunk_node = H5SL_first(fm->sel_chunks);
- count_chunk = 0;
-
- /* Iterate through chunks to be operated on */
- while(chunk_node) {
- H5D_chunk_info_t *chunk_info; /* chunk information */
- H5D_chunk_ud_t udata; /* B-tree pass-through */
- hbool_t make_ind, make_coll; /* Flags to indicate that the MPI mode should change */
-
- /* Get the actual chunk information from the skip list node */
- chunk_info = H5SL_item(chunk_node);
-
- /* Pass in chunk's coordinates in a union. */
- store.chunk.offset = chunk_info->coords;
- store.chunk.index = chunk_info->index;
-
- /* Reset flags for changing parallel I/O mode */
- make_ind = make_coll = FALSE;
-
- count_chunk++;
-
- /* If the number of chunk is greater than minimum number of chunk,
- * Do independent read.
- */
- if(count_chunk > min_chunk)
- /* Switch to independent I/O (permanently) */
- make_ind = TRUE;
-
- /* Retrieve the chunk's address */
- if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords,
- chunk_info->index, &udata) < 0)
- HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't get chunk info from skipped list")
-
- /* Independent I/O */
- if(make_ind) {
- void *chunk; /* Pointer to the data chunk in cache */
- H5D_io_info_t *chk_io_info; /* Pointer to I/O info object for this chunk */
- uint32_t accessed_bytes = 0; /* Total accessed size in a chunk */
- htri_t cacheable; /* Whether the chunk is cacheable */
-
- /* Switch to independent I/O */
- if(H5D__ioinfo_xfer_mode(io_info, dx_plist, H5FD_MPIO_INDEPENDENT) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't switch to independent I/O")
-
- /* Update the local variable tracking the dxpl's actual io mode */
- actual_io_mode = actual_io_mode | H5D_MPIO_CHUNK_INDEPENDENT;
-
- /* Load the chunk into cache and lock it. */
- if((cacheable = H5D__chunk_cacheable(io_info, udata.addr,
- io_info->op_type == H5D_IO_OP_WRITE)) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't tell if chunk is cacheable")
- if(cacheable) {
- hbool_t entire_chunk = TRUE; /* Whether whole chunk is selected */
-
- /* Compute # of bytes accessed in chunk */
- accessed_bytes = chunk_info->chunk_points * type_info->src_type_size;
-
- /* Determine if we will access all the data in the chunk */
- if(((io_info->op_type == H5D_IO_OP_WRITE) && (accessed_bytes != ctg_store.contig.dset_size))
- || (io_info->op_type != H5D_IO_OP_WRITE))
- entire_chunk = FALSE;
-
- /* Lock the chunk into the cache */
- if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, entire_chunk)))
- HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk")
-
- /* Set up the storage buffer information for this chunk */
- cpt_store.compact.buf = chunk;
-
- /* Point I/O info at contiguous I/O info for this chunk */
- chk_io_info = &cpt_io_info;
- } /* end if */
- else {
- /* Set up the storage address information for this chunk */
- ctg_store.contig.dset_addr = udata.addr;
-
- /* No chunk cached */
- chunk = NULL;
-
- /* Point I/O info at temporary I/O info for this chunk */
- chk_io_info = &ctg_io_info;
- } /* end else */
-
- if(io_info->op_type == H5D_IO_OP_WRITE) {
- if((io_info->io_ops.single_write)(chk_io_info, type_info,
- (hsize_t)chunk_info->chunk_points, chunk_info->fspace, chunk_info->mspace) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "optimized write failed")
- } /* end if */
- else {
- if((io_info->io_ops.single_read)(chk_io_info, type_info,
- (hsize_t)chunk_info->chunk_points, chunk_info->fspace, chunk_info->mspace) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "optimized read failed")
- } /* end ese */
-
- /* Release the cache lock on the chunk. */
- if(chunk)
- if(H5D__chunk_unlock(io_info, &udata, (io_info->op_type == H5D_IO_OP_WRITE), chunk, accessed_bytes) < 0)
- HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk")
- } /* end if */
- else { /*collective I/O */
- /* Set up the storage address information for this chunk */
- ctg_store.contig.dset_addr = udata.addr;
-
- /* Update the local variable tracking the dxpl's actual io Mode. */
- actual_io_mode = actual_io_mode | H5D_MPIO_CHUNK_COLLECTIVE;
-
- if(H5D__inter_collective_io(&ctg_io_info, type_info, chunk_info->fspace, chunk_info->mspace) < 0)
- HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL,"couldn't finish shared collective MPI-IO")
- } /* end else */
-
- if(make_coll)
- if(H5D__ioinfo_xfer_mode(io_info, dx_plist, H5FD_MPIO_COLLECTIVE) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't switch to independent I/O")
-
- /* Get the next chunk node in the skip list */
- chunk_node = H5SL_next(chunk_node);
- } /* end while */
-
- /* Write the local value of actual io mode to the DXPL. */
- if(H5P_set(dx_plist, H5D_MPIO_ACTUAL_IO_MODE_NAME, &actual_io_mode) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set actual io mode property")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5D__multi_chunk_collective_io_no_opt */
/*-------------------------------------------------------------------------
@@ -1794,7 +1599,6 @@ H5D__obtain_mpio_mode(H5D_io_info_t* io_info, H5D_chunk_map_t *fm,
{
int total_chunks;
unsigned percent_nproc_per_chunk, threshold_nproc_per_chunk;
- H5FD_mpio_chunk_opt_t chunk_opt_mode;
uint8_t* io_mode_info = NULL;
uint8_t* recv_io_mode_info = NULL;
uint8_t* mergebuf = NULL;
@@ -1827,8 +1631,8 @@ H5D__obtain_mpio_mode(H5D_io_info_t* io_info, H5D_chunk_map_t *fm,
/* Setup parameters */
H5_ASSIGN_OVERFLOW(total_chunks, fm->layout->u.chunk.nchunks, hsize_t, int);
percent_nproc_per_chunk = H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME);
- chunk_opt_mode = (H5FD_mpio_chunk_opt_t)H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME);
- if((chunk_opt_mode == H5FD_MPIO_CHUNK_MULTI_IO) || (percent_nproc_per_chunk == 0)) {
+ /* if ratio is 0, perform collective io */
+ if(0 == percent_nproc_per_chunk) {
if(H5D__chunk_addrmap(io_info, chunk_addr) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address");
for(ic = 0; ic < total_chunks; ic++)
diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h
index ec48cee..3a2fc86 100644
--- a/src/H5Dprivate.h
+++ b/src/H5Dprivate.h
@@ -87,8 +87,6 @@
#define H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME "coll_chunk_link_false"
#define H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME "coll_chunk_multi_coll"
#define H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME "coll_chunk_multi_ind"
-#define H5D_XFER_COLL_CHUNK_LINK_TO_MULTI "coll_chunk_link_mul"/* Internal transferring from link to multiple chunk */
-#define H5D_XFER_COLL_CHUNK_LINK_TO_MULTI_OPT "coll_chunk_link_mul_opt"/* Internal transferring from link opt to multiple chunk opt*/
/* Definitions for all collective chunk instrumentation properties */
#define H5D_XFER_COLL_CHUNK_SIZE sizeof(unsigned)
diff --git a/src/H5Edefin.h b/src/H5Edefin.h
index 27275a3..51a1f66 100644
--- a/src/H5Edefin.h
+++ b/src/H5Edefin.h
@@ -22,7 +22,7 @@
/* Major error IDs */
hid_t H5E_FUNC_g = FAIL; /* Function entry/exit */
-hid_t H5E_FILE_g = FAIL; /* File accessability */
+hid_t H5E_FILE_g = FAIL; /* File accessibilty */
hid_t H5E_SOHM_g = FAIL; /* Shared Object Header Messages */
hid_t H5E_SYM_g = FAIL; /* Symbol table */
hid_t H5E_VFL_g = FAIL; /* Virtual File Layer */
@@ -132,7 +132,7 @@ hid_t H5E_PATH_g = FAIL; /* Problem with path to object */
/* No error */
hid_t H5E_NONE_MINOR_g = FAIL; /* No error */
-/* File accessability errors */
+/* File accessibilty errors */
hid_t H5E_FILEEXISTS_g = FAIL; /* File already exists */
hid_t H5E_FILEOPEN_g = FAIL; /* File already open */
hid_t H5E_CANTCREATE_g = FAIL; /* Unable to create file */
diff --git a/src/H5Einit.h b/src/H5Einit.h
index 99467ee..d62d6aa 100644
--- a/src/H5Einit.h
+++ b/src/H5Einit.h
@@ -30,7 +30,7 @@ if((msg = H5E_create_msg(cls, H5E_MAJOR, "Function entry/exit"))==NULL)
if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
assert(H5E_FILE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "File accessability"))==NULL)
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "File accessibilty"))==NULL)
HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
@@ -482,7 +482,7 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "No error"))==NULL)
if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-/* File accessability errors */
+/* File accessibilty errors */
assert(H5E_FILEEXISTS_g==(-1));
if((msg = H5E_create_msg(cls, H5E_MINOR, "File already exists"))==NULL)
HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
diff --git a/src/H5Eint.c b/src/H5Eint.c
index 76eaaf5..88dfdee 100644
--- a/src/H5Eint.c
+++ b/src/H5Eint.c
@@ -380,6 +380,10 @@ H5E_walk2_cb(unsigned n, const H5E_error2_t *err_desc, void *client_data)
* they might be different. */
cls_ptr = (H5E_cls_t *)H5I_object_verify(err_desc->cls_id, H5I_ERROR_CLASS);
+ /* Check for bad pointer(s), but can't issue error, just leave */
+ if(!cls_ptr)
+ HGOTO_DONE(FAIL)
+
/* Print error class header if new class */
if(eprint->cls.lib_name == NULL || HDstrcmp(cls_ptr->lib_name, eprint->cls.lib_name)) {
/* update to the new class information */
diff --git a/src/H5Epubgen.h b/src/H5Epubgen.h
index 68c605c..eef9b2c 100644
--- a/src/H5Epubgen.h
+++ b/src/H5Epubgen.h
@@ -58,7 +58,7 @@
#define H5E_ERROR (H5OPEN H5E_ERROR_g)
#define H5E_CACHE (H5OPEN H5E_CACHE_g)
H5_DLLVAR hid_t H5E_FUNC_g; /* Function entry/exit */
-H5_DLLVAR hid_t H5E_FILE_g; /* File accessability */
+H5_DLLVAR hid_t H5E_FILE_g; /* File accessibilty */
H5_DLLVAR hid_t H5E_SOHM_g; /* Shared Object Header Messages */
H5_DLLVAR hid_t H5E_SYM_g; /* Symbol table */
H5_DLLVAR hid_t H5E_VFL_g; /* Virtual File Layer */
@@ -223,7 +223,7 @@ H5_DLLVAR hid_t H5E_PATH_g; /* Problem with path to object */
#define H5E_NONE_MINOR (H5OPEN H5E_NONE_MINOR_g)
H5_DLLVAR hid_t H5E_NONE_MINOR_g; /* No error */
-/* File accessability errors */
+/* File accessibilty errors */
#define H5E_FILEEXISTS (H5OPEN H5E_FILEEXISTS_g)
#define H5E_FILEOPEN (H5OPEN H5E_FILEOPEN_g)
#define H5E_CANTCREATE (H5OPEN H5E_CANTCREATE_g)
diff --git a/src/H5Eterm.h b/src/H5Eterm.h
index 28d822a..ae1eb95 100644
--- a/src/H5Eterm.h
+++ b/src/H5Eterm.h
@@ -134,7 +134,7 @@ H5E_PATH_g=
/* No error */
H5E_NONE_MINOR_g=
-/* File accessability errors */
+/* File accessibilty errors */
H5E_FILEEXISTS_g=
H5E_FILEOPEN_g=
H5E_CANTCREATE_g=
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index c40958b..a05d945 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -656,7 +656,7 @@ H5_DLL void H5F_addr_decode_len(size_t addr_len, const uint8_t **pp, haddr_t *ad
H5_DLL herr_t H5P_facc_close(hid_t dxpl_id, void *close_data);
/* Shared file list related routines */
-H5_DLL herr_t H5F_sfile_assert_num(unsigned n);
+H5_DLL void H5F_sfile_assert_num(unsigned n);
/* Routines for creating & destroying "fake" file structures */
H5_DLL H5F_t *H5F_fake_alloc(uint8_t sizeof_size);
diff --git a/src/H5Fsfile.c b/src/H5Fsfile.c
index 95e5ad2..a1c6976 100644
--- a/src/H5Fsfile.c
+++ b/src/H5Fsfile.c
@@ -46,16 +46,14 @@ H5F_sfile_node_t *H5F_sfile_head_g = NULL;
*
* Purpose: Sanity checking that shared file list is empty
*
- * Return: SUCCEED/FAIL
+ * Return: none (void)
*
* Programmer: Quincey Koziol
* Monday, July 25, 2005
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
-herr_t
+void
H5F_sfile_assert_num(unsigned n)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -83,7 +81,7 @@ H5F_sfile_assert_num(unsigned n)
HDassert(count == n);
} /* end else */
- FUNC_LEAVE_NOAPI(SUCCEED)
+ FUNC_LEAVE_NOAPI_VOID
} /* H5F_sfile_assert_num() */
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index 27ea4fc..882b195 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -131,8 +131,7 @@ typedef enum H5D_mpio_actual_chunk_opt_mode_t {
*/
H5D_MPIO_NO_CHUNK_OPTIMIZATION = 0,
H5D_MPIO_LINK_CHUNK,
- H5D_MPIO_MULTI_CHUNK,
- H5D_MPIO_MULTI_CHUNK_NO_OPT
+ H5D_MPIO_MULTI_CHUNK
} H5D_mpio_actual_chunk_opt_mode_t;
typedef enum H5D_mpio_actual_io_mode_t {
diff --git a/src/H5T.c b/src/H5T.c
index 3087058..b01519a 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -1062,6 +1062,8 @@ H5T_init_interface(void)
status |= H5T_register(H5T_PERS_SOFT, "struct(no-opt)", compound, compound, H5T__conv_struct, H5AC_dxpl_id, FALSE);
status |= H5T_register(H5T_PERS_SOFT, "struct(opt)", compound, compound, H5T__conv_struct_opt, H5AC_dxpl_id, FALSE);
status |= H5T_register(H5T_PERS_SOFT, "enum", enum_type, enum_type, H5T__conv_enum, H5AC_dxpl_id, FALSE);
+ status |= H5T_register(H5T_PERS_SOFT, "enum_i", enum_type, fixedpt, H5T__conv_enum_numeric, H5AC_dxpl_id, FALSE);
+ status |= H5T_register(H5T_PERS_SOFT, "enum_f", enum_type, floatpt, H5T__conv_enum_numeric, H5AC_dxpl_id, FALSE);
status |= H5T_register(H5T_PERS_SOFT, "vlen", vlen, vlen, H5T__conv_vlen, H5AC_dxpl_id, FALSE);
status |= H5T_register(H5T_PERS_SOFT, "array", array, array, H5T__conv_array, H5AC_dxpl_id, FALSE);
status |= H5T_register(H5T_PERS_SOFT, "objref", objref, objref, H5T__conv_order_opt, H5AC_dxpl_id, FALSE);
diff --git a/src/H5Tconv.c b/src/H5Tconv.c
index 8057530..6f379cd 100644
--- a/src/H5Tconv.c
+++ b/src/H5Tconv.c
@@ -2889,6 +2889,86 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5T__conv_enum_numeric
+ *
+ * Purpose: Converts enumerated data to a numeric type (integer or
+ * floating-point number). This function is registered into
+ * the conversion table twice in H5T_init_interface in H5T.c.
+ * Once for enum-integer conversion. Once for enum-float conversion.
+ *
+ * Return: Success: Non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Raymond Lu
+ * 12 October 2012
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5T__conv_enum_numeric(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
+ size_t buf_stride, size_t UNUSED bkg_stride, void *_buf,
+ void UNUSED *bkg, hid_t UNUSED dxpl_id)
+{
+ H5T_t *src, *dst; /*src and dst datatypes */
+ H5T_t *src_parent; /*parent type for src */
+ hid_t src_parent_id = -1; /*ID for parent of the source */
+ H5T_path_t *tpath; /* Conversion information */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_PACKAGE
+
+ switch(cdata->command) {
+ case H5T_CONV_INIT:
+ /*
+ * Determine if this conversion function applies to the conversion
+ * path SRC_ID->DST_ID. If not, return failure.
+ */
+ if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+ HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
+ if(H5T_ENUM != src->shared->type)
+ HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "source type is not a H5T_ENUM datatype")
+ if(H5T_INTEGER != dst->shared->type && H5T_FLOAT != dst->shared->type)
+ HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "destination is not an integer type")
+
+ cdata->need_bkg = H5T_BKG_NO;
+ break;
+
+ case H5T_CONV_FREE:
+ break;
+
+ case H5T_CONV_CONV:
+ if(NULL == (src = (H5T_t *)H5I_object(src_id)) || NULL == (dst = (H5T_t *)H5I_object(dst_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+
+ src_parent = src->shared->parent;
+
+ if(NULL == (tpath = H5T_path_find(src_parent, dst, NULL, NULL, dxpl_id, FALSE))) {
+ HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest datatype")
+ } else if(!H5T_path_noop(tpath)) {
+ if((src_parent_id = H5I_register(H5I_DATATYPE, H5T_copy(src_parent, H5T_COPY_ALL), FALSE)) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+
+ /* Convert the data */
+ if(H5T_convert(tpath, src_parent_id, dst_id, nelmts, buf_stride, bkg_stride, _buf, bkg, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype conversion failed")
+ }
+ break;
+
+ default:
+ /* Some other command we don't know about yet.*/
+ HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command")
+ } /* end switch */
+
+done:
+ /* Release the temporary datatype IDs used */
+ if(src_parent_id >= 0)
+ H5I_dec_ref(src_parent_id);
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5T__conv_enum_numeric() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5T__conv_vlen
*
* Purpose: Converts between VL datatypes in memory and on disk.
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index faa5538..0553d19 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -545,6 +545,10 @@ H5_DLL herr_t H5T__conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride,
size_t bkg_stride, void *buf, void *bkg,
hid_t dset_xfer_plist);
+H5_DLL herr_t H5T__conv_enum_numeric(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
+ size_t nelmts, size_t buf_stride,
+ size_t bkg_stride, void *buf, void *bkg,
+ hid_t dset_xfer_plist);
H5_DLL herr_t H5T__conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride,
size_t bkg_stride, void *buf, void *bkg,
diff --git a/src/H5err.txt b/src/H5err.txt
index b4cb28b..ab3277f 100644
--- a/src/H5err.txt
+++ b/src/H5err.txt
@@ -48,7 +48,7 @@
MAJOR, H5E_ARGS, Invalid arguments to routine
MAJOR, H5E_RESOURCE, Resource unavailable
MAJOR, H5E_INTERNAL, Internal error (too specific to document in detail)
-MAJOR, H5E_FILE, File accessability
+MAJOR, H5E_FILE, File accessibilty
MAJOR, H5E_IO, Low-level I/O
MAJOR, H5E_FUNC, Function entry/exit
MAJOR, H5E_ATOM, Object atom
@@ -81,7 +81,7 @@ MAJOR, H5E_NONE_MAJOR, No error
# Sections (for grouping minor errors)
SECTION, ARGS, Argument errors
SECTION, RESOURCE, Resource errors
-SECTION, FILEACC, File accessability errors
+SECTION, FILEACC, File accessibilty errors
SECTION, FILE, Generic low-level file I/O errors
SECTION, FUNC, Function entry/exit interface errors
SECTION, ATOM, Object atom related errors
@@ -121,7 +121,7 @@ MINOR, RESOURCE, H5E_CANTGC, Unable to garbage collect
MINOR, RESOURCE, H5E_CANTGETSIZE, Unable to compute size
MINOR, RESOURCE, H5E_OBJOPEN, Object is already open
-# File accessability errors
+# File accessibilty errors
MINOR, FILEACC, H5E_FILEEXISTS, File already exists
MINOR, FILEACC, H5E_FILEOPEN, File already open
MINOR, FILEACC, H5E_CANTCREATE, Unable to create file
diff --git a/src/H5trace.c b/src/H5trace.c
index 2dab8ec..92736d4 100644
--- a/src/H5trace.c
+++ b/src/H5trace.c
@@ -612,10 +612,6 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
fprintf(out, "H5D_MPIO_MULTI_CHUNK");
break;
- case H5D_MPIO_MULTI_CHUNK_NO_OPT:
- fprintf(out, "H5D_MPIO_MULTI_CHUNK_NO_OPT");
- break;
-
default:
fprintf(out, "%ld", (long)chunk_opt_mode);
break;
diff --git a/src/Makefile.in b/src/Makefile.in
index c3b2e88..79bd99d 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -304,7 +304,6 @@ FILTERS = @FILTERS@
FSEARCH_DIRS = @FSEARCH_DIRS@
GPFS = @GPFS@
GREP = @GREP@
-H5BLD_STATIC = @H5BLD_STATIC@
H5_CFLAGS = @H5_CFLAGS@
H5_CPPFLAGS = @H5_CPPFLAGS@
H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -319,7 +318,6 @@ HAVE_DMALLOC = @HAVE_DMALLOC@
HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
HDF5_HL = @HDF5_HL@
HDF5_INTERFACES = @HDF5_INTERFACES@
-HDF5_USE_SHLIB = @HDF5_USE_SHLIB@
HDF_CXX = @HDF_CXX@
HDF_FORTRAN = @HDF_FORTRAN@
HDF_FORTRAN2003 = @HDF_FORTRAN2003@