diff options
author | Albert Cheng <acheng@hdfgroup.org> | 1999-05-25 21:29:31 (GMT) |
---|---|---|
committer | Albert Cheng <acheng@hdfgroup.org> | 1999-05-25 21:29:31 (GMT) |
commit | ac830927fbda984086d7bd601282c5f3e5478176 (patch) | |
tree | d516c754a10ce7824f141e1bc82280977fab24f4 /src/H5Sall.c | |
parent | 9282a3e3575d7e3af855bea6ddd4d1a0ba511671 (diff) | |
download | hdf5-ac830927fbda984086d7bd601282c5f3e5478176.zip hdf5-ac830927fbda984086d7bd601282c5f3e5478176.tar.gz hdf5-ac830927fbda984086d7bd601282c5f3e5478176.tar.bz2 |
[svn-r1277] Added additional checks into the dataspace code to determine if the hyperslabs
being written out are contiguous in memory and on disk and write/read them as
one I/O operation (if the datatypes don't require conversion). This should be
a good performance boost for those situations. It's especially needed on the
ASCI Red (TFlops) machine. - QAK (from Albert's account on modi4 :-)
Diffstat (limited to 'src/H5Sall.c')
-rw-r--r-- | src/H5Sall.c | 94 |
1 files changed, 79 insertions, 15 deletions
diff --git a/src/H5Sall.c b/src/H5Sall.c index 4deb877..87e7ac8 100644 --- a/src/H5Sall.c +++ b/src/H5Sall.c @@ -537,6 +537,7 @@ H5S_all_mscat (const void *_tconv_buf, size_t elmt_size, * Thursday, April 22, 1999 * * Modifications: + * Modified to allow contiguous hyperslabs to be written out - QAK - 5/25/99 * *------------------------------------------------------------------------- */ @@ -546,8 +547,12 @@ H5S_all_read(H5F_t *f, const H5O_layout_t *layout, const H5O_pline_t *pline, const H5S_t *mem_space, const H5F_xfer_t *xfer_parms, void *buf/*out*/, hbool_t *must_convert/*out*/) { + H5S_hyper_node_t *file_node,*mem_node; /* Hyperslab node */ + hsize_t mem_size,file_size; + hssize_t file_off; hsize_t size[H5S_MAX_RANK]; - hssize_t offset[H5S_MAX_RANK]; + hssize_t file_offset[H5S_MAX_RANK]; + hssize_t mem_offset[H5S_MAX_RANK]; int i; FUNC_ENTER(H5S_all_read, FAIL); @@ -558,6 +563,18 @@ H5S_all_read(H5F_t *f, const H5O_layout_t *layout, const H5O_pline_t *pline, if (H5S_SIMPLE!=file_space->extent.type) goto fall_through; if (mem_space->extent.u.simple.rank!= file_space->extent.u.simple.rank) goto fall_through; + if (mem_space->select.type==H5S_SEL_HYPERSLABS) { + if(mem_space->select.sel_info.hslab.hyper_lst->count>1) goto fall_through; + mem_node=mem_space->select.sel_info.hslab.hyper_lst->head; + } /* end if */ + else + if(mem_space->select.type!=H5S_SEL_ALL) goto fall_through; + if (file_space->select.type==H5S_SEL_HYPERSLABS) { + if(file_space->select.sel_info.hslab.hyper_lst->count>1) goto fall_through; + file_node=file_space->select.sel_info.hslab.hyper_lst->head; + } /* end if */ + else + if(file_space->select.type!=H5S_SEL_ALL) goto fall_through; /* Get information about memory and file */ for (i=0; i<mem_space->extent.u.simple.rank; i++) { @@ -567,19 +584,34 @@ H5S_all_read(H5F_t *f, const H5O_layout_t *layout, const H5O_pline_t *pline, if (file_space->extent.u.simple.max && file_space->extent.u.simple.size[i]!= file_space->extent.u.simple.max[i]) goto fall_through; - if (mem_space->extent.u.simple.size[i]!= - file_space->extent.u.simple.size[i]) goto fall_through; - size[i] = mem_space->extent.u.simple.size[i]; - offset[i] = 0; + if(mem_space->select.type==H5S_SEL_HYPERSLABS) { + mem_size=(mem_node->end[i]-mem_node->start[i])+1; + } /* end if */ + else { + mem_size=mem_space->extent.u.simple.size[i]; + } /* end else */ + if(file_space->select.type==H5S_SEL_HYPERSLABS) { + file_size=(file_node->end[i]-file_node->start[i])+1; + file_off=file_node->start[i]; + } /* end if */ + else { + file_size=file_space->extent.u.simple.size[i]; + file_off=0; + } /* end else */ + if (mem_size!=file_size) goto fall_through; + size[i] = file_size; + file_offset[i] = file_off; + mem_offset[i] = 0; } size[i] = elmt_size; - offset[i] = 0; + file_offset[i] = 0; + mem_offset[i] = 0; /* Read data from the file */ if (H5F_arr_read(f, xfer_parms, layout, pline, NULL, efl, size, - size, offset, offset, buf/*out*/)<0) { + size, mem_offset, file_offset, buf/*out*/)<0) { HRETURN_ERROR(H5E_IO, H5E_INTERNAL, FAIL, - "unable to write data to the file"); + "unable to read data from the file"); } *must_convert = FALSE; @@ -604,6 +636,7 @@ H5S_all_read(H5F_t *f, const H5O_layout_t *layout, const H5O_pline_t *pline, * Wednesday, April 21, 1999 * * Modifications: + * Modified to allow contiguous hyperslabs to be written out - QAK - 5/25/99 * *------------------------------------------------------------------------- */ @@ -614,8 +647,12 @@ H5S_all_write(H5F_t *f, const struct H5O_layout_t *layout, const H5S_t *mem_space, const H5F_xfer_t *xfer_parms, const void *buf, hbool_t *must_convert/*out*/) { + H5S_hyper_node_t *file_node,*mem_node; /* Hyperslab node */ + hsize_t mem_size,file_size; + hssize_t file_off; hsize_t size[H5S_MAX_RANK]; - hssize_t offset[H5S_MAX_RANK]; + hssize_t file_offset[H5S_MAX_RANK]; + hssize_t mem_offset[H5S_MAX_RANK]; int i; FUNC_ENTER(H5S_all_write, FAIL); @@ -626,6 +663,18 @@ H5S_all_write(H5F_t *f, const struct H5O_layout_t *layout, if (H5S_SIMPLE!=file_space->extent.type) goto fall_through; if (mem_space->extent.u.simple.rank!= file_space->extent.u.simple.rank) goto fall_through; + if (mem_space->select.type==H5S_SEL_HYPERSLABS) { + if(mem_space->select.sel_info.hslab.hyper_lst->count>1) goto fall_through; + mem_node=mem_space->select.sel_info.hslab.hyper_lst->head; + } /* end if */ + else + if(mem_space->select.type!=H5S_SEL_ALL) goto fall_through; + if (file_space->select.type==H5S_SEL_HYPERSLABS) { + if(file_space->select.sel_info.hslab.hyper_lst->count>1) goto fall_through; + file_node=file_space->select.sel_info.hslab.hyper_lst->head; + } /* end if */ + else + if(file_space->select.type!=H5S_SEL_ALL) goto fall_through; /* Get information about memory and file */ for (i=0; i<mem_space->extent.u.simple.rank; i++) { @@ -635,17 +684,32 @@ H5S_all_write(H5F_t *f, const struct H5O_layout_t *layout, if (file_space->extent.u.simple.max && file_space->extent.u.simple.size[i]!= file_space->extent.u.simple.max[i]) goto fall_through; - if (mem_space->extent.u.simple.size[i]!= - file_space->extent.u.simple.size[i]) goto fall_through; - size[i] = mem_space->extent.u.simple.size[i]; - offset[i] = 0; + if(mem_space->select.type==H5S_SEL_HYPERSLABS) { + mem_size=(mem_node->end[i]-mem_node->start[i])+1; + } /* end if */ + else { + mem_size=mem_space->extent.u.simple.size[i]; + } /* end else */ + if(file_space->select.type==H5S_SEL_HYPERSLABS) { + file_size=(file_node->end[i]-file_node->start[i])+1; + file_off=file_node->start[i]; + } /* end if */ + else { + file_size=file_space->extent.u.simple.size[i]; + file_off=0; + } /* end else */ + if (mem_size!=file_size) goto fall_through; + size[i] = file_size; + file_offset[i] = file_off; + mem_offset[i] = 0; } size[i] = elmt_size; - offset[i] = 0; + file_offset[i] = 0; + mem_offset[i] = 0; /* Write data to the file */ if (H5F_arr_write(f, xfer_parms, layout, pline, NULL, efl, size, - size, offset, offset, buf)<0) { + size, mem_offset, file_offset, buf)<0) { HRETURN_ERROR(H5E_IO, H5E_INTERNAL, FAIL, "unable to write data to the file"); } |