summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNeil Fortner <fortnern@gmail.com>2023-08-15 13:12:41 (GMT)
committerGitHub <noreply@github.com>2023-08-15 13:12:41 (GMT)
commite5e86912f610a9fe0ee51951f5622f8d5a7af6b1 (patch)
tree31ef4738c93bd833e9724ed6e65b8bf74a733109 /src
parentba2193a270781a84526977ac4c8f151461ebd793 (diff)
downloadhdf5-e5e86912f610a9fe0ee51951f5622f8d5a7af6b1.zip
hdf5-e5e86912f610a9fe0ee51951f5622f8d5a7af6b1.tar.gz
hdf5-e5e86912f610a9fe0ee51951f5622f8d5a7af6b1.tar.bz2
Fix possible performance regression introduced with in-place type conversion in 1.14.2 (#3376)
Diffstat (limited to 'src')
-rw-r--r--src/H5Dscatgath.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/H5Dscatgath.c b/src/H5Dscatgath.c
index cf6b4fd..4516f1f 100644
--- a/src/H5Dscatgath.c
+++ b/src/H5Dscatgath.c
@@ -478,6 +478,16 @@ H5D__scatgath_read(const H5D_io_info_t *io_info, const H5D_dset_io_info_t *dset_
in_place_tconv = dset_info->layout_io_info.contig_piece_info &&
dset_info->layout_io_info.contig_piece_info->in_place_tconv;
+ /* Check if we should disable in-place type conversion for performance. Do so if we can use the optimized
+ * compound read function, if this is not a selection I/O operation (so we have normal size conversion
+ * buffers), and the either entire I/O operation can fit in the type conversion buffer or we need to use a
+ * background buffer (and therefore could not do the I/O in one operation with in-place conversion
+ * anyways). */
+ if (in_place_tconv && H5D__SCATGATH_USE_CMPD_OPT_READ(dset_info, FALSE) &&
+ (io_info->use_select_io != H5D_SELECTION_IO_MODE_ON) &&
+ (dset_info->type_info.need_bkg || (dset_info->nelmts <= dset_info->type_info.request_nelmts)))
+ in_place_tconv = FALSE;
+
/* Allocate the iterators */
if (NULL == (mem_iter = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate memory iterator");
@@ -653,6 +663,16 @@ H5D__scatgath_write(const H5D_io_info_t *io_info, const H5D_dset_io_info_t *dset
in_place_tconv = dset_info->layout_io_info.contig_piece_info &&
dset_info->layout_io_info.contig_piece_info->in_place_tconv;
+ /* Check if we should disable in-place type conversion for performance. Do so if we can use the optimized
+ * compound write function, if this is not a selection I/O operation (so we have normal size conversion
+ * buffers), and the either entire I/O operation can fit in the type conversion buffer or we need to use a
+ * background buffer (and therefore could not do the I/O in one operation with in-place conversion
+ * anyways). */
+ if (in_place_tconv && H5D__SCATGATH_USE_CMPD_OPT_WRITE(dset_info, FALSE) &&
+ (io_info->use_select_io != H5D_SELECTION_IO_MODE_ON) &&
+ (dset_info->type_info.need_bkg || (dset_info->nelmts <= dset_info->type_info.request_nelmts)))
+ in_place_tconv = FALSE;
+
/* Allocate the iterators */
if (NULL == (mem_iter = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate memory iterator");