mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-03-01 16:28:09 +08:00
Implement support for big I/O for independent reads (#1446)
* Implement big I/O support for independent reads. Add test for this. * Committing clang-format changes * Update big I/O code in H5FD__mpio_write() to match that in H5FD__mpio_read(). Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
parent
cfe4198b6c
commit
feda52b084
@ -1172,6 +1172,7 @@ H5FD__mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
|||||||
int n;
|
int n;
|
||||||
#endif
|
#endif
|
||||||
hbool_t use_view_this_time = FALSE;
|
hbool_t use_view_this_time = FALSE;
|
||||||
|
hbool_t derived_type = FALSE;
|
||||||
hbool_t rank0_bcast = FALSE; /* If read-with-rank0-and-bcast flag was used */
|
hbool_t rank0_bcast = FALSE; /* If read-with-rank0-and-bcast flag was used */
|
||||||
#ifdef H5FDmpio_DEBUG
|
#ifdef H5FDmpio_DEBUG
|
||||||
hbool_t H5FD_mpio_debug_t_flag = (H5FD_mpio_debug_flags_s[(int)'t'] && H5FD_MPIO_TRACE_THIS_RANK(file));
|
hbool_t H5FD_mpio_debug_t_flag = (H5FD_mpio_debug_flags_s[(int)'t'] && H5FD_MPIO_TRACE_THIS_RANK(file));
|
||||||
@ -1199,8 +1200,6 @@ H5FD__mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
|||||||
if (H5FD_mpi_haddr_to_MPIOff(addr, &mpi_off /*out*/) < 0)
|
if (H5FD_mpi_haddr_to_MPIOff(addr, &mpi_off /*out*/) < 0)
|
||||||
HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
|
HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
|
||||||
size_i = (int)size;
|
size_i = (int)size;
|
||||||
if ((hsize_t)size_i != size)
|
|
||||||
HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from size to size_i")
|
|
||||||
|
|
||||||
/* Only look for MPI views for raw data transfers */
|
/* Only look for MPI views for raw data transfers */
|
||||||
if (type == H5FD_MEM_DRAW) {
|
if (type == H5FD_MEM_DRAW) {
|
||||||
@ -1304,6 +1303,21 @@ H5FD__mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
|||||||
HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
|
HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
|
||||||
} /* end if */
|
} /* end if */
|
||||||
else {
|
else {
|
||||||
|
if (size != (hsize_t)size_i) {
|
||||||
|
/* If HERE, then we need to work around the integer size limit
|
||||||
|
* of 2GB. The input size_t size variable cannot fit into an integer,
|
||||||
|
* but we can get around that limitation by creating a different datatype
|
||||||
|
* and then setting the integer size (or element count) to 1 when using
|
||||||
|
* the derived_type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (H5_mpio_create_large_type(size, 0, MPI_BYTE, &buf_type) < 0)
|
||||||
|
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "can't create MPI-I/O datatype")
|
||||||
|
|
||||||
|
derived_type = TRUE;
|
||||||
|
size_i = 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef H5FDmpio_DEBUG
|
#ifdef H5FDmpio_DEBUG
|
||||||
if (H5FD_mpio_debug_r_flag)
|
if (H5FD_mpio_debug_r_flag)
|
||||||
HDfprintf(stderr, "%s: (%d) doing MPI independent IO\n", __func__, file->mpi_rank);
|
HDfprintf(stderr, "%s: (%d) doing MPI independent IO\n", __func__, file->mpi_rank);
|
||||||
@ -1377,6 +1391,9 @@ H5FD__mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
|||||||
HDmemset((char *)buf + bytes_read, 0, (size_t)n);
|
HDmemset((char *)buf + bytes_read, 0, (size_t)n);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
if (derived_type)
|
||||||
|
MPI_Type_free(&buf_type);
|
||||||
|
|
||||||
#ifdef H5FDmpio_DEBUG
|
#ifdef H5FDmpio_DEBUG
|
||||||
if (H5FD_mpio_debug_t_flag)
|
if (H5FD_mpio_debug_t_flag)
|
||||||
HDfprintf(stderr, "%s: (%d) Leaving\n", __func__, file->mpi_rank);
|
HDfprintf(stderr, "%s: (%d) Leaving\n", __func__, file->mpi_rank);
|
||||||
@ -1489,20 +1506,6 @@ H5FD__mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, h
|
|||||||
*/
|
*/
|
||||||
mpi_off = 0;
|
mpi_off = 0;
|
||||||
} /* end if */
|
} /* end if */
|
||||||
else if (size != (hsize_t)size_i) {
|
|
||||||
/* If HERE, then we need to work around the integer size limit
|
|
||||||
* of 2GB. The input size_t size variable cannot fit into an integer,
|
|
||||||
* but we can get around that limitation by creating a different datatype
|
|
||||||
* and then setting the integer size (or element count) to 1 when using
|
|
||||||
* the derived_type.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (H5_mpio_create_large_type(size, 0, MPI_BYTE, &buf_type) < 0)
|
|
||||||
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "can't create MPI-I/O datatype")
|
|
||||||
|
|
||||||
derived_type = TRUE;
|
|
||||||
size_i = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write the data. */
|
/* Write the data. */
|
||||||
if (use_view_this_time) {
|
if (use_view_this_time) {
|
||||||
@ -1548,6 +1551,21 @@ H5FD__mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, h
|
|||||||
HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
|
HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
|
||||||
} /* end if */
|
} /* end if */
|
||||||
else {
|
else {
|
||||||
|
if (size != (hsize_t)size_i) {
|
||||||
|
/* If HERE, then we need to work around the integer size limit
|
||||||
|
* of 2GB. The input size_t size variable cannot fit into an integer,
|
||||||
|
* but we can get around that limitation by creating a different datatype
|
||||||
|
* and then setting the integer size (or element count) to 1 when using
|
||||||
|
* the derived_type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (H5_mpio_create_large_type(size, 0, MPI_BYTE, &buf_type) < 0)
|
||||||
|
HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "can't create MPI-I/O datatype")
|
||||||
|
|
||||||
|
derived_type = TRUE;
|
||||||
|
size_i = 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef H5FDmpio_DEBUG
|
#ifdef H5FDmpio_DEBUG
|
||||||
if (H5FD_mpio_debug_w_flag)
|
if (H5FD_mpio_debug_w_flag)
|
||||||
HDfprintf(stderr, "%s: (%d) doing MPI independent IO\n", __func__, file->mpi_rank);
|
HDfprintf(stderr, "%s: (%d) doing MPI independent IO\n", __func__, file->mpi_rank);
|
||||||
|
@ -1107,13 +1107,15 @@ single_rank_independent_io(void)
|
|||||||
HDprintf("\nSingle Rank Independent I/O\n");
|
HDprintf("\nSingle Rank Independent I/O\n");
|
||||||
|
|
||||||
if (MAIN_PROCESS) {
|
if (MAIN_PROCESS) {
|
||||||
hsize_t dims[] = {LARGE_DIM};
|
hsize_t dims[] = {LARGE_DIM};
|
||||||
hid_t file_id = -1;
|
hid_t file_id = -1;
|
||||||
hid_t fapl_id = -1;
|
hid_t fapl_id = -1;
|
||||||
hid_t dset_id = -1;
|
hid_t dset_id = -1;
|
||||||
hid_t fspace_id = -1;
|
hid_t fspace_id = -1;
|
||||||
hid_t mspace_id = -1;
|
hid_t mspace_id = -1;
|
||||||
void * data = NULL;
|
herr_t ret;
|
||||||
|
int * data = NULL;
|
||||||
|
uint64_t i;
|
||||||
|
|
||||||
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
|
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
|
||||||
VRFY_G((fapl_id >= 0), "H5P_FILE_ACCESS");
|
VRFY_G((fapl_id >= 0), "H5P_FILE_ACCESS");
|
||||||
@ -1135,6 +1137,10 @@ single_rank_independent_io(void)
|
|||||||
|
|
||||||
data = malloc(LARGE_DIM * sizeof(int));
|
data = malloc(LARGE_DIM * sizeof(int));
|
||||||
|
|
||||||
|
/* Initialize data */
|
||||||
|
for (i = 0; i < LARGE_DIM; i++)
|
||||||
|
data[i] = (int)(i % (uint64_t)DXFER_BIGCOUNT);
|
||||||
|
|
||||||
if (mpi_rank_g == 0)
|
if (mpi_rank_g == 0)
|
||||||
H5Sselect_all(fspace_id);
|
H5Sselect_all(fspace_id);
|
||||||
else
|
else
|
||||||
@ -1143,7 +1149,24 @@ single_rank_independent_io(void)
|
|||||||
dims[0] = LARGE_DIM;
|
dims[0] = LARGE_DIM;
|
||||||
mspace_id = H5Screate_simple(1, dims, NULL);
|
mspace_id = H5Screate_simple(1, dims, NULL);
|
||||||
VRFY_G((mspace_id >= 0), "H5Screate_simple mspace_id succeeded");
|
VRFY_G((mspace_id >= 0), "H5Screate_simple mspace_id succeeded");
|
||||||
|
|
||||||
|
/* Write data */
|
||||||
H5Dwrite(dset_id, H5T_NATIVE_INT, mspace_id, fspace_id, H5P_DEFAULT, data);
|
H5Dwrite(dset_id, H5T_NATIVE_INT, mspace_id, fspace_id, H5P_DEFAULT, data);
|
||||||
|
VRFY_G((ret >= 0), "H5Dwrite succeeded");
|
||||||
|
|
||||||
|
/* Wipe buffer */
|
||||||
|
HDmemset(data, 0, LARGE_DIM * sizeof(int));
|
||||||
|
|
||||||
|
/* Read data back */
|
||||||
|
H5Dread(dset_id, H5T_NATIVE_INT, mspace_id, fspace_id, H5P_DEFAULT, data);
|
||||||
|
VRFY_G((ret >= 0), "H5Dread succeeded");
|
||||||
|
|
||||||
|
/* Verify data */
|
||||||
|
for (i = 0; i < LARGE_DIM; i++)
|
||||||
|
if (data[i] != (int)(i % (uint64_t)DXFER_BIGCOUNT)) {
|
||||||
|
HDfprintf(stderr, "verify failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
free(data);
|
free(data);
|
||||||
H5Sclose(mspace_id);
|
H5Sclose(mspace_id);
|
||||||
|
Loading…
Reference in New Issue
Block a user