mirror of
https://github.com/HDFGroup/hdf5.git
synced 2026-10-07 04:02:30 +03:00
[svn-r10578] Purpose:
Code optimization
Description:
Reduce overhead for common case of stride==NULL and block==NULL for
H5Sselect_hyperslab() calls.
Platforms tested:
FreeBSD 4.11 (sleipnir)
Solaris 2.9 (shanti)
This commit is contained in:
1 parent
b6c87bcdac
commit
d4ab501d63
1 file changed
+82
-55
+82
-55
@@ -104,12 +104,9 @@ static const H5S_sel_iter_class_t H5S_sel_iter_hyper[1] = {{
|
||||
}};
|
||||
|
||||
/* Static variables */
|
||||
static const hsize_t _stride[H5O_LAYOUT_NDIMS]={ /* Default stride array */
|
||||
1,1,1,1, 1,1,1,1,
|
||||
1,1,1,1, 1,1,1,1,
|
||||
1,1,1,1, 1,1,1,1,
|
||||
1,1,1,1, 1,1,1,1,1};
|
||||
static const hsize_t _block[H5O_LAYOUT_NDIMS]={ /* Default block size array */
|
||||
|
||||
/* Array for default stride, block, etc. */
|
||||
static const hsize_t _ones[H5O_LAYOUT_NDIMS]={
|
||||
1,1,1,1, 1,1,1,1,
|
||||
1,1,1,1, 1,1,1,1,
|
||||
1,1,1,1, 1,1,1,1,
|
||||
@@ -5703,10 +5700,13 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
|
||||
const hsize_t count[],
|
||||
const hsize_t *block)
|
||||
{
|
||||
hsize_t opt_stride[H5O_LAYOUT_NDIMS]; /* Optimized stride information */
|
||||
hsize_t opt_count[H5O_LAYOUT_NDIMS]; /* Optimized count information */
|
||||
hsize_t opt_block[H5O_LAYOUT_NDIMS]; /* Optimized block information */
|
||||
unsigned u; /* Counters */
|
||||
hsize_t int_stride[H5O_LAYOUT_NDIMS]; /* Internal storage for stride information */
|
||||
hsize_t int_count[H5O_LAYOUT_NDIMS]; /* Internal storage for count information */
|
||||
hsize_t int_block[H5O_LAYOUT_NDIMS]; /* Internal storage for block information */
|
||||
const hsize_t *opt_stride; /* Optimized stride information */
|
||||
const hsize_t *opt_count; /* Optimized count information */
|
||||
const hsize_t *opt_block; /* Optimized block information */
|
||||
unsigned u; /* Counters */
|
||||
herr_t ret_value=SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI(H5S_select_hyperslab, FAIL);
|
||||
@@ -5719,11 +5719,11 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
|
||||
|
||||
/* Point to the correct stride values */
|
||||
if(stride==NULL)
|
||||
stride = _stride;
|
||||
stride = _ones;
|
||||
|
||||
/* Point to the correct block values */
|
||||
if(block==NULL)
|
||||
block = _block;
|
||||
block = _ones;
|
||||
|
||||
/*
|
||||
* Check for overlapping hyperslab blocks in new selection.
|
||||
@@ -5734,27 +5734,39 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
|
||||
} /* end for */
|
||||
|
||||
/* Optimize hyperslab parameters to merge contiguous blocks, etc. */
|
||||
for(u=0; u<space->extent.rank; u++) {
|
||||
/* contiguous hyperslabs have the block size equal to the stride */
|
||||
if(stride[u]==block[u]) {
|
||||
opt_count[u]=1;
|
||||
opt_stride[u]=1;
|
||||
if(block[u]==1)
|
||||
opt_block[u]=count[u];
|
||||
else
|
||||
opt_block[u]=block[u]*count[u];
|
||||
}
|
||||
else {
|
||||
if(count[u]==1)
|
||||
opt_stride[u]=1;
|
||||
if(stride == _ones && block == _ones) {
|
||||
/* Point to existing arrays */
|
||||
opt_stride = _ones;
|
||||
opt_count = _ones;
|
||||
opt_block = count;
|
||||
} /* end if */
|
||||
else {
|
||||
/* Point to local arrays */
|
||||
opt_stride = int_stride;
|
||||
opt_count = int_count;
|
||||
opt_block = int_block;
|
||||
for(u=0; u<space->extent.rank; u++) {
|
||||
/* contiguous hyperslabs have the block size equal to the stride */
|
||||
if(stride[u]==block[u]) {
|
||||
int_count[u]=1;
|
||||
int_stride[u]=1;
|
||||
if(block[u]==1)
|
||||
int_block[u]=count[u];
|
||||
else
|
||||
int_block[u]=block[u]*count[u];
|
||||
} /* end if */
|
||||
else {
|
||||
assert(stride[u]>block[u]);
|
||||
opt_stride[u]=stride[u];
|
||||
if(count[u]==1)
|
||||
int_stride[u]=1;
|
||||
else {
|
||||
assert(stride[u]>block[u]);
|
||||
int_stride[u]=stride[u];
|
||||
} /* end else */
|
||||
int_count[u]=count[u];
|
||||
int_block[u]=block[u];
|
||||
} /* end else */
|
||||
opt_count[u]=count[u];
|
||||
opt_block[u]=block[u];
|
||||
} /* end if */
|
||||
} /* end for */
|
||||
} /* end for */
|
||||
} /* end else */
|
||||
|
||||
/* Fixup operation for non-hyperslab selections */
|
||||
switch(H5S_GET_SELECT_TYPE(space)) {
|
||||
@@ -6242,9 +6254,12 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
|
||||
const hsize_t count[],
|
||||
const hsize_t *block)
|
||||
{
|
||||
hsize_t opt_stride[H5O_LAYOUT_NDIMS]; /* Optimized stride information */
|
||||
hsize_t opt_count[H5O_LAYOUT_NDIMS]; /* Optimized count information */
|
||||
hsize_t opt_block[H5O_LAYOUT_NDIMS]; /* Optimized block information */
|
||||
hsize_t int_stride[H5O_LAYOUT_NDIMS]; /* Internal storage for stride information */
|
||||
hsize_t int_count[H5O_LAYOUT_NDIMS]; /* Internal storage for count information */
|
||||
hsize_t int_block[H5O_LAYOUT_NDIMS]; /* Internal storage for block information */
|
||||
const hsize_t *opt_stride; /* Optimized stride information */
|
||||
const hsize_t *opt_count; /* Optimized count information */
|
||||
const hsize_t *opt_block; /* Optimized block information */
|
||||
unsigned u; /* Counters */
|
||||
herr_t ret_value=SUCCEED; /* Return value */
|
||||
|
||||
@@ -6258,11 +6273,11 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
|
||||
|
||||
/* Point to the correct stride values */
|
||||
if(stride==NULL)
|
||||
stride = _stride;
|
||||
stride = _ones;
|
||||
|
||||
/* Point to the correct block values */
|
||||
if(block==NULL)
|
||||
block = _block;
|
||||
block = _ones;
|
||||
|
||||
/*
|
||||
* Check for overlapping hyperslab blocks in new selection.
|
||||
@@ -6273,27 +6288,39 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
|
||||
} /* end for */
|
||||
|
||||
/* Optimize hyperslab parameters to merge contiguous blocks, etc. */
|
||||
for(u=0; u<space->extent.rank; u++) {
|
||||
/* contiguous hyperslabs have the block size equal to the stride */
|
||||
if(stride[u]==block[u]) {
|
||||
opt_count[u]=1;
|
||||
opt_stride[u]=1;
|
||||
if(block[u]==1)
|
||||
opt_block[u]=count[u];
|
||||
else
|
||||
opt_block[u]=block[u]*count[u];
|
||||
}
|
||||
else {
|
||||
if(count[u]==1)
|
||||
opt_stride[u]=1;
|
||||
if(stride == _ones && block == _ones) {
|
||||
/* Point to existing arrays */
|
||||
opt_stride = _ones;
|
||||
opt_count = _ones;
|
||||
opt_block = count;
|
||||
} /* end if */
|
||||
else {
|
||||
/* Point to local arrays */
|
||||
opt_stride = int_stride;
|
||||
opt_count = int_count;
|
||||
opt_block = int_block;
|
||||
for(u=0; u<space->extent.rank; u++) {
|
||||
/* contiguous hyperslabs have the block size equal to the stride */
|
||||
if(stride[u]==block[u]) {
|
||||
int_count[u]=1;
|
||||
int_stride[u]=1;
|
||||
if(block[u]==1)
|
||||
int_block[u]=count[u];
|
||||
else
|
||||
int_block[u]=block[u]*count[u];
|
||||
} /* end if */
|
||||
else {
|
||||
assert(stride[u]>block[u]);
|
||||
opt_stride[u]=stride[u];
|
||||
if(count[u]==1)
|
||||
int_stride[u]=1;
|
||||
else {
|
||||
assert(stride[u]>block[u]);
|
||||
int_stride[u]=stride[u];
|
||||
} /* end else */
|
||||
int_count[u]=count[u];
|
||||
int_block[u]=block[u];
|
||||
} /* end else */
|
||||
opt_count[u]=count[u];
|
||||
opt_block[u]=block[u];
|
||||
} /* end if */
|
||||
} /* end for */
|
||||
} /* end for */
|
||||
} /* end else */
|
||||
|
||||
/* Fixup operation for non-hyperslab selections */
|
||||
switch(H5S_GET_SELECT_TYPE(space)) {
|
||||
|
||||
Reference in new issue
Block a user