summaryrefslogtreecommitdiffstats
path: root/src/H5CX.c
diff options
context:
space:
mode:
authorNeil Fortner <fortnern@gmail.com>2023-04-28 23:58:25 (GMT)
committerGitHub <noreply@github.com>2023-04-28 23:58:25 (GMT)
commit3236fb79cedcbe8fed2f421db1ae15f630b5b90f (patch)
treeb4751d6d020d057f4a43f3c89186418cdd1ac0cf /src/H5CX.c
parent4497feb5756d76479fb36fef999692c0909f8340 (diff)
downloadhdf5-3236fb79cedcbe8fed2f421db1ae15f630b5b90f.zip
hdf5-3236fb79cedcbe8fed2f421db1ae15f630b5b90f.tar.gz
hdf5-3236fb79cedcbe8fed2f421db1ae15f630b5b90f.tar.bz2
Implement selection I/O with type conversion (#2823)
Initial implementation of selection I/O with type conversion. Allows Parallel collective I/O with type conversion, as long as selection I/O is enabled.
Diffstat (limited to 'src/H5CX.c')
-rw-r--r--src/H5CX.c224
1 files changed, 190 insertions, 34 deletions
diff --git a/src/H5CX.c b/src/H5CX.c
index 95e824d..e5595b7 100644
--- a/src/H5CX.c
+++ b/src/H5CX.c
@@ -94,14 +94,12 @@
H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) \
} /* end if */
-#ifdef H5_HAVE_PARALLEL
/* Macro for the duplicated code to retrieve possibly set properties from a property list */
#define H5CX_RETRIEVE_PROP_VALID_SET(PL, DEF_PL, PROP_NAME, PROP_FIELD) \
/* Check if the value has been retrieved already */ \
if (!((*head)->ctx.H5_GLUE(PROP_FIELD, _valid) || (*head)->ctx.H5_GLUE(PROP_FIELD, _set))) { \
H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) \
- } /* end if */
-#endif /* H5_HAVE_PARALLEL */
+ } /* end if */
#if defined(H5_HAVE_PARALLEL) && defined(H5_HAVE_INSTRUMENTED_LIBRARY)
/* Macro for the duplicated code to test and set properties for a property list */
@@ -127,7 +125,6 @@
}
#endif /* defined(H5_HAVE_PARALLEL) && defined(H5_HAVE_INSTRUMENTED_LIBRARY) */
-#ifdef H5_HAVE_PARALLEL
/* Macro for the duplicated code to test and set properties for a property list */
#define H5CX_SET_PROP(PROP_NAME, PROP_FIELD) \
if ((*head)->ctx.H5_GLUE(PROP_FIELD, _set)) { \
@@ -137,8 +134,7 @@
/* Set the property */ \
if (H5P_set((*head)->ctx.dxpl, PROP_NAME, &(*head)->ctx.PROP_FIELD) < 0) \
HGOTO_ERROR(H5E_CONTEXT, H5E_CANTSET, NULL, "error setting data xfer property") \
- } /* end if */
-#endif /* H5_HAVE_PARALLEL */
+ } /* end if */
/******************/
/* Local Typedefs */
@@ -242,16 +238,20 @@ typedef struct H5CX_t {
unsigned mpio_chunk_opt_ratio; /* Collective chunk ratio (H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME) */
hbool_t mpio_chunk_opt_ratio_valid; /* Whether collective chunk ratio is valid */
#endif /* H5_HAVE_PARALLEL */
- H5Z_EDC_t err_detect; /* Error detection info (H5D_XFER_EDC_NAME) */
- hbool_t err_detect_valid; /* Whether error detection info is valid */
- H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */
- hbool_t filter_cb_valid; /* Whether filter callback function is valid */
- H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */
- hbool_t data_transform_valid; /* Whether data transform info is valid */
- H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */
- hbool_t vl_alloc_info_valid; /* Whether VL datatype alloc info is valid */
- H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */
- hbool_t dt_conv_cb_valid; /* Whether datatype conversion struct is valid */
+ H5Z_EDC_t err_detect; /* Error detection info (H5D_XFER_EDC_NAME) */
+ hbool_t err_detect_valid; /* Whether error detection info is valid */
+ H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */
+ hbool_t filter_cb_valid; /* Whether filter callback function is valid */
+ H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */
+ hbool_t data_transform_valid; /* Whether data transform info is valid */
+ H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */
+ hbool_t vl_alloc_info_valid; /* Whether VL datatype alloc info is valid */
+ H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */
+ hbool_t dt_conv_cb_valid; /* Whether datatype conversion struct is valid */
+ H5D_selection_io_mode_t selection_io_mode; /* Selection I/O mode (H5D_XFER_SELECTION_IO_MODE_NAME) */
+ hbool_t selection_io_mode_valid; /* Whether selection I/O mode is valid */
+ hbool_t modify_write_buf; /* Whether the library can modify write buffers */
+ hbool_t modify_write_buf_valid; /* Whether the modify_write_buf field is valid */
/* Return-only DXPL properties to return to application */
#ifdef H5_HAVE_PARALLEL
@@ -297,9 +297,13 @@ typedef struct H5CX_t {
hbool_t mpio_coll_rank0_bcast; /* Instrumented "collective chunk multi ratio ind" value
(H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME) */
hbool_t
- mpio_coll_rank0_bcast_set; /* Whether instrumented "collective chunk multi ratio ind" value is set */
-#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */
-#endif /* H5_HAVE_PARALLEL */
+ mpio_coll_rank0_bcast_set; /* Whether instrumented "collective chunk multi ratio ind" value is set */
+#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */
+#endif /* H5_HAVE_PARALLEL */
+ uint32_t no_selection_io_cause; /* Reason for not performing selection I/O
+ (H5D_XFER_NO_SELECTION_IO_CAUSE_NAME) */
+ hbool_t no_selection_io_cause_set; /* Whether reason for not performing selection I/O is set */
+ hbool_t no_selection_io_cause_valid; /* Whether reason for not performing selection I/O is valid */
/* Cached LCPL properties */
H5T_cset_t encoding; /* Link name character encoding */
@@ -370,15 +374,19 @@ typedef struct H5CX_dxpl_cache_t {
uint32_t mpio_global_no_coll_cause; /* Global reason for breaking collective I/O
(H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME) */
H5FD_mpio_chunk_opt_t
- mpio_chunk_opt_mode; /* Collective chunk option (H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME) */
- unsigned mpio_chunk_opt_num; /* Collective chunk threshold (H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME) */
- unsigned mpio_chunk_opt_ratio; /* Collective chunk ratio (H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME) */
-#endif /* H5_HAVE_PARALLEL */
- H5Z_EDC_t err_detect; /* Error detection info (H5D_XFER_EDC_NAME) */
- H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */
- H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */
- H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */
- H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */
+ mpio_chunk_opt_mode; /* Collective chunk option (H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME) */
+ unsigned mpio_chunk_opt_num; /* Collective chunk threshold (H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME) */
+ unsigned mpio_chunk_opt_ratio; /* Collective chunk ratio (H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME) */
+#endif /* H5_HAVE_PARALLEL */
+ H5Z_EDC_t err_detect; /* Error detection info (H5D_XFER_EDC_NAME) */
+ H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */
+ H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */
+ H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */
+ H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */
+ H5D_selection_io_mode_t selection_io_mode; /* Selection I/O mode (H5D_XFER_SELECTION_IO_MODE_NAME) */
+ uint32_t no_selection_io_cause; /* Reasons for not performing selection I/O
+ (H5D_XFER_NO_SELECTION_IO_CAUSE_NAME) */
+ hbool_t modify_write_buf; /* Whether the library can modify write buffers */
} H5CX_dxpl_cache_t;
/* Typedef for cached default link creation property list information */
@@ -566,6 +574,19 @@ H5CX_init(void)
if (H5P_get(dx_plist, H5D_XFER_CONV_CB_NAME, &H5CX_def_dxpl_cache.dt_conv_cb) < 0)
HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve datatype conversion exception callback")
+ /* Get the selection I/O mode */
+ if (H5P_get(dx_plist, H5D_XFER_SELECTION_IO_MODE_NAME, &H5CX_def_dxpl_cache.selection_io_mode) < 0)
+ HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve parallel transfer method")
+
+ /* Get the local & global reasons for breaking selection I/O values */
+ if (H5P_get(dx_plist, H5D_XFER_NO_SELECTION_IO_CAUSE_NAME, &H5CX_def_dxpl_cache.no_selection_io_cause) <
+ 0)
+ HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve cause for no selection I/O")
+
+ /* Get the modify write buffer property */
+ if (H5P_get(dx_plist, H5D_XFER_MODIFY_WRITE_BUF_NAME, &H5CX_def_dxpl_cache.modify_write_buf) < 0)
+ HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve modify write buffer property")
+
/* Reset the "default LCPL cache" information */
HDmemset(&H5CX_def_lcpl_cache, 0, sizeof(H5CX_lcpl_cache_t));
@@ -2564,6 +2585,111 @@ done:
} /* end H5CX_get_dt_conv_cb() */
/*-------------------------------------------------------------------------
+ * Function: H5CX_get_selection_io_mode
+ *
+ * Purpose: Retrieves the selection I/O mode for the current API call context.
+ *
+ * Return: Non-negative on success / Negative on failure
+ *
+ * Programmer: Vailin Choi
+ * March 5, 2023
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CX_get_selection_io_mode(H5D_selection_io_mode_t *selection_io_mode)
+{
+ H5CX_node_t **head = NULL; /* Pointer to head of API context list */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ /* Sanity check */
+ HDassert(selection_io_mode);
+ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
+ HDassert(head && *head);
+ HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
+
+ H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_SELECTION_IO_MODE_NAME,
+ selection_io_mode)
+
+ /* Get the value */
+ *selection_io_mode = (*head)->ctx.selection_io_mode;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5CX_get_selection_io_mode() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5CX_get_no_selection_io_cause
+ *
+ * Purpose: Retrieves the cause for not performing selection I/O
+ * for the current API call context.
+ *
+ * Return: Non-negative on success / Negative on failure
+ *
+ * Programmer: Vailin Choi
+ * April 15, 2023
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CX_get_no_selection_io_cause(uint32_t *no_selection_io_cause)
+{
+ H5CX_node_t **head = NULL; /* Pointer to head of API context list */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ /* Sanity check */
+ HDassert(no_selection_io_cause);
+ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
+ HDassert(head && *head);
+ HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
+
+ H5CX_RETRIEVE_PROP_VALID_SET(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_NO_SELECTION_IO_CAUSE_NAME,
+ no_selection_io_cause)
+
+ /* Get the value */
+ *no_selection_io_cause = (*head)->ctx.no_selection_io_cause;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5CX_get_no_selection_io_cause() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5CX_get_modify_write_buf
+ *
+ * Purpose: Retrieves the modify write buffer property for the current API call context.
+ *
+ * Return: Non-negative on success / Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5CX_get_modify_write_buf(hbool_t *modify_write_buf)
+{
+ H5CX_node_t **head = NULL; /* Pointer to head of API context list */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ /* Sanity check */
+ HDassert(modify_write_buf);
+ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
+ HDassert(head && *head);
+ HDassert(H5P_DEFAULT != (*head)->ctx.dxpl_id);
+
+ H5CX_RETRIEVE_PROP_VALID(dxpl, H5P_DATASET_XFER_DEFAULT, H5D_XFER_MODIFY_WRITE_BUF_NAME, modify_write_buf)
+
+ /* Get the value */
+ *modify_write_buf = (*head)->ctx.modify_write_buf;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5CX_get_selection_io_mode() */
+
+/*-------------------------------------------------------------------------
* Function: H5CX_get_encoding
*
* Purpose: Retrieves the character encoding for the current API call context.
@@ -3544,6 +3670,41 @@ done:
#endif /* H5_HAVE_PARALLEL */
/*-------------------------------------------------------------------------
+ * Function: H5CX_set_no_selecction_io_cause
+ *
+ * Purpose: Sets the reason for not performing selection I/O for
+ * the current API call context.
+ *
+ * Return: <none>
+ *
+ * Programmer: Vailin Choi
+ * April 15, 2023
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5CX_set_no_selection_io_cause(uint32_t no_selection_io_cause)
+{
+ H5CX_node_t **head = NULL; /* Pointer to head of API context list */
+
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* Sanity checks */
+ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
+ HDassert(head && *head);
+ HDassert((*head)->ctx.dxpl_id != H5P_DEFAULT);
+
+ /* If we're using the default DXPL, don't modify it */
+ if ((*head)->ctx.dxpl_id != H5P_DATASET_XFER_DEFAULT) {
+ /* Cache the value for later, marking it to set in DXPL when context popped */
+ (*head)->ctx.no_selection_io_cause = no_selection_io_cause;
+ (*head)->ctx.no_selection_io_cause_set = TRUE;
+ } /* end if */
+
+ FUNC_LEAVE_NOAPI_VOID
+} /* end H5CX_set_no_selectiion_io_cause() */
+
+/*-------------------------------------------------------------------------
* Function: H5CX_get_ohdr_flags
*
* Purpose: Retrieves the object header flags for the current API call context.
@@ -3596,11 +3757,7 @@ H5CX__pop_common(hbool_t update_dxpl_props)
H5CX_node_t **head = NULL; /* Pointer to head of API context list */
H5CX_node_t *ret_value = NULL; /* Return value */
-#ifdef H5_HAVE_PARALLEL
FUNC_ENTER_PACKAGE
-#else
- FUNC_ENTER_PACKAGE_NOERR
-#endif
/* Sanity check */
head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
@@ -3608,6 +3765,7 @@ H5CX__pop_common(hbool_t update_dxpl_props)
/* Check for cached DXPL properties to return to application */
if (update_dxpl_props) {
+ H5CX_SET_PROP(H5D_XFER_NO_SELECTION_IO_CAUSE_NAME, no_selection_io_cause)
#ifdef H5_HAVE_PARALLEL
H5CX_SET_PROP(H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, mpio_actual_chunk_opt)
H5CX_SET_PROP(H5D_MPIO_ACTUAL_IO_MODE_NAME, mpio_actual_io_mode)
@@ -3629,9 +3787,7 @@ H5CX__pop_common(hbool_t update_dxpl_props)
ret_value = (*head);
(*head) = (*head)->next;
-#ifdef H5_HAVE_PARALLEL
done:
-#endif /* H5_HAVE_PARALLEL */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5CX__pop_common() */