Cloned library HDF5-1.14.1 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8150 lines
286 KiB

2 years ago
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* XXX: Better documentation for each test about how the selections get
* split up among MPI ranks.
*/
#include "H5_api_dataset_test_parallel.h"
static int test_write_dataset_data_verification(void);
static int test_write_dataset_independent(void);
static int test_write_dataset_one_proc_0_selection(void);
static int test_write_dataset_one_proc_none_selection(void);
static int test_write_dataset_one_proc_all_selection(void);
static int test_write_dataset_hyper_file_all_mem(void);
static int test_write_dataset_all_file_hyper_mem(void);
static int test_write_dataset_point_file_all_mem(void);
static int test_write_dataset_all_file_point_mem(void);
static int test_write_dataset_hyper_file_point_mem(void);
static int test_write_dataset_point_file_hyper_mem(void);
static int test_read_dataset_one_proc_0_selection(void);
static int test_read_dataset_one_proc_none_selection(void);
static int test_read_dataset_one_proc_all_selection(void);
static int test_read_dataset_hyper_file_all_mem(void);
static int test_read_dataset_all_file_hyper_mem(void);
static int test_read_dataset_point_file_all_mem(void);
static int test_read_dataset_all_file_point_mem(void);
static int test_read_dataset_hyper_file_point_mem(void);
static int test_read_dataset_point_file_hyper_mem(void);
/*
* Chunking tests
*/
static int test_write_multi_chunk_dataset_same_shape_read(void);
static int test_write_multi_chunk_dataset_diff_shape_read(void);
static int test_overwrite_multi_chunk_dataset_same_shape_read(void);
static int test_overwrite_multi_chunk_dataset_diff_shape_read(void);
/*
* The array of parallel dataset tests to be performed.
*/
static int (*par_dataset_tests[])(void) = {
test_write_dataset_data_verification,
test_write_dataset_independent,
test_write_dataset_one_proc_0_selection,
test_write_dataset_one_proc_none_selection,
test_write_dataset_one_proc_all_selection,
test_write_dataset_hyper_file_all_mem,
test_write_dataset_all_file_hyper_mem,
test_write_dataset_point_file_all_mem,
test_write_dataset_all_file_point_mem,
test_write_dataset_hyper_file_point_mem,
test_write_dataset_point_file_hyper_mem,
test_read_dataset_one_proc_0_selection,
test_read_dataset_one_proc_none_selection,
test_read_dataset_one_proc_all_selection,
test_read_dataset_hyper_file_all_mem,
test_read_dataset_all_file_hyper_mem,
test_read_dataset_point_file_all_mem,
test_read_dataset_all_file_point_mem,
test_read_dataset_hyper_file_point_mem,
test_read_dataset_point_file_hyper_mem,
test_write_multi_chunk_dataset_same_shape_read,
test_write_multi_chunk_dataset_diff_shape_read,
test_overwrite_multi_chunk_dataset_same_shape_read,
test_overwrite_multi_chunk_dataset_diff_shape_read,
};
/*
* A test to ensure that data is read back correctly from
* a dataset after it has been written in parallel. The test
* covers simple examples of using H5S_ALL selections,
* hyperslab selections and point selections.
*/
#define DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK 3
#define DATASET_WRITE_DATA_VERIFY_TEST_NUM_POINTS 10
#define DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME "dataset_write_data_verification_test"
#define DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1 "dataset_write_data_verification_all"
#define DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2 "dataset_write_data_verification_hyperslab"
#define DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3 "dataset_write_data_verification_points"
static int
test_write_dataset_data_verification(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK];
hsize_t stride[DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK];
hsize_t count[DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK];
hsize_t block[DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK];
hsize_t *points = NULL;
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING_MULTIPART("verification of dataset data using H5Dwrite then H5Dread");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
TESTING_2("test setup");
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1,
DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1);
goto error;
}
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2,
DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2);
goto error;
}
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3,
DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3);
goto error;
}
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
PASSED();
BEGIN_MULTIPART
{
PART_BEGIN(H5Dwrite_all_read)
{
hbool_t op_failed = FALSE;
TESTING_2("H5Dwrite using H5S_ALL then H5Dread");
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1);
PART_ERROR(H5Dwrite_all_read);
}
/*
* Write data to dataset on rank 0 only. All ranks will read the data back.
*/
if (MAINPROCESS) {
for (i = 0, data_size = 1; i < DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE;
if (NULL != (write_buf = HDmalloc(data_size))) {
for (i = 0; i < data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = (int)i;
if (H5Dwrite(dset_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL,
H5P_DEFAULT, write_buf) < 0)
op_failed = TRUE;
}
else
op_failed = TRUE;
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
}
if (MPI_SUCCESS !=
MPI_Allreduce(MPI_IN_PLACE, &op_failed, 1, MPI_C_BOOL, MPI_LAND, MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" couldn't determine if dataset write on rank 0 succeeded\n");
PART_ERROR(H5Dwrite_all_read);
}
if (op_failed == TRUE) {
H5_FAILED();
HDprintf(" dataset write on rank 0 failed!\n");
PART_ERROR(H5Dwrite_all_read);
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
PART_ERROR(H5Dwrite_all_read);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
PART_ERROR(H5Dwrite_all_read);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
PART_ERROR(H5Dwrite_all_read);
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
PART_ERROR(H5Dwrite_all_read);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
PART_ERROR(H5Dwrite_all_read);
}
if ((group_id =
H5Gopen2(container_group, DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME);
PART_ERROR(H5Dwrite_all_read);
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1);
PART_ERROR(H5Dwrite_all_read);
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
PART_ERROR(H5Dwrite_all_read);
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
PART_ERROR(H5Dwrite_all_read);
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
PART_ERROR(H5Dwrite_all_read);
}
if (H5Dread(dset_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME1);
PART_ERROR(H5Dwrite_all_read);
}
for (i = 0; i < (hsize_t)space_npoints; i++)
if (((int *)read_buf)[i] != (int)i) {
H5_FAILED();
HDprintf(" H5S_ALL selection data verification failed\n");
PART_ERROR(H5Dwrite_all_read);
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
PASSED();
}
PART_END(H5Dwrite_all_read);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
PART_BEGIN(H5Dwrite_hyperslab_read)
{
TESTING_2("H5Dwrite using hyperslab selection then H5Dread");
for (i = 1, data_size = 1; i < DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
for (i = 0; i < data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = mpi_rank;
/* Each MPI rank writes to a single row in the second dimension
* and the entirety of the following dimensions. The combined
* selections from all MPI ranks spans the first dimension.
*/
for (i = 0; i < DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2);
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
{
hsize_t mdims[] = {data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
}
if (H5Dwrite(dset_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2);
PART_ERROR(H5Dwrite_hyperslab_read);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((group_id =
H5Gopen2(container_group, DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME);
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2);
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
if (H5Dread(dset_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME2);
PART_ERROR(H5Dwrite_hyperslab_read);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE; j++) {
if (((int *)
read_buf)[j + (i * (data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" hyperslab selection data verification failed\n");
PART_ERROR(H5Dwrite_hyperslab_read);
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
PASSED();
}
PART_END(H5Dwrite_hyperslab_read);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
PART_BEGIN(H5Dwrite_point_sel_read)
{
TESTING_2("H5Dwrite using point selection then H5Dread");
for (i = 1, data_size = 1; i < DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
/* Use different data than the previous test to ensure that the data actually changed. */
for (i = 0; i < data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = mpi_size - mpi_rank;
if (NULL == (points = HDmalloc(DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK *
(data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE) *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
/* Each MPI rank writes to a single row in the second dimension
* and the entirety of the following dimensions. The combined
* selections from all MPI ranks spans the first dimension.
*/
for (i = 0; i < data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE; i++) {
size_t j;
for (j = 0; j < DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK; j++) {
size_t idx = (i * DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK) + j;
if (j == 0)
points[idx] = (hsize_t)mpi_rank;
else if (j != DATASET_WRITE_DATA_VERIFY_TEST_SPACE_RANK - 1)
points[idx] = i / dims[j + 1];
else
points[idx] = i % dims[j];
}
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3);
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if (H5Sselect_elements(fspace_id, H5S_SELECT_SET,
data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE, points) < 0) {
H5_FAILED();
HDprintf(" couldn't select elements in dataspace\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
{
hsize_t mdims[] = {data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
}
if (H5Dwrite(dset_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3);
PART_ERROR(H5Dwrite_point_sel_read);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((group_id =
H5Gopen2(container_group, DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_DATA_VERIFY_TEST_GROUP_NAME);
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3);
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
if (H5Dread(dset_id, DATASET_WRITE_DATA_VERIFY_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_DATA_VERIFY_TEST_DSET_NAME3);
PART_ERROR(H5Dwrite_point_sel_read);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE; j++) {
if (((int *)
read_buf)[j + (i * (data_size / DATASET_WRITE_DATA_VERIFY_TEST_DTYPE_SIZE))] !=
(mpi_size - (int)i)) {
H5_FAILED();
HDprintf(" point selection data verification failed\n");
PART_ERROR(H5Dwrite_point_sel_read);
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
PASSED();
}
PART_END(H5Dwrite_point_sel_read);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
}
END_MULTIPART;
TESTING_2("test cleanup");
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that independent dataset writes function
* as expected. First, two datasets are created in the file.
* Then, the even MPI ranks first write to dataset 1, followed
* by dataset 2. The odd MPI ranks first write to dataset 2,
* followed by dataset 1. After this, the data is read back from
* each dataset and verified.
*/
#define DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK 3
#define DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_INDEPENDENT_WRITE_TEST_GROUP_NAME "independent_dataset_write_test"
#define DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME1 "dset1"
#define DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME2 "dset2"
static int
test_write_dataset_independent(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK];
hsize_t stride[DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK];
hsize_t count[DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK];
hsize_t block[DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK];
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id1 = H5I_INVALID_HID, dset_id2 = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("independent writing to different datasets by different ranks");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_INDEPENDENT_WRITE_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n", DATASET_INDEPENDENT_WRITE_TEST_GROUP_NAME);
goto error;
}
/*
* Setup dimensions of overall datasets and slabs local
* to the MPI rank.
*/
if (generate_random_parallel_dimensions(DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
/* create a dataset collectively */
if ((dset_id1 = H5Dcreate2(group_id, DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME1,
DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" failed to create first dataset\n");
goto error;
}
if ((dset_id2 = H5Dcreate2(group_id, DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME2,
DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" failed to create second dataset\n");
goto error;
}
for (i = 1, data_size = 1; i < DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
goto error;
}
for (i = 0; i < data_size / DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = mpi_rank;
for (i = 0; i < DATASET_INDEPENDENT_WRITE_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
goto error;
}
{
hsize_t mdims[] = {data_size / DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
/*
* To test the independent orders of writes between processes, all
* even number processes write to dataset1 first, then dataset2.
* All odd number processes write to dataset2 first, then dataset1.
*/
BEGIN_INDEPENDENT_OP(dset_write)
{
if (mpi_rank % 2 == 0) {
if (H5Dwrite(dset_id1, DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" even ranks failed to write to dataset 1\n");
INDEPENDENT_OP_ERROR(dset_write);
}
if (H5Dwrite(dset_id2, DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" even ranks failed to write to dataset 2\n");
INDEPENDENT_OP_ERROR(dset_write);
}
}
else {
if (H5Dwrite(dset_id2, DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" odd ranks failed to write to dataset 2\n");
INDEPENDENT_OP_ERROR(dset_write);
}
if (H5Dwrite(dset_id1, DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" odd ranks failed to write to dataset 1\n");
INDEPENDENT_OP_ERROR(dset_write);
}
}
}
END_INDEPENDENT_OP(dset_write);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
H5Sclose(mspace_id);
mspace_id = H5I_INVALID_HID;
H5Sclose(fspace_id);
fspace_id = H5I_INVALID_HID;
H5Dclose(dset_id1);
dset_id1 = H5I_INVALID_HID;
H5Dclose(dset_id2);
dset_id2 = H5I_INVALID_HID;
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_INDEPENDENT_WRITE_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n", DATASET_INDEPENDENT_WRITE_TEST_GROUP_NAME);
goto error;
}
if ((dset_id1 = H5Dopen2(group_id, DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME1, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME1);
goto error;
}
if ((dset_id2 = H5Dopen2(group_id, DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME2, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME2);
goto error;
}
/*
* Verify that data has been written correctly.
*/
if ((fspace_id = H5Dget_space(dset_id1)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL == (read_buf = HDmalloc((hsize_t)space_npoints * DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id1, DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME1);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE; j++) {
if (((int *)read_buf)[j + (i * (data_size / DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" dataset 1 data verification failed\n");
goto error;
}
}
}
if (H5Dread(dset_id2, DATASET_INDEPENDENT_WRITE_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_INDEPENDENT_WRITE_TEST_DSET_NAME2);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE; j++) {
if (((int *)read_buf)[j + (i * (data_size / DATASET_INDEPENDENT_WRITE_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" dataset 2 data verification failed\n");
goto error;
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id1) < 0)
TEST_ERROR;
if (H5Dclose(dset_id2) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id1);
H5Dclose(dset_id2);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* one of the MPI ranks select 0 rows in a hyperslab selection.
*/
#define DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK 2
#define DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_ONE_PROC_0_SEL_TEST_GROUP_NAME "one_rank_0_sel_write_test"
#define DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME "one_rank_0_sel_dset"
static int
test_write_dataset_one_proc_0_selection(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK];
hsize_t stride[DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK];
hsize_t count[DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK];
hsize_t block[DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK];
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with one rank selecting 0 rows");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_ONE_PROC_0_SEL_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_ONE_PROC_0_SEL_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME,
DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME);
goto error;
}
for (i = 1, data_size = 1; i < DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE;
BEGIN_INDEPENDENT_OP(write_buf_alloc)
{
if (!MAINPROCESS) {
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(write_buf_alloc);
}
for (i = 0; i < data_size / DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = mpi_rank;
}
}
END_INDEPENDENT_OP(write_buf_alloc);
for (i = 0; i < DATASET_WRITE_ONE_PROC_0_SEL_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = MAINPROCESS ? 0 : 1;
}
else {
start[i] = 0;
block[i] = MAINPROCESS ? 0 : dims[i];
}
stride[i] = 1;
count[i] = MAINPROCESS ? 0 : 1;
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
goto error;
}
{
hsize_t mdims[] = {data_size / DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE};
if (MAINPROCESS)
mdims[0] = 0;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
BEGIN_INDEPENDENT_OP(dset_write)
{
if (H5Dwrite(dset_id, DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_DTYPE, mspace_id, fspace_id, H5P_DEFAULT,
write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
END_INDEPENDENT_OP(dset_write);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_WRITE_ONE_PROC_0_SEL_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_ONE_PROC_0_SEL_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_ONE_PROC_0_SEL_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
if (i != 0) {
for (j = 0; j < data_size / DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE; j++) {
if (((int *)read_buf)[j + (i * (data_size / DATASET_WRITE_ONE_PROC_0_SEL_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* one of the MPI ranks call H5Sselect_none.
*/
#define DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK 2
#define DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_GROUP_NAME "one_rank_none_sel_write_test"
#define DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME "one_rank_none_sel_dset"
static int
test_write_dataset_one_proc_none_selection(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
hsize_t stride[DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
hsize_t count[DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
hsize_t block[DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with one rank using 'none' selection");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME,
DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
goto error;
}
for (i = 1, data_size = 1; i < DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE;
BEGIN_INDEPENDENT_OP(write_buf_alloc)
{
if (!MAINPROCESS) {
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(write_buf_alloc);
}
for (i = 0; i < data_size / DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = mpi_rank;
}
}
END_INDEPENDENT_OP(write_buf_alloc);
for (i = 0; i < DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
BEGIN_INDEPENDENT_OP(set_space_sel)
{
if (MAINPROCESS) {
if (H5Sselect_none(fspace_id) < 0) {
H5_FAILED();
HDprintf(" couldn't set 'none' selection for dataset write\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
else {
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
}
END_INDEPENDENT_OP(set_space_sel);
{
hsize_t mdims[] = {data_size / DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE};
if (MAINPROCESS)
mdims[0] = 0;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
BEGIN_INDEPENDENT_OP(dset_write)
{
if (H5Dwrite(dset_id, DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
END_INDEPENDENT_OP(dset_write);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
if (i != 0) {
for (j = 0; j < data_size / DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE; j++) {
if (((int *)
read_buf)[j + (i * (data_size / DATASET_WRITE_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* one of the MPI ranks use an ALL selection, while the other
* ranks write nothing.
*/
#define DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_SPACE_RANK 2
#define DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_GROUP_NAME "one_rank_all_sel_write_test"
#define DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME "one_rank_all_sel_dset"
static int
test_write_dataset_one_proc_all_selection(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with one rank using all selection; others none selection");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME,
DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
goto error;
}
for (i = 0, data_size = 1; i < DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE;
BEGIN_INDEPENDENT_OP(write_buf_alloc)
{
if (MAINPROCESS) {
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(write_buf_alloc);
}
for (i = 0; i < data_size / DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = (int)i;
}
}
END_INDEPENDENT_OP(write_buf_alloc);
BEGIN_INDEPENDENT_OP(set_space_sel)
{
if (MAINPROCESS) {
if (H5Sselect_all(fspace_id) < 0) {
H5_FAILED();
HDprintf(" couldn't set 'all' selection for dataset write\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
else {
if (H5Sselect_none(fspace_id) < 0) {
H5_FAILED();
HDprintf(" couldn't set 'none' selection for dataset write\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
}
END_INDEPENDENT_OP(set_space_sel);
{
hsize_t mdims[] = {data_size / DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE};
if (!MAINPROCESS)
mdims[0] = 0;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
BEGIN_INDEPENDENT_OP(dset_write)
{
if (H5Dwrite(dset_id, DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
END_INDEPENDENT_OP(dset_write);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < data_size / DATASET_WRITE_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE; i++) {
if (((int *)read_buf)[i] != (int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* a hyperslab selection in the file dataspace and an all selection
* in the memory dataspace.
*
* XXX: Currently pulls from invalid memory locations.
*/
#define DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK 2
#define DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_GROUP_NAME "hyper_sel_file_all_sel_mem_write_test"
#define DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME "hyper_sel_file_all_sel_mem_dset"
static int
test_write_dataset_hyper_file_all_mem(void)
{
#ifdef BROKEN
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK];
hsize_t stride[DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK];
hsize_t count[DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK];
hsize_t block[DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK];
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
#endif
TESTING("write to dataset with hyperslab sel. for file space; all sel. for memory");
#ifdef BROKEN
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME,
DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 1, data_size = 1; i < DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
goto error;
}
for (i = 0; i < data_size / DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DTYPE_SIZE; i++)
((int *)write_buf)[i] = mpi_rank;
for (i = 0; i < DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
goto error;
}
if (H5Dwrite(dset_id, DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_DTYPE, H5S_ALL, fspace_id, H5P_DEFAULT,
write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME);
goto error;
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id =
H5Gopen2(container_group, DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DTYPE_SIZE; j++) {
if (((int *)read_buf)[j + (i * (data_size / DATASET_WRITE_HYPER_FILE_ALL_MEM_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
#else
SKIPPED();
#endif
return 0;
#ifdef BROKEN
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
#endif
}
/*
* A test to ensure that a dataset can be written to by having
* an all selection in the file dataspace and a hyperslab
* selection in the memory dataspace.
*/
#define DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK 2
#define DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME "all_sel_file_hyper_sel_mem_write_test"
#define DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME "all_sel_file_hyper_sel_mem_dset"
static int
test_write_dataset_all_file_hyper_mem(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with all sel. for file space; hyperslab sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME,
DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0, data_size = 1; i < DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE;
BEGIN_INDEPENDENT_OP(write_buf_alloc)
{
if (MAINPROCESS) {
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from hyperslab selection <-> all
* selection works correctly.
*/
if (NULL == (write_buf = HDmalloc(2 * data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(write_buf_alloc);
}
for (i = 0; i < 2 * (data_size / DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE); i++) {
/* Write actual data to even indices */
if (i % 2 == 0)
((int *)write_buf)[i] = (int)((i / 2) + (i % 2));
else
((int *)write_buf)[i] = 0;
}
}
}
END_INDEPENDENT_OP(write_buf_alloc);
/*
* Only have rank 0 perform the dataset write, as writing the entire dataset on all ranks
* might be stressful on system resources. There's also no guarantee as to what the outcome
* would be, since the writes would be overlapping with each other.
*/
BEGIN_INDEPENDENT_OP(dset_write)
{
if (MAINPROCESS) {
hsize_t start[1] = {0};
hsize_t stride[1] = {2};
hsize_t count[1] = {data_size / DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE};
hsize_t block[1] = {1};
hsize_t mdims[] = {2 * (data_size / DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE)};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_write);
}
if (H5Sselect_hyperslab(mspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
INDEPENDENT_OP_ERROR(dset_write);
}
if (H5Dwrite(dset_id, DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
}
END_INDEPENDENT_OP(dset_write);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id =
H5Gopen2(container_group, DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < data_size / DATASET_WRITE_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE; i++) {
if (((int *)read_buf)[i] != (int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* a point selection in the file dataspace and an all selection
* in the memory dataspace.
*/
static int
test_write_dataset_point_file_all_mem(void)
{
TESTING("write to dataset with point sel. for file space; all sel. for memory");
SKIPPED();
return 0;
}
/*
* A test to ensure that a dataset can be written to by having
* an all selection in the file dataspace and a point selection
* in the memory dataspace.
*/
#define DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_SPACE_RANK 2
#define DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_GROUP_NAME "all_sel_file_point_sel_mem_write_test"
#define DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME "all_sel_file_point_sel_mem_dset"
static int
test_write_dataset_all_file_point_mem(void)
{
hssize_t space_npoints;
hsize_t *points = NULL;
hsize_t *dims = NULL;
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with all sel. for file space; point sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_GROUP_NAME, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME,
DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0, data_size = 1; i < DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE;
BEGIN_INDEPENDENT_OP(write_buf_alloc)
{
if (MAINPROCESS) {
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from point selection <-> all
* selection works correctly.
*/
if (NULL == (write_buf = HDmalloc(2 * data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(write_buf_alloc);
}
for (i = 0; i < 2 * (data_size / DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE); i++) {
/* Write actual data to even indices */
if (i % 2 == 0)
((int *)write_buf)[i] = (int)((i / 2) + (i % 2));
else
((int *)write_buf)[i] = 0;
}
}
}
END_INDEPENDENT_OP(write_buf_alloc);
/*
* Only have rank 0 perform the dataset write, as writing the entire dataset on all ranks
* might be stressful on system resources. There's also no guarantee as to what the outcome
* would be, since the writes would be overlapping with each other.
*/
BEGIN_INDEPENDENT_OP(dset_write)
{
if (MAINPROCESS) {
hsize_t mdims[] = {2 * (data_size / DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE)};
int j;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_write);
}
if (NULL == (points = HDmalloc((data_size / DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE) *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
INDEPENDENT_OP_ERROR(dset_write);
}
/* Select every other point in the 1-dimensional memory dataspace */
for (i = 0, j = 0; i < 2 * (data_size / DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE); i++) {
if (i % 2 == 0)
points[j++] = (hsize_t)i;
}
if (H5Sselect_elements(mspace_id, H5S_SELECT_SET,
data_size / DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE,
points) < 0) {
H5_FAILED();
HDprintf(" couldn't set point selection for dataset write\n");
INDEPENDENT_OP_ERROR(dset_write);
}
if (H5Dwrite(dset_id, DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
}
END_INDEPENDENT_OP(dset_write);
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id =
H5Gopen2(container_group, DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < data_size / DATASET_WRITE_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE; i++) {
if (((int *)read_buf)[i] != (int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* a hyperslab selection in the file dataspace and a point
* selection in the memory dataspace.
*/
#define DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK 2
#define DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME "hyper_sel_file_point_sel_mem_write_test"
#define DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME "hyper_sel_file_point_sel_mem_dset"
static int
test_write_dataset_hyper_file_point_mem(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t *points = NULL;
hsize_t start[DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
hsize_t stride[DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
hsize_t count[DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
hsize_t block[DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with hyperslab sel. for file space; point sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME,
DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 1, data_size = 1; i < DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE;
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from point selection <-> hyperslab
* selection works correctly.
*/
if (NULL == (write_buf = HDmalloc(2 * data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
goto error;
}
for (i = 0; i < 2 * (data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE); i++) {
/* Write actual data to even indices */
if (i % 2 == 0)
((int *)write_buf)[i] = mpi_rank;
else
((int *)write_buf)[i] = 0;
}
for (i = 0; i < DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset write\n");
goto error;
}
{
hsize_t mdims[] = {2 * (data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE)};
int j;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
if (NULL == (points = HDmalloc((data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE) *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
goto error;
}
/* Select every other point in the 1-dimensional memory dataspace */
for (i = 0, j = 0; i < 2 * (data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE); i++) {
if (i % 2 == 0)
points[j++] = (hsize_t)i;
}
if (H5Sselect_elements(mspace_id, H5S_SELECT_SET,
data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE, points) < 0) {
H5_FAILED();
HDprintf(" couldn't set point selection for dataset write\n");
goto error;
}
}
if (H5Dwrite(dset_id, DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE; j++) {
if (((int *)
read_buf)[j + (i * (data_size / DATASET_WRITE_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be written to by having
* a point selection in the file dataspace and a hyperslab
* selection in the memory dataspace.
*/
#define DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK 2
#define DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME "point_sel_file_hyper_sel_mem_write_test"
#define DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME "point_sel_file_hyper_sel_mem_dset"
static int
test_write_dataset_point_file_hyper_mem(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t *points = NULL;
size_t i, data_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("write to dataset with point sel. for file space; hyperslab sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gcreate2(container_group, DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME);
goto error;
}
if (generate_random_parallel_dimensions(DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
if ((fspace_id = H5Screate_simple(DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK, dims, NULL)) < 0)
TEST_ERROR;
if ((dset_id = H5Dcreate2(group_id, DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME,
DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 1, data_size = 1; i < DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE;
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from hyperslab selection <-> point
* selection works correctly.
*/
if (NULL == (write_buf = HDmalloc(2 * data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
goto error;
}
for (i = 0; i < 2 * (data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE); i++) {
/* Write actual data to even indices */
if (i % 2 == 0)
((int *)write_buf)[i] = mpi_rank;
else
((int *)write_buf)[i] = 0;
}
if (NULL == (points = HDmalloc((data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE) *
DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK * sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
goto error;
}
for (i = 0; i < data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE; i++) {
size_t j;
for (j = 0; j < DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK; j++) {
size_t idx = (i * (size_t)DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK) + j;
if (j == 0)
points[idx] = (hsize_t)mpi_rank;
else if (j != (size_t)DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK - 1)
points[idx] = i / dims[j + 1];
else
points[idx] = i % dims[j];
}
}
if (H5Sselect_elements(fspace_id, H5S_SELECT_SET,
data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE, points) < 0) {
H5_FAILED();
HDprintf(" couldn't set point selection for dataset write\n");
goto error;
}
{
hsize_t start[1] = {0};
hsize_t stride[1] = {2};
hsize_t count[1] = {data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE};
hsize_t block[1] = {1};
hsize_t mdims[] = {2 * (data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE)};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
if (H5Sselect_hyperslab(mspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't set hyperslab selection for dataset write\n");
goto error;
}
}
if (H5Dwrite(dset_id, DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
goto error;
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
goto error;
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
goto error;
}
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
if (NULL ==
(read_buf = HDmalloc((hsize_t)space_npoints * DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (H5Dread(dset_id, DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
for (j = 0; j < data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE; j++) {
if (((int *)
read_buf)[j + (i * (data_size / DATASET_WRITE_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE))] !=
(int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* one of the MPI ranks select 0 rows in a hyperslab selection.
*/
#define DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK 2
#define DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_ONE_PROC_0_SEL_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_ONE_PROC_0_SEL_TEST_GROUP_NAME "one_rank_0_sel_read_test"
#define DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME "one_rank_0_sel_dset"
static int
test_read_dataset_one_proc_0_selection(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK];
hsize_t stride[DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK];
hsize_t count[DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK];
hsize_t block[DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK];
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with one rank selecting 0 rows");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_ONE_PROC_0_SEL_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_ONE_PROC_0_SEL_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK, dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME,
DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_ONE_PROC_0_SEL_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc = (data_size / DATASET_READ_ONE_PROC_0_SEL_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_ONE_PROC_0_SEL_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n", DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_READ_ONE_PROC_0_SEL_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n", DATASET_READ_ONE_PROC_0_SEL_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
BEGIN_INDEPENDENT_OP(read_buf_alloc)
{
if (!MAINPROCESS) {
read_buf_size =
((size_t)(space_npoints / mpi_size) * DATASET_READ_ONE_PROC_0_SEL_TEST_DTYPE_SIZE);
if (NULL == (read_buf = HDmalloc(read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
INDEPENDENT_OP_ERROR(read_buf_alloc);
}
}
}
END_INDEPENDENT_OP(read_buf_alloc);
{
hsize_t mdims[] = {(hsize_t)space_npoints / (hsize_t)mpi_size};
if (MAINPROCESS)
mdims[0] = 0;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
for (i = 0; i < DATASET_READ_ONE_PROC_0_SEL_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = MAINPROCESS ? 0 : 1;
}
else {
start[i] = 0;
block[i] = MAINPROCESS ? 0 : dims[i];
}
stride[i] = 1;
count[i] = MAINPROCESS ? 0 : 1;
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset read\n");
goto error;
}
BEGIN_INDEPENDENT_OP(dset_read)
{
if (H5Dread(dset_id, DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_DTYPE, mspace_id, fspace_id, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_READ_ONE_PROC_0_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_read);
}
}
END_INDEPENDENT_OP(dset_read);
BEGIN_INDEPENDENT_OP(data_verify)
{
if (!MAINPROCESS) {
for (i = 0; i < (size_t)space_npoints / (size_t)mpi_size; i++) {
if (((int *)read_buf)[i] != mpi_rank) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(data_verify);
}
}
}
}
END_INDEPENDENT_OP(data_verify);
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* one of the MPI ranks call H5Sselect_none.
*/
#define DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK 2
#define DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_ONE_PROC_NONE_SEL_TEST_GROUP_NAME "one_rank_none_sel_read_test"
#define DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME "one_rank_none_sel_dset"
static int
test_read_dataset_one_proc_none_selection(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t start[DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
hsize_t stride[DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
hsize_t count[DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
hsize_t block[DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK];
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with one rank using 'none' selection");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_ONE_PROC_NONE_SEL_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_ONE_PROC_NONE_SEL_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK, dims, NULL)) <
0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME,
DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc = (data_size / DATASET_READ_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_READ_ONE_PROC_NONE_SEL_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_READ_ONE_PROC_NONE_SEL_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
BEGIN_INDEPENDENT_OP(read_buf_alloc)
{
if (!MAINPROCESS) {
read_buf_size =
((size_t)(space_npoints / mpi_size) * DATASET_READ_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE);
if (NULL == (read_buf = HDmalloc(read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
INDEPENDENT_OP_ERROR(read_buf_alloc);
}
}
}
END_INDEPENDENT_OP(read_buf_alloc);
{
hsize_t mdims[] = {(hsize_t)space_npoints / (hsize_t)mpi_size};
if (MAINPROCESS)
mdims[0] = 0;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
for (i = 0; i < DATASET_READ_ONE_PROC_NONE_SEL_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
BEGIN_INDEPENDENT_OP(set_space_sel)
{
if (MAINPROCESS) {
if (H5Sselect_none(fspace_id) < 0) {
H5_FAILED();
HDprintf(" couldn't set 'none' selection for dataset read\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
else {
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset read\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
}
END_INDEPENDENT_OP(set_space_sel);
BEGIN_INDEPENDENT_OP(dset_read)
{
if (H5Dread(dset_id, DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_READ_ONE_PROC_NONE_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_read);
}
}
END_INDEPENDENT_OP(dset_read);
BEGIN_INDEPENDENT_OP(data_verify)
{
if (!MAINPROCESS) {
for (i = 0; i < (size_t)space_npoints / (size_t)mpi_size; i++) {
if (((int *)read_buf)[i] != mpi_rank) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(data_verify);
}
}
}
}
END_INDEPENDENT_OP(data_verify);
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* one of the MPI ranks use an ALL selection, while the other
* ranks read nothing.
*/
#define DATASET_READ_ONE_PROC_ALL_SEL_TEST_SPACE_RANK 2
#define DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_ONE_PROC_ALL_SEL_TEST_GROUP_NAME "one_rank_all_sel_read_test"
#define DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME "one_rank_all_sel_dset"
static int
test_read_dataset_one_proc_all_selection(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with one rank using all selection; others none selection");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_ONE_PROC_ALL_SEL_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_ONE_PROC_ALL_SEL_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_ONE_PROC_ALL_SEL_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_READ_ONE_PROC_ALL_SEL_TEST_SPACE_RANK, dims, NULL)) <
0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME,
DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n", DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_ONE_PROC_ALL_SEL_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc = (data_size / DATASET_READ_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_READ_ONE_PROC_ALL_SEL_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_READ_ONE_PROC_ALL_SEL_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
BEGIN_INDEPENDENT_OP(read_buf_alloc)
{
if (MAINPROCESS) {
read_buf_size = (size_t)space_npoints * DATASET_READ_ONE_PROC_ALL_SEL_TEST_DTYPE_SIZE;
if (NULL == (read_buf = HDmalloc(read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
INDEPENDENT_OP_ERROR(read_buf_alloc);
}
}
}
END_INDEPENDENT_OP(read_buf_alloc);
{
hsize_t mdims[] = {(hsize_t)space_npoints};
if (!MAINPROCESS)
mdims[0] = 0;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
}
BEGIN_INDEPENDENT_OP(set_space_sel)
{
if (MAINPROCESS) {
if (H5Sselect_all(fspace_id) < 0) {
H5_FAILED();
HDprintf(" couldn't set 'all' selection for dataset read\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
else {
if (H5Sselect_none(fspace_id) < 0) {
H5_FAILED();
HDprintf(" couldn't set 'none' selection for dataset read\n");
INDEPENDENT_OP_ERROR(set_space_sel);
}
}
}
END_INDEPENDENT_OP(set_space_sel);
BEGIN_INDEPENDENT_OP(dset_read)
{
if (H5Dread(dset_id, DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_DTYPE, mspace_id, fspace_id, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_READ_ONE_PROC_ALL_SEL_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_read);
}
}
END_INDEPENDENT_OP(dset_read);
BEGIN_INDEPENDENT_OP(data_verify)
{
if (MAINPROCESS) {
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc = (size_t)(space_npoints / mpi_size);
for (j = 0; j < elem_per_proc; j++) {
int idx = (int)((i * elem_per_proc) + j);
if (((int *)read_buf)[idx] != (int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(data_verify);
}
}
}
}
}
END_INDEPENDENT_OP(data_verify);
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* a hyperslab selection in the file dataspace and an all
* selection in the memory dataspace.
*/
static int
test_read_dataset_hyper_file_all_mem(void)
{
TESTING("read from dataset with hyperslab sel. for file space; all sel. for memory");
SKIPPED();
return 0;
}
/*
* A test to ensure that a dataset can be read from by having
* an all selection in the file dataspace and a hyperslab
* selection in the memory dataspace.
*/
#define DATASET_READ_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK 2
#define DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME "all_sel_file_hyper_sel_mem_read_test"
#define DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME "all_sel_file_hyper_sel_mem_dset"
static int
test_read_dataset_all_file_hyper_mem(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with all sel. for file space; hyperslab sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_READ_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK, dims, NULL)) <
0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME,
DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_ALL_FILE_HYPER_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc =
(data_size / DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_READ_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_READ_ALL_FILE_HYPER_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
/*
* Only have rank 0 perform the dataset read, as reading the entire dataset on all ranks
* might be stressful on system resources.
*/
BEGIN_INDEPENDENT_OP(dset_read)
{
if (MAINPROCESS) {
hsize_t start[1] = {0};
hsize_t stride[1] = {2};
hsize_t count[1] = {(hsize_t)space_npoints};
hsize_t block[1] = {1};
hsize_t mdims[] = {(hsize_t)(2 * space_npoints)};
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from all selection <-> hyperslab
* selection works correctly.
*/
read_buf_size = (size_t)(2 * space_npoints) * DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DTYPE_SIZE;
if (NULL == (read_buf = HDcalloc(1, read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
INDEPENDENT_OP_ERROR(dset_read);
}
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_read);
}
if (H5Sselect_hyperslab(mspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset read\n");
INDEPENDENT_OP_ERROR(dset_read);
}
if (H5Dread(dset_id, DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n",
DATASET_READ_ALL_FILE_HYPER_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_read);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc = (size_t)(space_npoints / mpi_size);
for (j = 0; j < 2 * elem_per_proc; j++) {
size_t idx = (i * 2 * elem_per_proc) + j;
if (j % 2 == 0) {
if (((int *)read_buf)[idx] != (int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(dset_read);
}
}
else {
if (((int *)read_buf)[idx] != 0) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(dset_read);
}
}
}
}
}
}
END_INDEPENDENT_OP(dset_read);
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* a point selection in the file dataspace and an all selection
* in the memory dataspace.
*/
static int
test_read_dataset_point_file_all_mem(void)
{
TESTING("read from dataset with point sel. for file space; all sel. for memory");
SKIPPED();
return 0;
}
/*
* A test to ensure that a dataset can be read from by having
* an all selection in the file dataspace and a point selection
* in the memory dataspace.
*/
#define DATASET_READ_ALL_FILE_POINT_MEM_TEST_SPACE_RANK 2
#define DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_ALL_FILE_POINT_MEM_TEST_GROUP_NAME "all_sel_file_point_sel_mem_read_test"
#define DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME "all_sel_file_point_sel_mem_dset"
static int
test_read_dataset_all_file_point_mem(void)
{
hssize_t space_npoints;
hsize_t *points = NULL;
hsize_t *dims = NULL;
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with all sel. for file space; point sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_ALL_FILE_POINT_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_ALL_FILE_POINT_MEM_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_ALL_FILE_POINT_MEM_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_READ_ALL_FILE_POINT_MEM_TEST_SPACE_RANK, dims, NULL)) <
0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME,
DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE, fspace_id, H5P_DEFAULT,
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_ALL_FILE_POINT_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc =
(data_size / DATASET_READ_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_READ_ALL_FILE_POINT_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) <
0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_READ_ALL_FILE_POINT_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
/*
* Only have rank 0 perform the dataset read, as reading the entire dataset on all ranks
* might be stressful on system resources.
*/
BEGIN_INDEPENDENT_OP(dset_read)
{
if (MAINPROCESS) {
hsize_t mdims[] = {(hsize_t)(2 * space_npoints)};
size_t j;
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from all selection <-> point
* selection works correctly.
*/
read_buf_size = (size_t)(2 * space_npoints) * DATASET_READ_ALL_FILE_POINT_MEM_TEST_DTYPE_SIZE;
if (NULL == (read_buf = HDcalloc(1, read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
INDEPENDENT_OP_ERROR(dset_read);
}
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_read);
}
if (NULL == (points = HDmalloc((size_t)space_npoints * sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
INDEPENDENT_OP_ERROR(dset_read);
}
/* Select every other point in the 1-dimensional memory dataspace */
for (i = 0, j = 0; i < 2 * (size_t)space_npoints; i++) {
if (i % 2 == 0)
points[j++] = (hsize_t)i;
}
if (H5Sselect_elements(mspace_id, H5S_SELECT_SET, (size_t)space_npoints, points) < 0) {
H5_FAILED();
HDprintf(" couldn't set point selection for dataset read\n");
INDEPENDENT_OP_ERROR(dset_read);
}
if (H5Dread(dset_id, DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n",
DATASET_READ_ALL_FILE_POINT_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_read);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t elem_per_proc = (size_t)(space_npoints / mpi_size);
for (j = 0; j < 2 * elem_per_proc; j++) {
size_t idx = (i * 2 * elem_per_proc) + j;
if (j % 2 == 0) {
if (((int *)read_buf)[idx] != (int)i) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(dset_read);
}
}
else {
if (((int *)read_buf)[idx] != 0) {
H5_FAILED();
HDprintf(" data verification failed\n");
INDEPENDENT_OP_ERROR(dset_read);
}
}
}
}
}
}
END_INDEPENDENT_OP(dset_read);
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* a hyperslab selection in the file dataspace and a point
* selection in the memory dataspace.
*/
#define DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK 2
#define DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME "hyper_sel_file_point_sel_mem_read_test"
#define DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME "hyper_sel_file_point_sel_mem_dset"
static int
test_read_dataset_hyper_file_point_mem(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t *points = NULL;
hsize_t start[DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
hsize_t stride[DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
hsize_t count[DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
hsize_t block[DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK];
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with hyperslab sel. for file space; point sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id =
H5Screate_simple(DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK, dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME,
DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE, fspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc =
(data_size / DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id =
H5Gopen2(container_group, DATASET_READ_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_READ_HYPER_FILE_POINT_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from hyperslab selection <-> point
* selection works correctly.
*/
read_buf_size = (2 * (size_t)(space_npoints / mpi_size) * DATASET_READ_ONE_PROC_NONE_SEL_TEST_DTYPE_SIZE);
if (NULL == (read_buf = HDcalloc(1, read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
for (i = 0; i < DATASET_READ_HYPER_FILE_POINT_MEM_TEST_SPACE_RANK; i++) {
if (i == 0) {
start[i] = (hsize_t)mpi_rank;
block[i] = 1;
}
else {
start[i] = 0;
block[i] = dims[i];
}
stride[i] = 1;
count[i] = 1;
}
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't select hyperslab for dataset read\n");
goto error;
}
{
hsize_t mdims[] = {(hsize_t)(2 * (space_npoints / mpi_size))};
size_t j;
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
if (NULL == (points = HDmalloc((size_t)(space_npoints / mpi_size) * sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
goto error;
}
/* Select every other point in the 1-dimensional memory dataspace */
for (i = 0, j = 0; i < (size_t)(2 * (space_npoints / mpi_size)); i++) {
if (i % 2 == 0)
points[j++] = (hsize_t)i;
}
if (H5Sselect_elements(mspace_id, H5S_SELECT_SET, (size_t)(space_npoints / mpi_size), points) < 0) {
H5_FAILED();
HDprintf(" couldn't set point selection for dataset read\n");
goto error;
}
}
if (H5Dread(dset_id, DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_DTYPE, mspace_id, fspace_id, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_READ_HYPER_FILE_POINT_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)(2 * (space_npoints / mpi_size)); i++) {
if (i % 2 == 0) {
if (((int *)read_buf)[i] != (int)mpi_rank) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
else {
if (((int *)read_buf)[i] != 0) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to ensure that a dataset can be read from by having
* a point selection in the file dataspace and a hyperslab
* selection in the memory dataspace.
*/
#define DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK 2
#define DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE sizeof(int)
#define DATASET_READ_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME "point_sel_file_hyper_sel_mem_read_test"
#define DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME "point_sel_file_hyper_sel_mem_dset"
static int
test_read_dataset_point_file_hyper_mem(void)
{
hssize_t space_npoints;
hsize_t *dims = NULL;
hsize_t *points = NULL;
size_t i, data_size, read_buf_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
void *read_buf = NULL;
TESTING("read from dataset with point sel. for file space; hyperslab sel. for memory");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) {
SKIPPED();
HDprintf(
" API functions for basic file, group, or dataset aren't supported with this connector\n");
return 0;
}
if (generate_random_parallel_dimensions(DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK, &dims) < 0)
TEST_ERROR;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group, DATASET_READ_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_READ_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id =
H5Screate_simple(DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK, dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME,
DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE, fspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0, data_size = 1; i < DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE;
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < (size_t)mpi_size; i++) {
size_t j;
size_t elem_per_proc =
(data_size / DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE) / dims[0];
for (j = 0; j < elem_per_proc; j++) {
size_t idx = (i * elem_per_proc) + j;
((int *)write_buf)[idx] = (int)i;
}
}
{
hsize_t mdims[] = {data_size / DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (H5Dwrite(dset_id, DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE, mspace_id, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (mspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(mspace_id);
}
H5E_END_TRY;
mspace_id = H5I_INVALID_HID;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id =
H5Gopen2(container_group, DATASET_READ_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_READ_POINT_FILE_HYPER_MEM_TEST_GROUP_NAME);
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n", DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
if ((space_npoints = H5Sget_simple_extent_npoints(fspace_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataspace num points\n");
goto error;
}
/*
* Allocate twice the amount of memory needed and leave "holes" in the memory
* buffer in order to prove that the mapping from point selection <-> hyperslab
* selection works correctly.
*/
read_buf_size =
(2 * (size_t)(space_npoints / mpi_size) * DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DTYPE_SIZE);
if (NULL == (read_buf = HDcalloc(1, read_buf_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset read\n");
goto error;
}
if (NULL == (points = HDmalloc((size_t)((space_npoints / mpi_size) *
DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK) *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for point selection\n");
goto error;
}
for (i = 0; i < (size_t)(space_npoints / mpi_size); i++) {
size_t j;
for (j = 0; j < DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK; j++) {
size_t idx = (i * DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK) + j;
if (j == 0)
points[idx] = (hsize_t)mpi_rank;
else if (j != DATASET_READ_POINT_FILE_HYPER_MEM_TEST_SPACE_RANK - 1)
points[idx] = i / dims[j + 1];
else
points[idx] = i % dims[j];
}
}
if (H5Sselect_elements(fspace_id, H5S_SELECT_SET, (size_t)(space_npoints / mpi_size), points) < 0) {
H5_FAILED();
HDprintf(" couldn't set point selection for dataset read\n");
goto error;
}
{
hsize_t start[1] = {0};
hsize_t stride[1] = {2};
hsize_t count[1] = {(hsize_t)(space_npoints / mpi_size)};
hsize_t block[1] = {1};
hsize_t mdims[] = {(hsize_t)(2 * (space_npoints / mpi_size))};
if ((mspace_id = H5Screate_simple(1, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" couldn't create memory dataspace\n");
goto error;
}
if (H5Sselect_hyperslab(mspace_id, H5S_SELECT_SET, start, stride, count, block) < 0) {
H5_FAILED();
HDprintf(" couldn't set hyperslab selection for dataset write\n");
goto error;
}
}
if (H5Dread(dset_id, DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_DTYPE, mspace_id, fspace_id, H5P_DEFAULT,
read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n", DATASET_READ_POINT_FILE_HYPER_MEM_TEST_DSET_NAME);
goto error;
}
for (i = 0; i < (size_t)(2 * (space_npoints / mpi_size)); i++) {
if (i % 2 == 0) {
if (((int *)read_buf)[i] != (int)mpi_rank) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
else {
if (((int *)read_buf)[i] != 0) {
H5_FAILED();
HDprintf(" data verification failed\n");
goto error;
}
}
}
if (read_buf) {
HDfree(read_buf);
read_buf = NULL;
}
if (points) {
HDfree(points);
points = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (read_buf)
HDfree(read_buf);
if (write_buf)
HDfree(write_buf);
if (points)
HDfree(points);
if (dims)
HDfree(dims);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to check that a dataset composed of multiple chunks
* can be written and read correctly. When reading back the
* chunks of the dataset, the file dataspace and memory dataspace
* used are the same shape. The dataset's first dimension grows
* with the number of MPI ranks, while the other dimensions are fixed.
*/
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE \
100 /* Should be an even divisor of fixed dimension size */
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_FIXED_DIMSIZE 1000
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK 2
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE sizeof(int)
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_GROUP_NAME \
"multi_chunk_dataset_write_same_space_read_test"
#define DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME "multi_chunk_dataset"
static int
test_write_multi_chunk_dataset_same_shape_read(void)
{
hsize_t *dims = NULL;
hsize_t *chunk_dims = NULL;
hsize_t retrieved_chunk_dims[DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t start[DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t count[DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
size_t i, data_size, chunk_size, n_chunks_per_rank;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t dcpl_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
int read_buf[1][DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE];
TESTING("write to dataset with multiple chunks using same shaped dataspaces");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_GET_PLIST)) {
SKIPPED();
HDprintf(" API functions for basic file, group, dataset, or getting property list aren't "
"supported with this connector\n");
return 0;
}
if (NULL ==
(dims = HDmalloc(DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK * sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
if (NULL == (chunk_dims = HDmalloc(DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
for (i = 0; i < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (i == 0) {
dims[i] = (hsize_t)mpi_size;
chunk_dims[i] = 1;
}
else {
dims[i] = DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_FIXED_DIMSIZE;
chunk_dims[i] = DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE;
}
}
for (i = 0, chunk_size = 1; i < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
chunk_size *= chunk_dims[i];
chunk_size *= DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE;
for (i = 0, data_size = 1; i < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id =
H5Gcreate2(container_group, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK,
dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0) {
H5_FAILED();
HDprintf(" failed to create DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Pset_chunk(dcpl_id, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK,
chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to set chunking on DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME,
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPE, fspace_id,
H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
/*
* See if a copy of the DCPL reports the correct chunking.
*/
if (H5Pclose(dcpl_id) < 0) {
H5_FAILED();
HDprintf(" failed to close DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Dget_create_plist(dset_id)) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve copy of DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
memset(retrieved_chunk_dims, 0, sizeof(retrieved_chunk_dims));
if (H5Pget_chunk(dcpl_id, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK,
retrieved_chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve chunking info\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (chunk_dims[i] != retrieved_chunk_dims[i]) {
H5_FAILED();
HDprintf(" chunk dimensionality retrieved from DCPL didn't match originally specified "
"dimensionality\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
/*
* Ensure that each underlying chunk contains the values
*
* chunk_index .. (chunk_nelemts - 1) + chunk_index.
*
* That is to say, for a chunk size of 10 x 10, chunk 0
* contains the values
*
* 0 .. 99
*
* while the next chunk contains the values
*
* 1 .. 100
*
* and so on.
*/
for (i = 0; i < data_size / DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE; i++) {
size_t j;
size_t base;
size_t tot_adjust;
/*
* Calculate a starting base value by taking the index value mod
* the size of a chunk in each dimension.
*/
for (j = 0, base = i; j < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; j++)
if (chunk_dims[j] > 1 && base >= chunk_dims[j])
base %= chunk_dims[j];
/*
* Calculate the adjustment in each dimension.
*/
for (j = 0, tot_adjust = 0;
j < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == (DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
tot_adjust += (i % dims[j]) / chunk_dims[j];
else {
size_t k;
size_t n_faster_elemts;
/*
* Calculate the number of elements in faster dimensions.
*/
for (k = j + 1, n_faster_elemts = 1;
k < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; k++)
n_faster_elemts *= dims[k];
tot_adjust +=
(((i / n_faster_elemts) / chunk_dims[j]) * (dims[j + 1] / chunk_dims[j + 1])) +
(((i / n_faster_elemts) % chunk_dims[j]) * chunk_dims[j + 1]);
}
}
((int *)write_buf)[i] = (int)(base + tot_adjust);
}
/*
* Write every chunk in the dataset.
*/
if (H5Dwrite(dset_id, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dcpl_id >= 0) {
H5E_BEGIN_TRY
{
H5Pclose(dcpl_id);
}
H5E_END_TRY;
dcpl_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_GROUP_NAME);
goto error;
}
if ((dset_id =
H5Dopen2(group_id, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
/*
* Create 2-dimensional memory dataspace for read buffer.
*/
{
hsize_t mdims[] = {chunk_dims[0], chunk_dims[1]};
if ((mspace_id = H5Screate_simple(2, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create memory dataspace\n");
goto error;
}
}
for (i = 0; i < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
count[i] = chunk_dims[i];
}
/*
* Each rank reads their respective chunks in the dataset, checking the data for each one.
*/
if (MAINPROCESS)
HDprintf("\n");
for (i = 0, n_chunks_per_rank = (data_size / (size_t)mpi_size) / chunk_size; i < n_chunks_per_rank; i++) {
size_t j, k;
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" MPI_Barrier failed\n");
goto error;
}
if (MAINPROCESS)
HDprintf("\r All ranks reading chunk %zu", i);
for (j = 0; j < DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == 0)
start[j] = (hsize_t)mpi_rank;
else if (j == (DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
/* Fastest changing dimension */
start[j] = (i * chunk_dims[j]) % dims[j];
else
start[j] = ((i * chunk_dims[j + 1]) / dims[j + 1]) * (chunk_dims[j]);
}
/*
* Adjust file dataspace selection for next chunk.
*/
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0) {
H5_FAILED();
HDprintf(" failed to set hyperslab selection\n");
goto error;
}
for (j = 0; j < chunk_dims[0]; j++)
for (k = 0; k < chunk_dims[1]; k++)
read_buf[j][k] = 0;
if (H5Dread(dset_id, DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_SAME_SPACE_READ_TEST_DSET_NAME);
goto error;
}
for (j = 0; j < chunk_dims[0]; j++) {
for (k = 0; k < chunk_dims[1]; k++) {
size_t val =
((j * chunk_dims[0]) + k + i) +
((hsize_t)mpi_rank * n_chunks_per_rank); /* Additional value offset for each rank */
if (read_buf[j][k] != (int)val) {
H5_FAILED();
HDprintf(" data verification failed for chunk %lld\n", (long long)i);
goto error;
}
}
}
}
if (chunk_dims) {
HDfree(chunk_dims);
chunk_dims = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (write_buf)
HDfree(write_buf);
if (chunk_dims)
HDfree(chunk_dims);
if (dims)
HDfree(dims);
H5Pclose(dcpl_id);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to check that a dataset composed of multiple chunks
* can be written and read correctly. When reading back the
* chunks of the dataset, the file dataspace and memory dataspace
* used are differently shaped. The dataset's first dimension grows
* with the number of MPI ranks, while the other dimensions are fixed.
*/
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE \
100 /* Should be an even divisor of fixed dimension size */
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE \
(DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE / 10)
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_FIXED_DIMSIZE 1000
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK 2
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE sizeof(int)
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_GROUP_NAME \
"multi_chunk_dataset_write_diff_space_read_test"
#define DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME "multi_chunk_dataset"
static int
test_write_multi_chunk_dataset_diff_shape_read(void)
{
hsize_t *dims = NULL;
hsize_t *chunk_dims = NULL;
hsize_t retrieved_chunk_dims[DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t start[DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t count[DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK];
size_t i, data_size, chunk_size, n_chunks_per_rank;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t dcpl_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
int read_buf[DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE]
[DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE];
TESTING("write to dataset with multiple chunks using differently shaped dataspaces");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_GET_PLIST)) {
SKIPPED();
HDprintf(" API functions for basic file, group, dataset, or getting property list aren't "
"supported with this connector\n");
return 0;
}
if (NULL ==
(dims = HDmalloc(DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK * sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
if (NULL == (chunk_dims = HDmalloc(DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
for (i = 0; i < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (i == 0) {
dims[i] = (hsize_t)mpi_size;
chunk_dims[i] = 1;
}
else {
dims[i] = DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_FIXED_DIMSIZE;
chunk_dims[i] = DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE;
}
}
for (i = 0, chunk_size = 1; i < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
chunk_size *= chunk_dims[i];
chunk_size *= DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE;
for (i = 0, data_size = 1; i < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE;
/*
* Have rank 0 create the dataset and completely fill it with data.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id =
H5Gcreate2(container_group, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0) {
H5_FAILED();
HDprintf(" failed to create DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Pset_chunk(dcpl_id, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to set chunking on DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME,
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE, fspace_id,
H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
/*
* See if a copy of the DCPL reports the correct chunking.
*/
if (H5Pclose(dcpl_id) < 0) {
H5_FAILED();
HDprintf(" failed to close DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Dget_create_plist(dset_id)) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve copy of DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
memset(retrieved_chunk_dims, 0, sizeof(retrieved_chunk_dims));
if (H5Pget_chunk(dcpl_id, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
retrieved_chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve chunking info\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (chunk_dims[i] != retrieved_chunk_dims[i]) {
H5_FAILED();
HDprintf(" chunk dimensionality retrieved from DCPL didn't match originally specified "
"dimensionality\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
/*
* Ensure that each underlying chunk contains the values
*
* chunk_index .. (chunk_nelemts - 1) + chunk_index.
*
* That is to say, for a chunk size of 10 x 10, chunk 0
* contains the values
*
* 0 .. 99
*
* while the next chunk contains the values
*
* 1 .. 100
*
* and so on.
*/
for (i = 0; i < data_size / DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE; i++) {
size_t j;
size_t base;
size_t tot_adjust;
/*
* Calculate a starting base value by taking the index value mod
* the size of a chunk in each dimension.
*/
for (j = 0, base = i; j < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; j++)
if (chunk_dims[j] > 1 && base >= chunk_dims[j])
base %= chunk_dims[j];
/*
* Calculate the adjustment in each dimension.
*/
for (j = 0, tot_adjust = 0;
j < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == (DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
tot_adjust += (i % dims[j]) / chunk_dims[j];
else {
size_t k;
size_t n_faster_elemts;
/*
* Calculate the number of elements in faster dimensions.
*/
for (k = j + 1, n_faster_elemts = 1;
k < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; k++)
n_faster_elemts *= dims[k];
tot_adjust +=
(((i / n_faster_elemts) / chunk_dims[j]) * (dims[j + 1] / chunk_dims[j + 1])) +
(((i / n_faster_elemts) % chunk_dims[j]) * chunk_dims[j + 1]);
}
}
((int *)write_buf)[i] = (int)(base + tot_adjust);
}
/*
* Write every chunk in the dataset.
*/
if (H5Dwrite(dset_id, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE, H5S_ALL, H5S_ALL,
H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dcpl_id >= 0) {
H5E_BEGIN_TRY
{
H5Pclose(dcpl_id);
}
H5E_END_TRY;
dcpl_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file to ensure that the data gets written.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_GROUP_NAME);
goto error;
}
if ((dset_id =
H5Dopen2(group_id, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
/*
* Create memory dataspace for read buffer.
*/
{
hsize_t mdims[] = {DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE,
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE};
if ((mspace_id = H5Screate_simple(DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create memory dataspace\n");
goto error;
}
}
for (i = 0; i < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
count[i] = chunk_dims[i];
}
/*
* Each rank reads their respective chunks in the dataset, checking the data for each one.
*/
if (MAINPROCESS)
HDprintf("\n");
for (i = 0, n_chunks_per_rank = (data_size / (size_t)mpi_size) / chunk_size; i < n_chunks_per_rank; i++) {
size_t j, k;
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" MPI_Barrier failed\n");
goto error;
}
if (MAINPROCESS)
HDprintf("\r All ranks reading chunk %zu", i);
for (j = 0; j < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == 0)
start[j] = (hsize_t)mpi_rank;
else if (j == (DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
/* Fastest changing dimension */
start[j] = (i * chunk_dims[j]) % dims[j];
else
start[j] = ((i * chunk_dims[j + 1]) / dims[j + 1]) * (chunk_dims[j]);
}
/*
* Adjust file dataspace selection for next chunk.
*/
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0) {
H5_FAILED();
HDprintf(" failed to set hyperslab selection\n");
goto error;
}
for (j = 0; j < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; j++)
for (k = 0; k < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; k++)
read_buf[j][k] = 0;
if (H5Dread(dset_id, DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE, mspace_id, fspace_id,
H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n",
DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
goto error;
}
for (j = 0; j < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; j++) {
for (k = 0; k < DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; k++) {
size_t val = ((j * DATASET_MULTI_CHUNK_WRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE) + k + i) +
((hsize_t)mpi_rank * n_chunks_per_rank);
if (read_buf[j][k] != (int)val) {
H5_FAILED();
HDprintf(" data verification failed for chunk %lld\n", (long long)i);
goto error;
}
}
}
}
if (chunk_dims) {
HDfree(chunk_dims);
chunk_dims = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Sclose(fspace_id) < 0)
TEST_ERROR;
if (H5Dclose(dset_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (write_buf)
HDfree(write_buf);
if (chunk_dims)
HDfree(chunk_dims);
if (dims)
HDfree(dims);
H5Pclose(dcpl_id);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to check that a dataset composed of multiple chunks
* can be written and read correctly several times in a row.
* When reading back the chunks of the dataset, the file
* dataspace and memory dataspace used are the same shape.
* The dataset's first dimension grows with the number of MPI
* ranks, while the other dimensions are fixed.
*/
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE \
100 /* Should be an even divisor of fixed dimension size */
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_FIXED_DIMSIZE 1000
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK 2
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE sizeof(int)
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_GROUP_NAME \
"multi_chunk_dataset_same_space_overwrite_test"
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME "multi_chunk_dataset"
#define DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_NITERS 10
static int
test_overwrite_multi_chunk_dataset_same_shape_read(void)
{
hsize_t *dims = NULL;
hsize_t *chunk_dims = NULL;
hsize_t retrieved_chunk_dims[DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t start[DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t count[DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
size_t i, data_size, chunk_size, n_chunks_per_rank;
size_t niter;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t dcpl_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
int read_buf[1][DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE];
TESTING("several overwrites to dataset with multiple chunks using same shaped dataspaces");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_GET_PLIST)) {
SKIPPED();
HDprintf(" API functions for basic file, group, dataset, or getting property list aren't "
"supported with this connector\n");
return 0;
}
if (NULL == (dims = HDmalloc(DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
if (NULL == (chunk_dims = HDmalloc(DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
for (i = 0; i < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (i == 0) {
dims[i] = (hsize_t)mpi_size;
chunk_dims[i] = 1;
}
else {
dims[i] = DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_FIXED_DIMSIZE;
chunk_dims[i] = DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE;
}
}
for (i = 0, chunk_size = 1; i < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
chunk_size *= chunk_dims[i];
chunk_size *= DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE;
for (i = 0, data_size = 1; i < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE;
/*
* Have rank 0 create the dataset, but don't fill it with data yet.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group,
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK, dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0) {
H5_FAILED();
HDprintf(" failed to create DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Pset_chunk(dcpl_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK,
chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to set chunking on DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
/* Set dataset space allocation time to Early to ensure all chunk-related metadata is available to
* all other processes when they open the dataset */
if (H5Pset_alloc_time(dcpl_id, H5D_ALLOC_TIME_EARLY) < 0) {
H5_FAILED();
HDprintf(" failed to set allocation time on DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME,
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPE,
fspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
/*
* See if a copy of the DCPL reports the correct chunking.
*/
if (H5Pclose(dcpl_id) < 0) {
H5_FAILED();
HDprintf(" failed to close DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Dget_create_plist(dset_id)) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve copy of DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
memset(retrieved_chunk_dims, 0, sizeof(retrieved_chunk_dims));
if (H5Pget_chunk(dcpl_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK,
retrieved_chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve chunking info\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (chunk_dims[i] != retrieved_chunk_dims[i]) {
H5_FAILED();
HDprintf(" chunk dimensionality retrieved from DCPL didn't match originally specified "
"dimensionality\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dcpl_id >= 0) {
H5E_BEGIN_TRY
{
H5Pclose(dcpl_id);
}
H5E_END_TRY;
dcpl_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file on all ranks.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_GROUP_NAME);
goto error;
}
/*
* Create 2-dimensional memory dataspace for read buffer.
*/
{
hsize_t mdims[] = {chunk_dims[0], chunk_dims[1]};
if ((mspace_id = H5Screate_simple(2, mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create memory dataspace\n");
goto error;
}
}
for (i = 0; i < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
count[i] = chunk_dims[i];
}
if (MAINPROCESS)
HDprintf("\n");
for (niter = 0; niter < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_NITERS; niter++) {
if ((dset_id = H5Dopen2(group_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME);
goto error;
}
BEGIN_INDEPENDENT_OP(dset_write)
{
if (MAINPROCESS) {
memset(write_buf, 0, data_size);
/*
* Ensure that each underlying chunk contains the values
*
* chunk_index .. (chunk_nelemts - 1) + chunk_index.
*
* That is to say, for a chunk size of 10 x 10, chunk 0
* contains the values
*
* 0 .. 99
*
* while the next chunk contains the values
*
* 1 .. 100
*
* and so on. On each iteration, we add 1 to the previous
* values.
*/
for (i = 0; i < data_size / DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPESIZE;
i++) {
size_t j;
size_t base;
size_t tot_adjust;
/*
* Calculate a starting base value by taking the index value mod
* the size of a chunk in each dimension.
*/
for (j = 0, base = i;
j < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; j++)
if (chunk_dims[j] > 1 && base >= chunk_dims[j])
base %= chunk_dims[j];
/*
* Calculate the adjustment in each dimension.
*/
for (j = 0, tot_adjust = 0;
j < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == (DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
tot_adjust += (i % dims[j]) / chunk_dims[j];
else {
size_t k;
size_t n_faster_elemts;
/*
* Calculate the number of elements in faster dimensions.
*/
for (k = j + 1, n_faster_elemts = 1;
k < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; k++)
n_faster_elemts *= dims[k];
tot_adjust += (((i / n_faster_elemts) / chunk_dims[j]) *
(dims[j + 1] / chunk_dims[j + 1])) +
(((i / n_faster_elemts) % chunk_dims[j]) * chunk_dims[j + 1]);
}
}
((int *)write_buf)[i] = (int)(base + tot_adjust + niter);
}
/*
* Write every chunk in the dataset.
*/
if (H5Dwrite(dset_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPE, H5S_ALL,
H5S_ALL, H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
}
END_INDEPENDENT_OP(dset_write);
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" MPI_Barrier failed\n");
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
/*
* Each rank reads their respective chunks in the dataset, checking the data for each one.
*/
for (i = 0, n_chunks_per_rank = (data_size / (size_t)mpi_size) / chunk_size; i < n_chunks_per_rank;
i++) {
size_t j, k;
if (MAINPROCESS)
HDprintf("\r All ranks reading chunk %zu", i);
for (j = 0; j < DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == 0)
start[j] = (hsize_t)mpi_rank;
else if (j == (DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
/* Fastest changing dimension */
start[j] = (i * chunk_dims[j]) % dims[j];
else
start[j] = ((i * chunk_dims[j + 1]) / dims[j + 1]) * (chunk_dims[j]);
}
/*
* Adjust file dataspace selection for next chunk.
*/
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0) {
H5_FAILED();
HDprintf(" failed to set hyperslab selection\n");
goto error;
}
for (j = 0; j < chunk_dims[0]; j++)
for (k = 0; k < chunk_dims[1]; k++)
read_buf[j][k] = 0;
if (H5Dread(dset_id, DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_DTYPE, mspace_id,
fspace_id, H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_NAME);
goto error;
}
for (j = 0; j < chunk_dims[0]; j++) {
for (k = 0; k < chunk_dims[1]; k++) {
size_t val =
((j * chunk_dims[0]) + k + i) +
((hsize_t)mpi_rank * n_chunks_per_rank) /* Additional value offset for each rank */
+ niter;
if (read_buf[j][k] != (int)val) {
H5_FAILED();
HDprintf(" data verification failed for chunk %lld\n", (long long)i);
goto error;
}
}
}
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" MPI_Barrier failed\n");
goto error;
}
}
if (chunk_dims) {
HDfree(chunk_dims);
chunk_dims = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (write_buf)
HDfree(write_buf);
if (chunk_dims)
HDfree(chunk_dims);
if (dims)
HDfree(dims);
H5Pclose(dcpl_id);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
/*
* A test to check that a dataset composed of multiple chunks
* can be written and read correctly several times in a row.
* When reading back the chunks of the dataset, the file
* dataspace and memory dataspace used are differently shaped.
* The dataset's first dimension grows with the number of MPI
* ranks, while the other dimensions are fixed.
*/
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE \
100 /* Should be an even divisor of fixed dimension size */
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE \
(DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE / 10)
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_FIXED_DIMSIZE 1000
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK 2
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE sizeof(int)
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE H5T_NATIVE_INT
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_GROUP_NAME \
"multi_chunk_dataset_diff_space_overwrite_test"
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME "multi_chunk_dataset"
#define DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_NITERS 10
static int
test_overwrite_multi_chunk_dataset_diff_shape_read(void)
{
hsize_t *dims = NULL;
hsize_t *chunk_dims = NULL;
hsize_t retrieved_chunk_dims[DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t start[DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
hsize_t count[DATASET_MULTI_CHUNK_OVERWRITE_SAME_SPACE_READ_TEST_DSET_SPACE_RANK];
size_t i, data_size, chunk_size, n_chunks_per_rank;
size_t niter;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t dcpl_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
hid_t mspace_id = H5I_INVALID_HID;
void *write_buf = NULL;
int read_buf[DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE]
[DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE];
TESTING("several overwrites to dataset with multiple chunks using differently shaped dataspaces");
/* Make sure the connector supports the API functions being tested */
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE) ||
!(vol_cap_flags_g & H5VL_CAP_FLAG_GET_PLIST)) {
SKIPPED();
HDprintf(" API functions for basic file, group, dataset, or getting property list aren't "
"supported with this connector\n");
return 0;
}
if (NULL == (dims = HDmalloc(DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
if (NULL == (chunk_dims = HDmalloc(DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK *
sizeof(hsize_t)))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset dimensionality\n");
goto error;
}
for (i = 0; i < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (i == 0) {
dims[i] = (hsize_t)mpi_size;
chunk_dims[i] = 1;
}
else {
dims[i] = DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_FIXED_DIMSIZE;
chunk_dims[i] = DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_FIXED_CHUNK_DIMSIZE;
}
}
for (i = 0, chunk_size = 1; i < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
chunk_size *= chunk_dims[i];
chunk_size *= DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE;
for (i = 0, data_size = 1; i < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++)
data_size *= dims[i];
data_size *= DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE;
/*
* Have rank 0 create the dataset, but don't fill it with data yet.
*/
BEGIN_INDEPENDENT_OP(dset_create)
{
if (MAINPROCESS) {
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open file '%s'\n", H5_api_test_parallel_filename);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((group_id = H5Gcreate2(container_group,
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create container sub-group '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_GROUP_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
if ((fspace_id = H5Screate_simple(
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK, dims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create file dataspace for dataset\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0) {
H5_FAILED();
HDprintf(" failed to create DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Pset_chunk(dcpl_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to set chunking on DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
/* Set dataset space allocation time to Early to ensure all chunk-related metadata is available to
* all other processes when they open the dataset */
if (H5Pset_alloc_time(dcpl_id, H5D_ALLOC_TIME_EARLY) < 0) {
H5_FAILED();
HDprintf(" failed to set allocation time on DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dset_id = H5Dcreate2(group_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME,
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE,
fspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't create dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_create);
}
/*
* See if a copy of the DCPL reports the correct chunking.
*/
if (H5Pclose(dcpl_id) < 0) {
H5_FAILED();
HDprintf(" failed to close DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if ((dcpl_id = H5Dget_create_plist(dset_id)) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve copy of DCPL\n");
INDEPENDENT_OP_ERROR(dset_create);
}
memset(retrieved_chunk_dims, 0, sizeof(retrieved_chunk_dims));
if (H5Pget_chunk(dcpl_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
retrieved_chunk_dims) < 0) {
H5_FAILED();
HDprintf(" failed to retrieve chunking info\n");
INDEPENDENT_OP_ERROR(dset_create);
}
for (i = 0; i < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
if (chunk_dims[i] != retrieved_chunk_dims[i]) {
H5_FAILED();
HDprintf(" chunk dimensionality retrieved from DCPL didn't match originally specified "
"dimensionality\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
if (NULL == (write_buf = HDmalloc(data_size))) {
H5_FAILED();
HDprintf(" couldn't allocate buffer for dataset write\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dcpl_id >= 0) {
H5E_BEGIN_TRY
{
H5Pclose(dcpl_id);
}
H5E_END_TRY;
dcpl_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
/*
* Close and re-open the file on all ranks.
*/
if (H5Gclose(group_id) < 0) {
H5_FAILED();
HDprintf(" failed to close test's container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Gclose(container_group) < 0) {
H5_FAILED();
HDprintf(" failed to close container group\n");
INDEPENDENT_OP_ERROR(dset_create);
}
if (H5Fclose(file_id) < 0) {
H5_FAILED();
HDprintf(" failed to close file for data flushing\n");
INDEPENDENT_OP_ERROR(dset_create);
}
}
}
END_INDEPENDENT_OP(dset_create);
/*
* Re-open file on all ranks.
*/
if ((fapl_id = create_mpi_fapl(MPI_COMM_WORLD, MPI_INFO_NULL, TRUE)) < 0)
TEST_ERROR;
if ((file_id = H5Fopen(H5_api_test_parallel_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't re-open file '%s'\n", H5_api_test_parallel_filename);
goto error;
}
if ((container_group = H5Gopen2(file_id, DATASET_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container group '%s'\n", DATASET_TEST_GROUP_NAME);
goto error;
}
if ((group_id = H5Gopen2(container_group, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_GROUP_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open container sub-group '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_GROUP_NAME);
goto error;
}
/*
* Create memory dataspace for read buffer.
*/
{
hsize_t mdims[] = {DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE,
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE};
if ((mspace_id = H5Screate_simple(DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK,
mdims, NULL)) < 0) {
H5_FAILED();
HDprintf(" failed to create memory dataspace\n");
goto error;
}
}
for (i = 0; i < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; i++) {
count[i] = chunk_dims[i];
}
if (MAINPROCESS)
HDprintf("\n");
for (niter = 0; niter < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_NITERS; niter++) {
if ((dset_id = H5Dopen2(group_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
goto error;
}
BEGIN_INDEPENDENT_OP(dset_write)
{
if (MAINPROCESS) {
memset(write_buf, 0, data_size);
/*
* Ensure that each underlying chunk contains the values
*
* chunk_index .. (chunk_nelemts - 1) + chunk_index.
*
* That is to say, for a chunk size of 10 x 10, chunk 0
* contains the values
*
* 0 .. 99
*
* while the next chunk contains the values
*
* 1 .. 100
*
* and so on. On each iteration, we add 1 to the previous
* values.
*/
for (i = 0; i < data_size / DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPESIZE;
i++) {
size_t j;
size_t base;
size_t tot_adjust;
/*
* Calculate a starting base value by taking the index value mod
* the size of a chunk in each dimension.
*/
for (j = 0, base = i;
j < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; j++)
if (chunk_dims[j] > 1 && base >= chunk_dims[j])
base %= chunk_dims[j];
/*
* Calculate the adjustment in each dimension.
*/
for (j = 0, tot_adjust = 0;
j < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == (DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
tot_adjust += (i % dims[j]) / chunk_dims[j];
else {
size_t k;
size_t n_faster_elemts;
/*
* Calculate the number of elements in faster dimensions.
*/
for (k = j + 1, n_faster_elemts = 1;
k < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; k++)
n_faster_elemts *= dims[k];
tot_adjust += (((i / n_faster_elemts) / chunk_dims[j]) *
(dims[j + 1] / chunk_dims[j + 1])) +
(((i / n_faster_elemts) % chunk_dims[j]) * chunk_dims[j + 1]);
}
}
((int *)write_buf)[i] = (int)(base + tot_adjust + niter);
}
/*
* Write every chunk in the dataset.
*/
if (H5Dwrite(dset_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE, H5S_ALL,
H5S_ALL, H5P_DEFAULT, write_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't write to dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
INDEPENDENT_OP_ERROR(dset_write);
}
}
}
END_INDEPENDENT_OP(dset_write);
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" MPI_Barrier failed\n");
goto error;
}
if ((dset_id = H5Dopen2(group_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME,
H5P_DEFAULT)) < 0) {
H5_FAILED();
HDprintf(" couldn't open dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
goto error;
}
if ((fspace_id = H5Dget_space(dset_id)) < 0) {
H5_FAILED();
HDprintf(" couldn't get dataset dataspace\n");
goto error;
}
/*
* Each rank reads their respective chunks in the dataset, checking the data for each one.
*/
for (i = 0, n_chunks_per_rank = (data_size / (size_t)mpi_size) / chunk_size; i < n_chunks_per_rank;
i++) {
size_t j, k;
if (MAINPROCESS)
HDprintf("\r All ranks reading chunk %zu", i);
for (j = 0; j < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK; j++) {
if (j == 0)
start[j] = (hsize_t)mpi_rank;
else if (j == (DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_SPACE_RANK - 1))
/* Fastest changing dimension */
start[j] = (i * chunk_dims[j]) % dims[j];
else
start[j] = ((i * chunk_dims[j + 1]) / dims[j + 1]) * (chunk_dims[j]);
}
/*
* Adjust file dataspace selection for next chunk.
*/
if (H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0) {
H5_FAILED();
HDprintf(" failed to set hyperslab selection\n");
goto error;
}
for (j = 0; j < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; j++)
for (k = 0; k < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; k++)
read_buf[j][k] = 0;
if (H5Dread(dset_id, DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_DTYPE, mspace_id,
fspace_id, H5P_DEFAULT, read_buf) < 0) {
H5_FAILED();
HDprintf(" couldn't read from dataset '%s'\n",
DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_DSET_NAME);
goto error;
}
for (j = 0; j < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; j++) {
for (k = 0; k < DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE; k++) {
size_t val =
((j * DATASET_MULTI_CHUNK_OVERWRITE_DIFF_SPACE_READ_TEST_READ_BUF_DIMSIZE) + k + i) +
((hsize_t)mpi_rank * n_chunks_per_rank) + niter;
if (read_buf[j][k] != (int)val) {
H5_FAILED();
HDprintf(" data verification failed for chunk %lld\n", (long long)i);
goto error;
}
}
}
}
if (fspace_id >= 0) {
H5E_BEGIN_TRY
{
H5Sclose(fspace_id);
}
H5E_END_TRY;
fspace_id = H5I_INVALID_HID;
}
if (dset_id >= 0) {
H5E_BEGIN_TRY
{
H5Dclose(dset_id);
}
H5E_END_TRY;
dset_id = H5I_INVALID_HID;
}
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
H5_FAILED();
HDprintf(" MPI_Barrier failed\n");
goto error;
}
}
if (chunk_dims) {
HDfree(chunk_dims);
chunk_dims = NULL;
}
if (dims) {
HDfree(dims);
dims = NULL;
}
if (write_buf) {
HDfree(write_buf);
write_buf = NULL;
}
if (H5Sclose(mspace_id) < 0)
TEST_ERROR;
if (H5Gclose(group_id) < 0)
TEST_ERROR;
if (H5Gclose(container_group) < 0)
TEST_ERROR;
if (H5Pclose(fapl_id) < 0)
TEST_ERROR;
if (H5Fclose(file_id) < 0)
TEST_ERROR;
PASSED();
return 0;
error:
H5E_BEGIN_TRY
{
if (write_buf)
HDfree(write_buf);
if (chunk_dims)
HDfree(chunk_dims);
if (dims)
HDfree(dims);
H5Pclose(dcpl_id);
H5Sclose(mspace_id);
H5Sclose(fspace_id);
H5Dclose(dset_id);
H5Gclose(group_id);
H5Gclose(container_group);
H5Pclose(fapl_id);
H5Fclose(file_id);
}
H5E_END_TRY;
return 1;
}
int
H5_api_dataset_test_parallel(void)
{
size_t i;
int nerrors;
if (MAINPROCESS) {
HDprintf("**********************************************\n");
HDprintf("* *\n");
HDprintf("* API Parallel Dataset Tests *\n");
HDprintf("* *\n");
HDprintf("**********************************************\n\n");
}
for (i = 0, nerrors = 0; i < ARRAY_LENGTH(par_dataset_tests); i++) {
nerrors += (*par_dataset_tests[i])() ? 1 : 0;
if (MPI_SUCCESS != MPI_Barrier(MPI_COMM_WORLD)) {
if (MAINPROCESS)
HDprintf(" MPI_Barrier() failed!\n");
}
}
if (MAINPROCESS)
HDprintf("\n");
return nerrors;
}