[svn-r6961] Purpose:

Bug fix

Description:
    An earlier checkin changed some of the assumptions about single block
hyperslabs, causing them to fail in odd ways.

Solution:
    Fix errors with single block hyperslabs by keying off of count==1 instead
of stride==1.

Platforms tested:
    FreeBSD 4.8 (sleipnir) w/parallel
    h5committested
This commit is contained in:
Quincey Koziol 2003-06-04 13:42:20 -05:00
parent e03437e4da
commit ab28d2c820
7 changed files with 105 additions and 46 deletions

View File

@ -264,7 +264,7 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout,
if(using_mpi) {
/* Round-robin write the chunks out from only one process */
if(mpi_round==mpi_rank) {
if (H5F_contig_write(f, size, addr, size, dxpl_id, buf)<0)
if (H5F_contig_write(f, (hsize_t)size, addr, size, dxpl_id, buf)<0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset");
} /* end if */
++mpi_round;

View File

@ -264,7 +264,7 @@ H5F_contig_fill(H5F_t *f, hid_t dxpl_id, struct H5O_layout_t *layout,
if(using_mpi) {
/* Round-robin write the chunks out from only one process */
if(mpi_round==mpi_rank) {
if (H5F_contig_write(f, size, addr, size, dxpl_id, buf)<0)
if (H5F_contig_write(f, (hsize_t)size, addr, size, dxpl_id, buf)<0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to write fill value to dataset");
} /* end if */
++mpi_round;

View File

@ -213,8 +213,8 @@ H5S_hyper_iter_init(H5S_sel_iter_t *iter, const H5S_t *space, size_t elmt_size)
else {
if((unsigned)i==(cont_dim-1)) {
iter->u.hyp.diminfo[i].start = tdiminfo[i].start*acc;
/* Special case for stride==1 regular selections */
if(tdiminfo[i].stride==1)
/* Special case for single block regular selections */
if(tdiminfo[i].count==1)
iter->u.hyp.diminfo[i].stride = 1;
else
iter->u.hyp.diminfo[i].stride = tdiminfo[i].stride*acc;
@ -563,7 +563,7 @@ H5S_hyper_iter_next(H5S_sel_iter_t *iter, size_t nelem)
/* Calculate the offset and block count for each dimension */
for(i=0; i<ndims; i++) {
if(tdiminfo[i].stride==1) {
if(tdiminfo[i].count==1) {
iter_offset[i]=iter->u.hyp.off[i]-tdiminfo[i].start;
iter_count[i]=0;
} /* end if */
@ -778,7 +778,7 @@ H5S_hyper_iter_next_block(H5S_sel_iter_t *iter)
/* Calculate the offset and block count for each dimension */
for(u=0; u<ndims; u++) {
if(tdiminfo[u].stride==1) {
if(tdiminfo[u].count==1) {
iter_offset[u]=iter->u.hyp.off[u]-tdiminfo[u].start;
iter_count[u]=0;
} /* end if */
@ -2090,14 +2090,8 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
UINT32ENCODE(buf, (uint32_t)offset[i]);
/* Encode hyperslab ending location */
for(i=0; i<ndims; i++) {
if(diminfo[i].stride==1) {
UINT32ENCODE(buf, (uint32_t)(offset[i]+(diminfo[i].count-1)));
} /* end if */
else {
UINT32ENCODE(buf, (uint32_t)(offset[i]+(diminfo[i].block-1)));
} /* end else */
} /* end for */
for(i=0; i<ndims; i++)
UINT32ENCODE(buf, (uint32_t)(offset[i]+(diminfo[i].block-1)));
/* Move the offset to the next sequence to start */
offset[fast_dim]+=diminfo[fast_dim].stride;
@ -2230,7 +2224,7 @@ H5S_hyper_deserialize (H5S_t *space, const uint8_t *buf)
/* Set the count & stride for all blocks */
for(tcount=count,tstride=stride,j=0; j<rank; j++,tstride++,tcount++) {
*tcount=1;
*tstride=0;
*tstride=1;
} /* end for */
/* Retrieve the coordinates from the buffer */
@ -2452,12 +2446,8 @@ H5S_get_select_hyper_blocklist(H5S_t *space, hsize_t startblock, hsize_t numbloc
/* Compute the ending location */
HDmemcpy(buf,offset,sizeof(hsize_t)*ndims);
for(i=0; i<ndims; i++) {
if(diminfo[i].stride==1)
buf[i]+=(diminfo[i].count-1);
else
buf[i]+=(diminfo[i].block-1);
} /* end for */
for(i=0; i<ndims; i++)
buf[i]+=(diminfo[i].block-1);
buf+=ndims;
/* Decrement the number of blocks to retrieve */
@ -3539,7 +3529,7 @@ H5S_hyper_convert(H5S_t *space)
/* Fill in temporary information for the dimensions */
for(u=0; u<space->extent.u.simple.rank; u++) {
tmp_start[u]=0;
tmp_stride[u]=0;
tmp_stride[u]=1;
tmp_count[u]=1;
tmp_block[u]=space->extent.u.simple.size[u];
} /* end for */
@ -5223,7 +5213,12 @@ H5S_generate_hyperslab (H5S_t *space, H5S_seloper_t op,
block[u]=_block[u]*_count[u];
}
else {
stride[u]=_stride[u];
if(_count[u]==1)
stride[u]=1;
else {
assert(_stride[u]>_block[u]);
stride[u]=_stride[u];
} /* end else */
count[u]=_count[u];
block[u]=_block[u];
} /* end if */
@ -5451,7 +5446,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
/* Fill in the correct stride values */
if(stride==NULL) {
hssize_t fill=1;
hsize_t fill=1;
/* Allocate temporary buffer */
if ((_stride=H5FL_ARR_MALLOC(hsize_t,space->extent.u.simple.rank))==NULL)
@ -5462,7 +5457,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
/* Fill in the correct block values */
if(block==NULL) {
hssize_t fill=1;
hsize_t fill=1;
/* Allocate temporary buffer */
if ((_block=H5FL_ARR_MALLOC(hsize_t,space->extent.u.simple.rank))==NULL)
@ -5596,7 +5591,12 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
diminfo[u].block=count[u]*block[u];
} /* end if */
else {
diminfo[u].stride=stride[u];
if(count[u]==1)
diminfo[u].stride=1;
else {
assert(stride[u]>block[u]);
diminfo[u].stride=stride[u];
} /* end else */
diminfo[u].count=count[u];
diminfo[u].block=block[u];
} /* end else */
@ -5685,6 +5685,7 @@ H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hssize_t start[],
const hsize_t stride[], const hsize_t count[], const hsize_t block[])
{
H5S_t *space = NULL; /* Dataspace to modify selection of */
unsigned u; /* Local index variable */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_API(H5Sselect_hyperslab, FAIL);
@ -5697,9 +5698,22 @@ H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hssize_t start[],
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hyperslab doesn't support H5S_SCALAR space");
if(start==NULL || count==NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab not specified");
if(!(op>H5S_SELECT_NOOP && op<H5S_SELECT_INVALID))
HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation");
if(stride!=NULL) {
/* Check for 0-sized strides */
for(u=0; u<space->extent.u.simple.rank; u++) {
if(stride[u]==0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid stride==0 value");
} /* end for */
if(block!=NULL) {
/* Check for strides smaller than blocks */
for(u=0; u<space->extent.u.simple.rank; u++) {
if(count[u]>1 && stride[u]<block[u])
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid stride<block value");
} /* end for */
} /* end if */
} /* end if */
if (H5S_select_hyperslab(space, op, start, stride, count, block)<0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to set hyperslab selection");
@ -5967,7 +5981,12 @@ H5S_generate_hyperslab (H5S_t *space, H5S_seloper_t op,
block[u]=_block[u]*_count[u];
}
else {
stride[u]=_stride[u];
if(_count[u]==1)
stride[u]=1;
else {
assert(_stride[u]>_block[u]);
stride[u]=_stride[u];
} /* end else */
count[u]=_count[u];
block[u]=_block[u];
} /* end if */
@ -6036,7 +6055,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
/* Fill in the correct stride values */
if(stride==NULL) {
hssize_t fill=1;
hsize_t fill=1;
/* Allocate temporary buffer */
if ((_stride=H5FL_ARR_MALLOC(hsize_t,space->extent.u.simple.rank))==NULL)
@ -6047,7 +6066,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
/* Fill in the correct block values */
if(block==NULL) {
hssize_t fill=1;
hsize_t fill=1;
/* Allocate temporary buffer */
if ((_block=H5FL_ARR_MALLOC(hsize_t,space->extent.u.simple.rank))==NULL)
@ -6105,7 +6124,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
/* Fill in temporary information for the dimensions */
for(u=0; u<space->extent.u.simple.rank; u++) {
tmp_start[u]=0;
tmp_stride[u]=0;
tmp_stride[u]=1;
tmp_count[u]=1;
tmp_block[u]=space->extent.u.simple.size[u];
} /* end for */
@ -6182,7 +6201,12 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
diminfo[u].block=count[u]*block[u];
} /* end if */
else {
diminfo[u].stride=stride[u];
if(count[u]==1)
diminfo[u].stride=1;
else {
assert(stride[u]>block[u]);
diminfo[u].stride=stride[u];
} /* end else */
diminfo[u].count=count[u];
diminfo[u].block=block[u];
} /* end else */
@ -6263,11 +6287,26 @@ H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hssize_t start[],
/* Check args */
if (NULL == (space=H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space");
if (H5S_SCALAR==H5S_get_simple_extent_type(space))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hyperslab doesn't support H5S_SCALAR space");
if(start==NULL || count==NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hyperslab not specified");
if(!(op>H5S_SELECT_NOOP && op<H5S_SELECT_INVALID))
HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation");
if(stride!=NULL) {
/* Check for 0-sized strides */
for(u=0; u<space->extent.u.simple.rank; u++) {
if(stride[u]==0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid stride==0 value");
} /* end for */
if(block!=NULL) {
/* Check for strides smaller than blocks */
for(u=0; u<space->extent.u.simple.rank; u++) {
if(count[u]>1 && stride[u]<block[u])
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid stride<block value");
} /* end for */
} /* end if */
} /* end if */
if (H5S_select_hyperslab(space, op, start, stride, count, block)<0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to set hyperslab selection");
@ -7118,11 +7157,11 @@ H5S_hyper_get_seq_list_opt(const H5S_t *space,H5S_sel_iter_t *iter,
/* Check if we stopped in the middle of a sequence of elements */
if((iter->u.hyp.off[fast_dim]-tdiminfo[fast_dim].start)%tdiminfo[fast_dim].stride!=0 ||
((iter->u.hyp.off[fast_dim]!=tdiminfo[fast_dim].start) && tdiminfo[fast_dim].stride==1)) {
((iter->u.hyp.off[fast_dim]!=tdiminfo[fast_dim].start) && tdiminfo[fast_dim].count==1)) {
size_t leftover; /* The number of elements left over from the last sequence */
/* Calculate the number of elements left in the sequence */
if(tdiminfo[fast_dim].stride==1) {
if(tdiminfo[fast_dim].count==1) {
H5_ASSIGN_OVERFLOW(leftover, tdiminfo[fast_dim].block-(iter->u.hyp.off[fast_dim]-tdiminfo[fast_dim].start) ,hsize_t,size_t);
} /* end if */
else {
@ -7172,7 +7211,7 @@ H5S_hyper_get_seq_list_opt(const H5S_t *space,H5S_sel_iter_t *iter,
/* Compute the current "counts" for this location */
for(i=0; i<ndims; i++) {
if(tdiminfo[i].stride==1) {
if(tdiminfo[i].count==1) {
tmp_count[i] = 0;
tmp_block[i] = iter->u.hyp.off[i]-tdiminfo[i].start;
} /* end if */

View File

@ -1624,7 +1624,7 @@ test_refer_dtype2(hid_t file)
/* Create references */
/* Select 6x6 hyperslab for first reference */
start[0]=2; start[1]=2;
stride[0]=0; stride[1]=0;
stride[0]=1; stride[1]=1;
count[0]=1; count[1]=1;
block[0]=6; block[1]=6;

View File

@ -385,7 +385,7 @@ test_reference_region(void)
/* Select 6x6 hyperslab for first reference */
start[0]=2; start[1]=2;
stride[0]=0; stride[1]=0;
stride[0]=1; stride[1]=1;
count[0]=1; count[1]=1;
block[0]=6; block[1]=6;
ret = H5Sselect_hyperslab(sid2,H5S_SELECT_SET,start,stride,count,block);

View File

@ -205,6 +205,26 @@ test_select_hyper(hid_t xfer_plist)
ext_type = H5Sget_simple_extent_type(sid1);
VERIFY(ext_type, H5S_SIMPLE, "H5Sget_simple_extent_type");
/* Test selecting stride==0 to verify failure */
start[0]=1; start[1]=0; start[2]=0;
stride[0]=0; stride[1]=0; stride[2]=0;
count[0]=2; count[1]=15; count[2]=13;
block[0]=1; block[1]=1; block[2]=1;
H5E_BEGIN_TRY {
ret = H5Sselect_hyperslab(sid1,H5S_SELECT_SET,start,stride,count,block);
} H5E_END_TRY;
VERIFY(ret, FAIL, "H5Sselect_hyperslab");
/* Test selecting stride<block to verify failure */
start[0]=1; start[1]=0; start[2]=0;
stride[0]=1; stride[1]=1; stride[2]=1;
count[0]=2; count[1]=15; count[2]=13;
block[0]=2; block[1]=2; block[2]=2;
H5E_BEGIN_TRY {
ret = H5Sselect_hyperslab(sid1,H5S_SELECT_SET,start,stride,count,block);
} H5E_END_TRY;
VERIFY(ret, FAIL, "H5Sselect_hyperslab");
/* Select 2x15x13 hyperslab for disk dataset */
start[0]=1; start[1]=0; start[2]=0;
stride[0]=1; stride[1]=1; stride[2]=1;
@ -4140,7 +4160,7 @@ test_select_combine(void)
/* 'AND' "all" selection with another hyperslab */
start[0]=start[1]=0;
stride[0]=stride[1]=0;
stride[0]=stride[1]=1;
count[0]=count[1]=1;
block[0]=block[1]=5;
error=H5Sselect_hyperslab(space1,H5S_SELECT_AND,start,stride,count,block);
@ -4274,7 +4294,7 @@ test_select_combine(void)
/* 'OR' "none" selection with another hyperslab */
start[0]=start[1]=0;
stride[0]=stride[1]=0;
stride[0]=stride[1]=1;
count[0]=count[1]=1;
block[0]=block[1]=5;
error=H5Sselect_hyperslab(space1,H5S_SELECT_OR,start,stride,count,block);
@ -4309,7 +4329,7 @@ test_select_combine(void)
/* 'AND' "none" selection with another hyperslab */
start[0]=start[1]=0;
stride[0]=stride[1]=0;
stride[0]=stride[1]=1;
count[0]=count[1]=1;
block[0]=block[1]=5;
error=H5Sselect_hyperslab(space1,H5S_SELECT_AND,start,stride,count,block);
@ -4329,7 +4349,7 @@ test_select_combine(void)
/* 'XOR' "none" selection with another hyperslab */
start[0]=start[1]=0;
stride[0]=stride[1]=0;
stride[0]=stride[1]=1;
count[0]=count[1]=1;
block[0]=block[1]=5;
error=H5Sselect_hyperslab(space1,H5S_SELECT_XOR,start,stride,count,block);
@ -4364,7 +4384,7 @@ test_select_combine(void)
/* 'NOTB' "none" selection with another hyperslab */
start[0]=start[1]=0;
stride[0]=stride[1]=0;
stride[0]=stride[1]=1;
count[0]=count[1]=1;
block[0]=block[1]=5;
error=H5Sselect_hyperslab(space1,H5S_SELECT_NOTB,start,stride,count,block);
@ -4384,7 +4404,7 @@ test_select_combine(void)
/* 'NOTA' "none" selection with another hyperslab */
start[0]=start[1]=0;
stride[0]=stride[1]=0;
stride[0]=stride[1]=1;
count[0]=count[1]=1;
block[0]=block[1]=5;
error=H5Sselect_hyperslab(space1,H5S_SELECT_NOTA,start,stride,count,block);

View File

@ -75,7 +75,7 @@ if (verbose) printf("slab_set BYCOL\n");
/* Similar to BYROW except process 0 gets 0 row */
block[0] = (mpi_rank ? dim0/mpi_size : 0);
block[1] = dim1;
stride[0] = block[0];
stride[0] = (mpi_rank ? block[0] : 1); /* avoid setting stride to 0 */
stride[1] = block[1];
count[0] = 1;
count[1] = 1;
@ -88,7 +88,7 @@ if (verbose) printf("slab_set ZROW\n");
block[0] = dim0;
block[1] = (mpi_rank ? dim1/mpi_size : 0);
stride[0] = block[0];
stride[1] = block[1];
stride[1] = (mpi_rank ? block[1] : 1); /* avoid setting stride to 0 */
count[0] = 1;
count[1] = 1;
start[0] = 0;