diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2003-05-31 16:26:19 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2003-05-31 16:26:19 (GMT) |
commit | f04d4aea61c6becc0f0299cc98b4e5b120ce20ab (patch) | |
tree | d0f5a2b7db8f4a2c0cac30e4bf5e41fd68ef5a6c /src/H5S.c | |
parent | 862520b80e8e1b29f5b5a719b40506e348c2ee47 (diff) | |
download | hdf5-f04d4aea61c6becc0f0299cc98b4e5b120ce20ab.zip hdf5-f04d4aea61c6becc0f0299cc98b4e5b120ce20ab.tar.gz hdf5-f04d4aea61c6becc0f0299cc98b4e5b120ce20ab.tar.bz2 |
[svn-r6942] Purpose:
Performance improment
Description:
Speed up chunked dataset I/O. This breaks down into several areas:
- Compute chunk selections in the file by using hyperslab operations
instead of iterating over each element in the selection.
- If the file and memory selections are the same shape, use the file
chunk selections to compute the memory chunk selections.
This required several additional dataspace, dataspace selection and
hyperslab routines.
Platforms tested:
h5committestted (although Fortran tests failed for some reason)
Diffstat (limited to 'src/H5S.c')
-rw-r--r-- | src/H5S.c | 69 |
1 files changed, 46 insertions, 23 deletions
@@ -454,12 +454,8 @@ H5S_close(H5S_t *ds) assert(ds); - /* If there was a previous offset for the selection, release it */ - if(ds->select.offset!=NULL) - ds->select.offset=H5FL_ARR_FREE(hssize_t,ds->select.offset); - /* Release selection (this should come before the extent release) */ - (*ds->select.release)(ds); + H5S_select_release(ds); /* Release extent */ H5S_extent_release(ds); @@ -1913,14 +1909,9 @@ H5Soffset_simple(hid_t space_id, const hssize_t *offset) if (offset == NULL) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no offset specified"); - /* Allocate space for new offset */ - if(space->select.offset==NULL) { - if (NULL==(space->select.offset = H5FL_ARR_MALLOC(hssize_t,space->extent.u.simple.rank))) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - } - - /* Copy the offset over */ - HDmemcpy(space->select.offset,offset,sizeof(hssize_t)*space->extent.u.simple.rank); + /* Set the selection offset */ + if(H5S_select_offset(space,offset)<0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't set offset"); done: FUNC_LEAVE_API(ret_value); @@ -1964,16 +1955,8 @@ H5S_set_extent( H5S_t *space, const hsize_t *size ) } /* end for */ /* Update */ - if (ret_value) { - hsize_t nelem; /* Number of elements in extent */ - - /* Change the dataspace size & re-compute the number of elements in the extent */ - for (u=0, nelem=1; u < space->extent.u.simple.rank; u++ ) { - space->extent.u.simple.size[u] = size[u]; - nelem*=space->extent.u.simple.size[u]; - } /* end for */ - space->extent.nelem = nelem; - } /* end if */ + if (ret_value) + H5S_set_extent_real(space,size); done: FUNC_LEAVE_NOAPI(ret_value); @@ -1981,6 +1964,46 @@ done: /*------------------------------------------------------------------------- + * Function: H5S_set_extent_real + * + * Purpose: Modify the dimensions of a data space. Based on H5S_extend + * + * Return: Success: Non-negative + * + * Failure: Negative + * + * Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu + * + * Date: March 13, 2002 + * + *------------------------------------------------------------------------- + */ +herr_t +H5S_set_extent_real( H5S_t *space, const hsize_t *size ) +{ + hsize_t nelem; /* Number of elements in extent */ + unsigned u; /* Local index variable */ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5S_set_extent_real, FAIL ); + + /* Check args */ + assert(space && H5S_SIMPLE==space->extent.type ); + assert(size); + + /* Change the dataspace size & re-compute the number of elements in the extent */ + for (u=0, nelem=1; u < space->extent.u.simple.rank; u++ ) { + space->extent.u.simple.size[u] = size[u]; + nelem*=space->extent.u.simple.size[u]; + } /* end for */ + space->extent.nelem = nelem; + +done: + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5S_set_extent_real() */ + + +/*------------------------------------------------------------------------- * Function: H5S_debug * * Purpose: Prints debugging information about a data space. |