Retrieve MPI-IO hints used by MPI library after file open (#1636)

H5Pget_fapl_mpio() should return an MPI info object containing all the
MPI-IO hints used by the MPI library underneath, after the file is
opened. Some hints, such as cb_nodes (number of I/O aggregators), are
useful for HDF5 applications and I/O libraries built on top of HDF5.
This commit is contained in:
Wei-keng Liao 2022-04-15 10:24:46 -05:00 committed by GitHub
parent b793e5005c
commit aaa6614c48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -839,6 +839,7 @@ H5FD__mpio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t H5_ATTR
H5P_genplist_t *plist; /* Property list pointer */
MPI_Comm comm = MPI_COMM_NULL; /* MPI Communicator, from plist */
MPI_Info info = MPI_INFO_NULL; /* MPI Info, from plist */
MPI_Info info_used; /* MPI Info returned from MPI_File_open */
MPI_File fh; /* MPI file handle */
hbool_t file_opened = FALSE; /* Flag to indicate that the file was successfully opened */
int mpi_amode; /* MPI file access flags */
@ -906,6 +907,54 @@ H5FD__mpio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t H5_ATTR
HMPI_GOTO_ERROR(NULL, "MPI_File_open failed", mpi_code)
file_opened = TRUE;
/* Get the MPI-IO hints that actually used by MPI-IO underneath. */
if (MPI_SUCCESS != (mpi_code = MPI_File_get_info(fh, &info_used)))
HMPI_GOTO_ERROR(NULL, "MPI_File_get_info failed", mpi_code)
/* Copy hints in info_used into info. Note hints in info_used supersede
* info. There may be some hints set and used by HDF5 only, but not
* recognizable by MPI-IO. We need to keep them, as MPI_File_get_info()
* will remove any hints unrecognized by MPI-IO library underneath.
*/
if (info_used != MPI_INFO_NULL) {
int i, nkeys;
if (info == MPI_INFO_NULL) /* reuse info created from MPI_File_get_info() */
info = info_used;
else {
/* retrieve the number of hints */
if (MPI_SUCCESS != (mpi_code = MPI_Info_get_nkeys(info_used, &nkeys)))
HMPI_GOTO_ERROR(NULL, "MPI_Info_get_nkeys failed", mpi_code)
/* copy over each hint */
for (i = 0; i < nkeys; i++) {
char key[MPI_MAX_INFO_KEY], value[MPI_MAX_INFO_VAL];
int valuelen, flag;
/* retrieve the nth hint */
if (MPI_SUCCESS != (mpi_code = MPI_Info_get_nthkey(info_used, i, key)))
HMPI_GOTO_ERROR(NULL, "MPI_Info_get_nkeys failed", mpi_code)
/* retrieve the key of nth hint */
if (MPI_SUCCESS != (mpi_code = MPI_Info_get_valuelen(info_used, key, &valuelen, &flag)))
HMPI_GOTO_ERROR(NULL, "MPI_Info_get_valuelen failed", mpi_code)
/* retrieve the value of nth hint */
if (MPI_SUCCESS != (mpi_code = MPI_Info_get(info_used, key, valuelen + 1, value, &flag)))
HMPI_GOTO_ERROR(NULL, "MPI_Info_get failed", mpi_code)
/* copy the hint into info */
if (MPI_SUCCESS != (mpi_code = MPI_Info_set(info, key, value)))
HMPI_GOTO_ERROR(NULL, "MPI_Info_set failed", mpi_code)
}
/* Free info_used allocated in the call to MPI_File_get_info() */
if (MPI_SUCCESS != (mpi_code = MPI_Info_free(&info_used)))
HMPI_GOTO_ERROR(NULL, "MPI_Info_free failed", mpi_code)
}
/* Add info to the file access property list */
if (H5P_set(plist, H5F_ACS_MPI_PARAMS_INFO_NAME, &info) < 0)
HGOTO_ERROR(H5E_VFL, H5E_CANTSET, NULL, "can't set MPI info object")
}
/* Build the return value and initialize it */
if (NULL == (file = (H5FD_mpio_t *)H5MM_calloc(sizeof(H5FD_mpio_t))))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")