From 4ec99fe2b43e34d8f94f3aaadda7915ceb8bfc79 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Fri, 30 Apr 2004 19:13:07 -0500 Subject: [svn-r8446] Purpose: Code optimization Description: Avoid dividing the chunk coordinates at the top levels of the chunk I/O routines, only to multiply them at the bottom of the routines. Platforms tested: Solaris 2.7 (arabica) FreeBSD 4.9 (sleipnir) too minor to require h5committest --- src/H5Dio.c | 60 ++++++++++----------------------------------------------- src/H5Distore.c | 28 ++++++++++----------------- src/H5Fistore.c | 28 ++++++++++----------------- 3 files changed, 30 insertions(+), 86 deletions(-) diff --git a/src/H5Dio.c b/src/H5Dio.c index c2239b1..b64d844 100644 --- a/src/H5Dio.c +++ b/src/H5Dio.c @@ -109,8 +109,6 @@ static herr_t H5D_create_chunk_map(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *file_space, const H5S_t *mem_space, fm_map *fm); static herr_t H5D_destroy_chunk_map(const fm_map *fm); static void H5D_free_chunk_info(void *chunk_info); -static herr_t H5D_chunk_coords_assist(hssize_t *coords, size_t ndims, - const hsize_t chunks[], hsize_t chunk_idx); static herr_t H5D_create_chunk_file_map_hyper(const fm_map *fm); static herr_t H5D_create_chunk_mem_map_hyper(const fm_map *fm); static herr_t H5D_chunk_file_cb(void *elem, hid_t type_id, hsize_t ndims, @@ -2239,44 +2237,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5D_chunk_coords_assist - * - * Purpose: Compute the coords for a particular chunk (in CHUNK_IDX), - * based on the size of the dataset's dataspace (given in - * NDIMS and CHUNKS), putting the resulting chunk's coordinate - * offsets in the COORDS array. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Raymond Lu - * Thursday, April 10, 2003 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static herr_t -H5D_chunk_coords_assist(hssize_t *coords, size_t ndims, const hsize_t chunks[], hsize_t chunk_idx) -{ - hsize_t tmp; /* Size of "down elements" in each dimension */ - size_t i, j; /* Local index variables */ - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_chunk_coords_assist) - - for(i=0; imspace=NULL; new_chunk_info->mspace_shared=0; - /* Compute the chunk's coordinates */ - if(H5D_chunk_coords_assist(new_chunk_info->coords, fm->f_ndims, fm->chunks, chunk_index)<0) { - H5D_free_chunk_info(new_chunk_info); - HGOTO_ERROR(H5E_DATASPACE,H5E_CANTCOUNT,FAIL,"can't compute chunk info") - } /* end if */ + /* Copy the chunk's coordinates */ + HDmemcpy(new_chunk_info->coords,coords,fm->f_ndims*sizeof(new_chunk_info->coords[0])); + new_chunk_info->coords[fm->f_ndims]=0; /* Insert the new chunk into the TBBT tree */ if(H5TB_dins(fm->fsel,new_chunk_info,new_chunk_info)==NULL) { @@ -2945,7 +2903,7 @@ H5D_create_chunk_mem_map_hyper(const fm_map *fm) /* Compensate for the chunk offset */ for(u=0; uf_ndims; u++) { H5_CHECK_OVERFLOW(fm->layout->dim[u],hsize_t,hssize_t); - chunk_adjust[u]=adjust[u]-(chunk_info->coords[u]*(hssize_t)fm->layout->dim[u]); /*lint !e771 The adjust array will always be initialized */ + chunk_adjust[u]=adjust[u]-chunk_info->coords[u]; /*lint !e771 The adjust array will always be initialized */ } /* end for */ #ifdef QAK { @@ -3075,12 +3033,14 @@ H5D_chunk_file_cb(void UNUSED *elem, hid_t UNUSED type_id, hsize_t ndims, hssize /* Set the memory chunk dataspace */ new_chunk_info->mspace=NULL; + new_chunk_info->mspace_shared=0; /* Compute the chunk's coordinates */ - if(H5D_chunk_coords_assist(new_chunk_info->coords, fm->f_ndims, fm->chunks, chunk_index)<0) { - H5D_free_chunk_info(new_chunk_info); - HGOTO_ERROR(H5E_DATASPACE,H5E_CANTCOUNT,FAIL,"can't compute chunk info") - } /* end if */ + for(u=0; uf_ndims; u++) { + H5_CHECK_OVERFLOW(fm->layout->dim[u],hsize_t,hssize_t); + new_chunk_info->coords[u]=(coords[u]/(hssize_t)fm->layout->dim[u])*(hssize_t)fm->layout->dim[u]; + } /* end for */ + new_chunk_info->coords[fm->f_ndims]=0; /* Insert the new chunk into the TBBT tree */ if(H5TB_dins(fm->fsel,new_chunk_info,new_chunk_info)==NULL) { diff --git a/src/H5Distore.c b/src/H5Distore.c index 4949e0b..bb01459 100644 --- a/src/H5Distore.c +++ b/src/H5Distore.c @@ -1696,7 +1696,6 @@ H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxp void *buf) { haddr_t chunk_addr; /* Chunk address on disk */ - hssize_t chunk_coords_in_elmts[H5O_LAYOUT_NDIMS]; size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ @@ -1719,16 +1718,13 @@ H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxp assert(chunk_coords[u]>=0); /*negative coordinates not supported (yet) */ #endif - for (u=0; undims; u++) - chunk_coords_in_elmts[u] = chunk_coords[u] * (hssize_t)(layout->dim[u]); - /* Get the address of this chunk on disk */ #ifdef QAK -HDfprintf(stderr,"%s: chunk_coords_in_elmts={",FUNC); +HDfprintf(stderr,"%s: chunk_coords={",FUNC); for(u=0; undims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords_in_elmts[u],(u<(layout->ndims-1) ? ", " : "}\n")); + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords_in_elmts, NULL); + chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords, NULL); #ifdef QAK HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->chunk_size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); @@ -1758,7 +1754,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * chunk. */ if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - chunk_coords_in_elmts, FALSE, &idx_hint))) + chunk_coords, FALSE, &idx_hint))) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1767,7 +1763,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, FALSE, - chunk_coords_in_elmts, &idx_hint, chunk, (size_t)naccessed)<0) + chunk_coords, &idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk"); /* Set return value */ @@ -1803,7 +1799,6 @@ H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, const void *buf) { haddr_t chunk_addr; /* Chunk address on disk */ - hssize_t chunk_coords_in_elmts[H5O_LAYOUT_NDIMS]; size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ @@ -1826,16 +1821,13 @@ H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, assert(chunk_coords[u]>=0); /*negative coordinates not supported (yet) */ #endif - for (u=0; undims; u++) - chunk_coords_in_elmts[u] = chunk_coords[u] * (hssize_t)(layout->dim[u]); - /* Get the address of this chunk on disk */ #ifdef QAK -HDfprintf(stderr,"%s: chunk_coords_in_elmts={",FUNC); +HDfprintf(stderr,"%s: chunk_coords={",FUNC); for(u=0; undims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords_in_elmts[u],(u<(layout->ndims-1) ? ", " : "}\n")); + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords_in_elmts, NULL); + chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords, NULL); #ifdef QAK HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->chunk_size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); @@ -1881,7 +1873,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a relax = FALSE; if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - chunk_coords_in_elmts, relax, &idx_hint))) + chunk_coords, relax, &idx_hint))) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1890,7 +1882,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, TRUE, - chunk_coords_in_elmts, &idx_hint, chunk, (size_t)naccessed)<0) + chunk_coords, &idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk"); /* Set return value */ diff --git a/src/H5Fistore.c b/src/H5Fistore.c index 4949e0b..bb01459 100644 --- a/src/H5Fistore.c +++ b/src/H5Fistore.c @@ -1696,7 +1696,6 @@ H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxp void *buf) { haddr_t chunk_addr; /* Chunk address on disk */ - hssize_t chunk_coords_in_elmts[H5O_LAYOUT_NDIMS]; size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ @@ -1719,16 +1718,13 @@ H5F_istore_readvv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, hid_t dxp assert(chunk_coords[u]>=0); /*negative coordinates not supported (yet) */ #endif - for (u=0; undims; u++) - chunk_coords_in_elmts[u] = chunk_coords[u] * (hssize_t)(layout->dim[u]); - /* Get the address of this chunk on disk */ #ifdef QAK -HDfprintf(stderr,"%s: chunk_coords_in_elmts={",FUNC); +HDfprintf(stderr,"%s: chunk_coords={",FUNC); for(u=0; undims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords_in_elmts[u],(u<(layout->ndims-1) ? ", " : "}\n")); + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords_in_elmts, NULL); + chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords, NULL); #ifdef QAK HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->chunk_size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); @@ -1758,7 +1754,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a * chunk. */ if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - chunk_coords_in_elmts, FALSE, &idx_hint))) + chunk_coords, FALSE, &idx_hint))) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1767,7 +1763,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, FALSE, - chunk_coords_in_elmts, &idx_hint, chunk, (size_t)naccessed)<0) + chunk_coords, &idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk"); /* Set return value */ @@ -1803,7 +1799,6 @@ H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, const void *buf) { haddr_t chunk_addr; /* Chunk address on disk */ - hssize_t chunk_coords_in_elmts[H5O_LAYOUT_NDIMS]; size_t u; /* Local index variables */ ssize_t ret_value; /* Return value */ @@ -1826,16 +1821,13 @@ H5F_istore_writevv(H5F_t *f, const struct H5D_dxpl_cache_t *dxpl_cache, assert(chunk_coords[u]>=0); /*negative coordinates not supported (yet) */ #endif - for (u=0; undims; u++) - chunk_coords_in_elmts[u] = chunk_coords[u] * (hssize_t)(layout->dim[u]); - /* Get the address of this chunk on disk */ #ifdef QAK -HDfprintf(stderr,"%s: chunk_coords_in_elmts={",FUNC); +HDfprintf(stderr,"%s: chunk_coords={",FUNC); for(u=0; undims; u++) - HDfprintf(stderr,"%Hd%s",chunk_coords_in_elmts[u],(u<(layout->ndims-1) ? ", " : "}\n")); + HDfprintf(stderr,"%Hd%s",chunk_coords[u],(u<(layout->ndims-1) ? ", " : "}\n")); #endif /* QAK */ - chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords_in_elmts, NULL); + chunk_addr=H5F_istore_get_addr(f, dxpl_id, layout, chunk_coords, NULL); #ifdef QAK HDfprintf(stderr,"%s: chunk_addr=%a, chunk_size=%Hu\n",FUNC,chunk_addr,layout->chunk_size); HDfprintf(stderr,"%s: chunk_len_arr[%Zu]=%Zu\n",FUNC,*chunk_curr_seq,chunk_len_arr[*chunk_curr_seq]); @@ -1881,7 +1873,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a relax = FALSE; if (NULL==(chunk=H5F_istore_lock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, &dcpl_cache->fill, dcpl_cache->fill_time, - chunk_coords_in_elmts, relax, &idx_hint))) + chunk_coords, relax, &idx_hint))) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "unable to read raw data chunk"); /* Use the vectorized memory copy routine to do actual work */ @@ -1890,7 +1882,7 @@ HDfprintf(stderr,"%s: mem_offset_arr[%Zu]=%Hu\n",FUNC,*mem_curr_seq,mem_offset_a H5_CHECK_OVERFLOW(naccessed,ssize_t,size_t); if (H5F_istore_unlock(f, dxpl_cache, dxpl_id, layout, &dcpl_cache->pline, TRUE, - chunk_coords_in_elmts, &idx_hint, chunk, (size_t)naccessed)<0) + chunk_coords, &idx_hint, chunk, (size_t)naccessed)<0) HGOTO_ERROR (H5E_IO, H5E_WRITEERROR, FAIL, "uanble to unlock raw data chunk"); /* Set return value */ -- cgit v0.12