hdf5/testpar/t_bigio.c

1887 lines
65 KiB
C
Raw Permalink Normal View History

2022-05-14 03:31:31 +08:00
#include "hdf5.h"
#include "testphdf5.h"
2024-04-24 15:00:37 +08:00
#include "H5Dprivate.h" /* For Chunk tests */
2022-05-14 03:31:31 +08:00
/* FILENAME and filenames must have the same number of names */
2024-04-24 15:00:37 +08:00
const char *FILENAME[2] = {"bigio_test.h5", NULL};
2022-05-14 03:31:31 +08:00
/* Constants definitions */
2024-04-24 15:00:37 +08:00
#define MAX_ERR_REPORT 10 /* Maximum number of errors reported */
2022-05-14 03:31:31 +08:00
/* Define some handy debugging shorthands, routines, ... */
/* debugging tools */
2024-04-24 15:00:37 +08:00
#define MAIN_PROCESS (mpi_rank_g == 0) /* define process 0 as main process */
2022-05-14 03:31:31 +08:00
/* Constants definitions */
2024-04-24 15:00:37 +08:00
#define RANK 2
2022-05-14 03:31:31 +08:00
#define IN_ORDER 1
#define OUT_OF_ORDER 2
2024-04-24 15:00:37 +08:00
#define DATASET1 "DSET1"
#define DATASET2 "DSET2"
#define DATASET3 "DSET3"
#define DATASET4 "DSET4"
#define DATASET5 "DSET5"
#define DXFER_COLLECTIVE_IO 0x1 /* Collective IO*/
2022-05-14 03:31:31 +08:00
#define DXFER_INDEPENDENT_IO 0x2 /* Independent IO collectively */
2024-04-24 15:00:37 +08:00
#define DXFER_BIGCOUNT 536870916
2022-05-14 03:31:31 +08:00
#define HYPER 1
#define POINT 2
2024-04-24 15:00:37 +08:00
#define ALL 3
2022-05-14 03:31:31 +08:00
/* Dataset data type. Int's can be easily octo dumped. */
typedef hsize_t B_DATATYPE;
2024-04-24 15:00:37 +08:00
int facc_type = FACC_MPIO; /*Test file access type */
int dxfer_coll_type = DXFER_COLLECTIVE_IO;
size_t bigcount = (size_t)DXFER_BIGCOUNT;
int nerrors = 0;
static int mpi_size_g, mpi_rank_g;
2022-05-14 03:31:31 +08:00
hsize_t space_dim1 = SPACE_DIM1 * 256; // 4096
hsize_t space_dim2 = SPACE_DIM2;
2024-04-24 15:00:37 +08:00
static void coll_chunktest(const char *filename, int chunk_factor, int select_factor, int api_option,
int file_selection, int mem_selection, int mode);
2022-05-14 03:31:31 +08:00
/*
* Setup the coordinates for point selection.
*/
2024-04-24 15:00:37 +08:00
static void
set_coords(hsize_t start[], hsize_t count[], hsize_t stride[], hsize_t block[], size_t num_points,
hsize_t coords[], int order)
2022-05-14 03:31:31 +08:00
{
2024-04-24 15:00:37 +08:00
hsize_t i, j, k = 0, m, n, s1, s2;
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (OUT_OF_ORDER == order)
2022-05-14 03:31:31 +08:00
k = (num_points * RANK) - 1;
2024-04-24 15:00:37 +08:00
else if (IN_ORDER == order)
2022-05-14 03:31:31 +08:00
k = 0;
s1 = start[0];
s2 = start[1];
2024-04-24 15:00:37 +08:00
for (i = 0; i < count[0]; i++)
for (j = 0; j < count[1]; j++)
for (m = 0; m < block[0]; m++)
for (n = 0; n < block[1]; n++)
if (OUT_OF_ORDER == order) {
2022-05-14 03:31:31 +08:00
coords[k--] = s2 + (stride[1] * j) + n;
coords[k--] = s1 + (stride[0] * i) + m;
}
2024-04-24 15:00:37 +08:00
else if (IN_ORDER == order) {
2022-05-14 03:31:31 +08:00
coords[k++] = s1 + stride[0] * i + m;
coords[k++] = s2 + stride[1] * j + n;
}
}
/*
* Fill the dataset with trivial data for testing.
* Assume dimension rank is 2 and data is stored contiguous.
*/
static void
2024-04-24 15:00:37 +08:00
fill_datasets(hsize_t start[], hsize_t block[], B_DATATYPE *dataset)
2022-05-14 03:31:31 +08:00
{
B_DATATYPE *dataptr = dataset;
2024-04-24 15:00:37 +08:00
hsize_t i, j;
2022-05-14 03:31:31 +08:00
/* put some trivial data in the data_array */
2024-04-24 15:00:37 +08:00
for (i = 0; i < block[0]; i++) {
for (j = 0; j < block[1]; j++) {
*dataptr = (B_DATATYPE)((i + start[0]) * 100 + (j + start[1] + 1));
dataptr++;
}
2022-05-14 03:31:31 +08:00
}
}
/*
* Setup the coordinates for point selection.
*/
2024-04-24 15:00:37 +08:00
void
point_set(hsize_t start[], hsize_t count[], hsize_t stride[], hsize_t block[], size_t num_points,
hsize_t coords[], int order)
2022-05-14 03:31:31 +08:00
{
2024-04-24 15:00:37 +08:00
hsize_t i, j, k = 0, m, n, s1, s2;
2022-05-14 03:31:31 +08:00
HDcompile_assert(RANK == 2);
2024-04-24 15:00:37 +08:00
if (OUT_OF_ORDER == order)
2022-05-14 03:31:31 +08:00
k = (num_points * RANK) - 1;
2024-04-24 15:00:37 +08:00
else if (IN_ORDER == order)
2022-05-14 03:31:31 +08:00
k = 0;
s1 = start[0];
s2 = start[1];
2024-04-24 15:00:37 +08:00
for (i = 0; i < count[0]; i++)
for (j = 0; j < count[1]; j++)
for (m = 0; m < block[0]; m++)
for (n = 0; n < block[1]; n++)
if (OUT_OF_ORDER == order) {
2022-05-14 03:31:31 +08:00
coords[k--] = s2 + (stride[1] * j) + n;
coords[k--] = s1 + (stride[0] * i) + m;
}
2024-04-24 15:00:37 +08:00
else if (IN_ORDER == order) {
2022-05-14 03:31:31 +08:00
coords[k++] = s1 + stride[0] * i + m;
coords[k++] = s2 + stride[1] * j + n;
}
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
HDprintf("start[]=(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"count[]=(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"stride[]=(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"block[]=(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"total datapoints=%" PRIuHSIZE "\n",
start[0], start[1], count[0], count[1], stride[0], stride[1], block[0], block[1],
block[0] * block[1] * count[0] * count[1]);
2022-05-14 03:31:31 +08:00
k = 0;
2024-04-24 15:00:37 +08:00
for (i = 0; i < num_points; i++) {
HDprintf("(%d, %d)\n", (int)coords[k], (int)coords[k + 1]);
2022-05-14 03:31:31 +08:00
k += 2;
}
}
}
/*
* Print the content of the dataset.
*/
static void
2024-04-24 15:00:37 +08:00
dataset_print(hsize_t start[], hsize_t block[], B_DATATYPE *dataset)
2022-05-14 03:31:31 +08:00
{
B_DATATYPE *dataptr = dataset;
2024-04-24 15:00:37 +08:00
hsize_t i, j;
2022-05-14 03:31:31 +08:00
/* print the column heading */
2024-04-24 15:00:37 +08:00
HDprintf("%-8s", "Cols:");
for (j = 0; j < block[1]; j++) {
HDprintf("%3" PRIuHSIZE " ", start[1] + j);
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
HDprintf("\n");
2022-05-14 03:31:31 +08:00
/* print the slab data */
2024-04-24 15:00:37 +08:00
for (i = 0; i < block[0]; i++) {
HDprintf("Row %2" PRIuHSIZE ": ", i + start[0]);
for (j = 0; j < block[1]; j++) {
HDprintf("%" PRIuHSIZE " ", *dataptr++);
}
HDprintf("\n");
2022-05-14 03:31:31 +08:00
}
}
/*
* Print the content of the dataset.
*/
static int
2024-04-24 15:00:37 +08:00
verify_data(hsize_t start[], hsize_t count[], hsize_t stride[], hsize_t block[], B_DATATYPE *dataset,
B_DATATYPE *original)
2022-05-14 03:31:31 +08:00
{
hsize_t i, j;
2024-04-24 15:00:37 +08:00
int vrfyerrs;
2022-05-14 03:31:31 +08:00
/* print it if VERBOSE_MED */
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
HDprintf("verify_data dumping:::\n");
HDprintf("start(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"count(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"stride(%" PRIuHSIZE ", %" PRIuHSIZE "), "
"block(%" PRIuHSIZE ", %" PRIuHSIZE ")\n",
start[0], start[1], count[0], count[1], stride[0], stride[1], block[0], block[1]);
HDprintf("original values:\n");
dataset_print(start, block, original);
HDprintf("compared values:\n");
dataset_print(start, block, dataset);
2022-05-14 03:31:31 +08:00
}
vrfyerrs = 0;
2024-04-24 15:00:37 +08:00
for (i = 0; i < block[0]; i++) {
for (j = 0; j < block[1]; j++) {
if (*dataset != *original) {
if (vrfyerrs++ < MAX_ERR_REPORT || VERBOSE_MED) {
HDprintf("Dataset Verify failed at [%" PRIuHSIZE "][%" PRIuHSIZE "]"
"(row %" PRIuHSIZE ", col %" PRIuHSIZE "): "
"expect %" PRIuHSIZE ", got %" PRIuHSIZE "\n",
i, j, i + start[0], j + start[1], *(original), *(dataset));
}
dataset++;
original++;
}
}
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
if (vrfyerrs > MAX_ERR_REPORT && !VERBOSE_MED)
HDprintf("[more errors ...]\n");
if (vrfyerrs)
HDprintf("%d errors found in verify_data\n", vrfyerrs);
return (vrfyerrs);
2022-05-14 03:31:31 +08:00
}
/* Set up the selection */
static void
2024-04-24 15:00:37 +08:00
ccslab_set(int mpi_rank, int mpi_size, hsize_t start[], hsize_t count[], hsize_t stride[], hsize_t block[],
int mode)
2022-05-14 03:31:31 +08:00
{
2024-04-24 15:00:37 +08:00
switch (mode) {
case BYROW_CONT:
/* Each process takes a slabs of rows. */
block[0] = 1;
block[1] = 1;
stride[0] = 1;
stride[1] = 1;
count[0] = space_dim1;
count[1] = space_dim2;
start[0] = (hsize_t)mpi_rank * count[0];
start[1] = 0;
break;
case BYROW_DISCONT:
/* Each process takes several disjoint blocks. */
block[0] = 1;
block[1] = 1;
stride[0] = 3;
stride[1] = 3;
count[0] = space_dim1 / (stride[0] * block[0]);
count[1] = (space_dim2) / (stride[1] * block[1]);
start[0] = space_dim1 * (hsize_t)mpi_rank;
start[1] = 0;
break;
case BYROW_SELECTNONE:
/* Each process takes a slabs of rows, there are
no selections for the last process. */
block[0] = 1;
block[1] = 1;
stride[0] = 1;
stride[1] = 1;
count[0] = ((mpi_rank >= MAX(1, (mpi_size - 2))) ? 0 : space_dim1);
count[1] = space_dim2;
start[0] = (hsize_t)mpi_rank * count[0];
start[1] = 0;
break;
case BYROW_SELECTUNBALANCE:
/* The first one-third of the number of processes only
select top half of the domain, The rest will select the bottom
half of the domain. */
block[0] = 1;
count[0] = 2;
stride[0] = (hsize_t)(space_dim1 * (hsize_t)mpi_size / 4 + 1);
block[1] = space_dim2;
count[1] = 1;
start[1] = 0;
stride[1] = 1;
if ((mpi_rank * 3) < (mpi_size * 2))
start[0] = (hsize_t)mpi_rank;
else
start[0] = 1 + space_dim1 * (hsize_t)mpi_size / 2 + (hsize_t)(mpi_rank - 2 * mpi_size / 3);
break;
case BYROW_SELECTINCHUNK:
/* Each process will only select one chunk */
block[0] = 1;
count[0] = 1;
start[0] = (hsize_t)mpi_rank * space_dim1;
stride[0] = 1;
block[1] = space_dim2;
count[1] = 1;
stride[1] = 1;
start[1] = 0;
break;
default:
/* Unknown mode. Set it to cover the whole dataset. */
block[0] = space_dim1 * (hsize_t)mpi_size;
block[1] = space_dim2;
stride[0] = block[0];
stride[1] = block[1];
count[0] = 1;
count[1] = 1;
start[0] = 0;
start[1] = 0;
break;
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
HDprintf("start[]=(%lu,%lu), count[]=(%lu,%lu), stride[]=(%lu,%lu), block[]=(%lu,%lu), total "
"datapoints=%lu\n",
(unsigned long)start[0], (unsigned long)start[1], (unsigned long)count[0],
(unsigned long)count[1], (unsigned long)stride[0], (unsigned long)stride[1],
(unsigned long)block[0], (unsigned long)block[1],
(unsigned long)(block[0] * block[1] * count[0] * count[1]));
2022-05-14 03:31:31 +08:00
}
}
/*
* Fill the dataset with trivial data for testing.
* Assume dimension rank is 2.
*/
static void
2024-04-24 15:00:37 +08:00
ccdataset_fill(hsize_t start[], hsize_t stride[], hsize_t count[], hsize_t block[], DATATYPE *dataset,
2022-05-14 03:31:31 +08:00
int mem_selection)
{
DATATYPE *dataptr = dataset;
DATATYPE *tmptr;
2024-04-24 15:00:37 +08:00
hsize_t i, j, k1, k2, k = 0;
2022-05-14 03:31:31 +08:00
/* put some trivial data in the data_array */
tmptr = dataptr;
/* assign the disjoint block (two-dimensional)data array value
through the pointer */
for (k1 = 0; k1 < count[0]; k1++) {
2024-04-24 15:00:37 +08:00
for (i = 0; i < block[0]; i++) {
for (k2 = 0; k2 < count[1]; k2++) {
for (j = 0; j < block[1]; j++) {
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (ALL != mem_selection) {
dataptr = tmptr + ((start[0] + k1 * stride[0] + i) * space_dim2 + start[1] +
k2 * stride[1] + j);
}
else {
dataptr = tmptr + k;
k++;
}
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
*dataptr = (DATATYPE)(k1 + k2 + i + j);
}
}
2022-05-14 03:31:31 +08:00
}
}
}
/*
* Print the first block of the content of the dataset.
*/
static void
2024-04-24 15:00:37 +08:00
ccdataset_print(hsize_t start[], hsize_t block[], DATATYPE *dataset)
2022-05-14 03:31:31 +08:00
{
DATATYPE *dataptr = dataset;
2024-04-24 15:00:37 +08:00
hsize_t i, j;
2022-05-14 03:31:31 +08:00
/* print the column heading */
2024-04-24 15:00:37 +08:00
HDprintf("Print only the first block of the dataset\n");
HDprintf("%-8s", "Cols:");
for (j = 0; j < block[1]; j++) {
HDprintf("%3lu ", (unsigned long)(start[1] + j));
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
HDprintf("\n");
2022-05-14 03:31:31 +08:00
/* print the slab data */
2024-04-24 15:00:37 +08:00
for (i = 0; i < block[0]; i++) {
HDprintf("Row %2lu: ", (unsigned long)(i + start[0]));
for (j = 0; j < block[1]; j++) {
HDprintf("%03d ", *dataptr++);
}
HDprintf("\n");
2022-05-14 03:31:31 +08:00
}
}
/*
* Print the content of the dataset.
*/
static int
2024-04-24 15:00:37 +08:00
ccdataset_vrfy(hsize_t start[], hsize_t count[], hsize_t stride[], hsize_t block[], DATATYPE *dataset,
DATATYPE *original, int mem_selection)
2022-05-14 03:31:31 +08:00
{
2024-04-24 15:00:37 +08:00
hsize_t i, j, k1, k2, k = 0;
int vrfyerrs;
DATATYPE *dataptr, *oriptr;
2022-05-14 03:31:31 +08:00
/* print it if VERBOSE_MED */
if (VERBOSE_MED) {
2024-04-24 15:00:37 +08:00
HDprintf("dataset_vrfy dumping:::\n");
HDprintf("start(%lu, %lu), count(%lu, %lu), stride(%lu, %lu), block(%lu, %lu)\n",
(unsigned long)start[0], (unsigned long)start[1], (unsigned long)count[0],
(unsigned long)count[1], (unsigned long)stride[0], (unsigned long)stride[1],
(unsigned long)block[0], (unsigned long)block[1]);
HDprintf("original values:\n");
ccdataset_print(start, block, original);
HDprintf("compared values:\n");
ccdataset_print(start, block, dataset);
2022-05-14 03:31:31 +08:00
}
vrfyerrs = 0;
2024-04-24 15:00:37 +08:00
for (k1 = 0; k1 < count[0]; k1++) {
for (i = 0; i < block[0]; i++) {
for (k2 = 0; k2 < count[1]; k2++) {
for (j = 0; j < block[1]; j++) {
2022-05-14 03:31:31 +08:00
if (ALL != mem_selection) {
2024-04-24 15:00:37 +08:00
dataptr = dataset + ((start[0] + k1 * stride[0] + i) * space_dim2 + start[1] +
k2 * stride[1] + j);
oriptr = original + ((start[0] + k1 * stride[0] + i) * space_dim2 + start[1] +
k2 * stride[1] + j);
2022-05-14 03:31:31 +08:00
}
else {
dataptr = dataset + k;
2024-04-24 15:00:37 +08:00
oriptr = original + k;
2022-05-14 03:31:31 +08:00
k++;
}
2024-04-24 15:00:37 +08:00
if (*dataptr != *oriptr) {
if (vrfyerrs++ < MAX_ERR_REPORT || VERBOSE_MED) {
HDprintf("Dataset Verify failed at [%lu][%lu]: expect %d, got %d\n",
(unsigned long)i, (unsigned long)j, *(oriptr), *(dataptr));
2022-05-14 03:31:31 +08:00
}
}
}
}
}
}
if (vrfyerrs > MAX_ERR_REPORT && !VERBOSE_MED)
2024-04-24 15:00:37 +08:00
HDprintf("[more errors ...]\n");
2022-05-14 03:31:31 +08:00
if (vrfyerrs)
2024-04-24 15:00:37 +08:00
HDprintf("%d errors found in ccdataset_vrfy\n", vrfyerrs);
return (vrfyerrs);
2022-05-14 03:31:31 +08:00
}
/*
* Example of using the parallel HDF5 library to create two datasets
* in one HDF5 file with collective parallel access support.
* The Datasets are of sizes (number-of-mpi-processes x dim0) x dim1.
* Each process controls only a slab of size dim0 x dim1 within each
* dataset. [Note: not so yet. Datasets are of sizes dim0xdim1 and
* each process controls a hyperslab within.]
*/
static void
dataset_big_write(void)
{
2024-04-24 15:00:37 +08:00
hid_t xfer_plist; /* Dataset transfer properties list */
hid_t sid; /* Dataspace ID */
hid_t file_dataspace; /* File dataspace ID */
hid_t mem_dataspace; /* memory dataspace ID */
hid_t dataset;
hsize_t dims[RANK]; /* dataset dim sizes */
hsize_t start[RANK]; /* for hyperslab setting */
hsize_t count[RANK], stride[RANK]; /* for hyperslab setting */
hsize_t block[RANK]; /* for hyperslab setting */
hsize_t *coords = NULL;
herr_t ret; /* Generic return value */
hid_t fid; /* HDF5 file ID */
hid_t acc_tpl; /* File access templates */
size_t num_points;
B_DATATYPE *wdata;
2022-05-14 03:31:31 +08:00
/* allocate memory for data buffer */
2024-04-24 15:00:37 +08:00
wdata = (B_DATATYPE *)HDmalloc(bigcount * sizeof(B_DATATYPE));
VRFY_G((wdata != NULL), "wdata malloc succeeded");
2022-05-14 03:31:31 +08:00
/* setup file access template */
2024-04-24 15:00:37 +08:00
acc_tpl = H5Pcreate(H5P_FILE_ACCESS);
VRFY_G((acc_tpl >= 0), "H5P_FILE_ACCESS");
2022-05-14 03:31:31 +08:00
H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
/* create the file collectively */
fid = H5Fcreate(FILENAME[0], H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
2024-04-24 15:00:37 +08:00
VRFY_G((fid >= 0), "H5Fcreate succeeded");
2022-05-14 03:31:31 +08:00
/* Release file-access template */
ret = H5Pclose(acc_tpl);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "");
2022-05-14 03:31:31 +08:00
/* Each process takes a slabs of rows. */
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nTesting Dataset1 write by ROW\n");
/* Create a large dataset */
dims[0] = bigcount;
2024-04-24 15:00:37 +08:00
dims[1] = (hsize_t)mpi_size_g;
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
sid = H5Screate_simple(RANK, dims, NULL);
VRFY_G((sid >= 0), "H5Screate_simple succeeded");
2022-05-14 03:31:31 +08:00
dataset = H5Dcreate2(fid, DATASET1, H5T_NATIVE_LLONG, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dcreate2 succeeded");
2022-05-14 03:31:31 +08:00
H5Sclose(sid);
2024-04-24 15:00:37 +08:00
block[0] = dims[0] / (hsize_t)mpi_size_g;
block[1] = dims[1];
2022-05-14 03:31:31 +08:00
stride[0] = block[0];
stride[1] = block[1];
2024-04-24 15:00:37 +08:00
count[0] = 1;
count[1] = 1;
start[0] = (hsize_t)mpi_rank_g * block[0];
start[1] = 0;
2022-05-14 03:31:31 +08:00
/* create a file dataspace independently */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_hyperslab succeeded");
2022-05-14 03:31:31 +08:00
/* create a memory dataspace independently */
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(RANK, block, NULL);
VRFY_G((mem_dataspace >= 0), "");
2022-05-14 03:31:31 +08:00
/* fill the local slab with some trivial data */
fill_datasets(start, block, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
dataset_print(start, block, wdata);
2022-05-14 03:31:31 +08:00
}
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "H5Pcreate xfer succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pset_dxpl_mpio succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
ret = H5Dwrite(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, wdata);
VRFY_G((ret >= 0), "H5Dwrite dataset1 succeeded");
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
/* Each process takes a slabs of cols. */
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nTesting Dataset2 write by COL\n");
/* Create a large dataset */
dims[0] = bigcount;
2024-04-24 15:00:37 +08:00
dims[1] = (hsize_t)mpi_size_g;
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
sid = H5Screate_simple(RANK, dims, NULL);
VRFY_G((sid >= 0), "H5Screate_simple succeeded");
2022-05-14 03:31:31 +08:00
dataset = H5Dcreate2(fid, DATASET2, H5T_NATIVE_LLONG, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dcreate2 succeeded");
2022-05-14 03:31:31 +08:00
H5Sclose(sid);
2024-04-24 15:00:37 +08:00
block[0] = dims[0];
block[1] = dims[1] / (hsize_t)mpi_size_g;
2022-05-14 03:31:31 +08:00
stride[0] = block[0];
stride[1] = block[1];
2024-04-24 15:00:37 +08:00
count[0] = 1;
count[1] = 1;
start[0] = 0;
start[1] = (hsize_t)mpi_rank_g * block[1];
2022-05-14 03:31:31 +08:00
/* create a file dataspace independently */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_hyperslab succeeded");
2022-05-14 03:31:31 +08:00
/* create a memory dataspace independently */
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(RANK, block, NULL);
VRFY_G((mem_dataspace >= 0), "");
2022-05-14 03:31:31 +08:00
/* fill the local slab with some trivial data */
fill_datasets(start, block, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
dataset_print(start, block, wdata);
2022-05-14 03:31:31 +08:00
}
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "H5Pcreate xfer succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pset_dxpl_mpio succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
ret = H5Dwrite(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, wdata);
VRFY_G((ret >= 0), "H5Dwrite dataset1 succeeded");
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
/* ALL selection */
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nTesting Dataset3 write select ALL proc 0, NONE others\n");
/* Create a large dataset */
dims[0] = bigcount;
dims[1] = 1;
2024-04-24 15:00:37 +08:00
sid = H5Screate_simple(RANK, dims, NULL);
VRFY_G((sid >= 0), "H5Screate_simple succeeded");
2022-05-14 03:31:31 +08:00
dataset = H5Dcreate2(fid, DATASET3, H5T_NATIVE_LLONG, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dcreate2 succeeded");
2022-05-14 03:31:31 +08:00
H5Sclose(sid);
/* create a file dataspace independently */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
if (mpi_rank_g == 0) {
2022-05-14 03:31:31 +08:00
ret = H5Sselect_all(file_dataspace);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_all succeeded");
2022-05-14 03:31:31 +08:00
}
else {
ret = H5Sselect_none(file_dataspace);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_none succeeded");
2022-05-14 03:31:31 +08:00
}
/* create a memory dataspace independently */
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(RANK, dims, NULL);
VRFY_G((mem_dataspace >= 0), "");
if (mpi_rank_g != 0) {
2022-05-14 03:31:31 +08:00
ret = H5Sselect_none(mem_dataspace);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_none succeeded");
2022-05-14 03:31:31 +08:00
}
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "H5Pcreate xfer succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pset_dxpl_mpio succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
/* fill the local slab with some trivial data */
fill_datasets(start, dims, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
ret = H5Dwrite(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, wdata);
VRFY_G((ret >= 0), "H5Dwrite dataset1 succeeded");
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
/* Point selection */
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nTesting Dataset4 write point selection\n");
/* Create a large dataset */
dims[0] = bigcount;
2024-04-24 15:00:37 +08:00
dims[1] = (hsize_t)(mpi_size_g * 4);
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
sid = H5Screate_simple(RANK, dims, NULL);
VRFY_G((sid >= 0), "H5Screate_simple succeeded");
2022-05-14 03:31:31 +08:00
dataset = H5Dcreate2(fid, DATASET4, H5T_NATIVE_LLONG, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dcreate2 succeeded");
2022-05-14 03:31:31 +08:00
H5Sclose(sid);
2024-04-24 15:00:37 +08:00
block[0] = dims[0] / 2;
block[1] = 2;
stride[0] = dims[0] / 2;
2022-05-14 03:31:31 +08:00
stride[1] = 2;
2024-04-24 15:00:37 +08:00
count[0] = 1;
count[1] = 1;
start[0] = 0;
start[1] = dims[1] / (hsize_t)mpi_size_g * (hsize_t)mpi_rank_g;
2022-05-14 03:31:31 +08:00
num_points = bigcount;
2024-04-24 15:00:37 +08:00
coords = (hsize_t *)HDmalloc(num_points * RANK * sizeof(hsize_t));
VRFY_G((coords != NULL), "coords malloc succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
set_coords(start, count, stride, block, num_points, coords, IN_ORDER);
2022-05-14 03:31:31 +08:00
/* create a file dataspace */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Sselect_elements(file_dataspace, H5S_SELECT_SET, num_points, coords);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sselect_elements succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (coords)
free(coords);
2022-05-14 03:31:31 +08:00
fill_datasets(start, block, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
dataset_print(start, block, wdata);
2022-05-14 03:31:31 +08:00
}
/* create a memory dataspace */
/* Warning: H5Screate_simple requires an array of hsize_t elements
* even if we only pass only a single value. Attempting anything else
* appears to cause problems with 32 bit compilers.
*/
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(1, dims, NULL);
VRFY_G((mem_dataspace >= 0), "");
2022-05-14 03:31:31 +08:00
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "H5Pcreate xfer succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pset_dxpl_mpio succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
ret = H5Dwrite(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, wdata);
VRFY_G((ret >= 0), "H5Dwrite dataset1 succeeded");
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
HDfree(wdata);
2022-05-14 03:31:31 +08:00
H5Fclose(fid);
}
/*
* Example of using the parallel HDF5 library to read two datasets
* in one HDF5 file with collective parallel access support.
* The Datasets are of sizes (number-of-mpi-processes x dim0) x dim1.
* Each process controls only a slab of size dim0 x dim1 within each
* dataset. [Note: not so yet. Datasets are of sizes dim0xdim1 and
* each process controls a hyperslab within.]
*/
static void
dataset_big_read(void)
{
2024-04-24 15:00:37 +08:00
hid_t fid; /* HDF5 file ID */
hid_t acc_tpl; /* File access templates */
hid_t xfer_plist; /* Dataset transfer properties list */
hid_t file_dataspace; /* File dataspace ID */
hid_t mem_dataspace; /* memory dataspace ID */
hid_t dataset;
B_DATATYPE *rdata = NULL; /* data buffer */
B_DATATYPE *wdata = NULL; /* expected data buffer */
hsize_t dims[RANK]; /* dataset dim sizes */
hsize_t start[RANK]; /* for hyperslab setting */
hsize_t count[RANK], stride[RANK]; /* for hyperslab setting */
hsize_t block[RANK]; /* for hyperslab setting */
size_t num_points;
hsize_t *coords = NULL;
herr_t ret; /* Generic return value */
2022-05-14 03:31:31 +08:00
/* allocate memory for data buffer */
2024-04-24 15:00:37 +08:00
rdata = (B_DATATYPE *)HDmalloc(bigcount * sizeof(B_DATATYPE));
VRFY_G((rdata != NULL), "rdata malloc succeeded");
wdata = (B_DATATYPE *)HDmalloc(bigcount * sizeof(B_DATATYPE));
VRFY_G((wdata != NULL), "wdata malloc succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
HDmemset(rdata, 0, bigcount * sizeof(B_DATATYPE));
2022-05-14 03:31:31 +08:00
/* setup file access template */
2024-04-24 15:00:37 +08:00
acc_tpl = H5Pcreate(H5P_FILE_ACCESS);
VRFY_G((acc_tpl >= 0), "H5P_FILE_ACCESS");
2022-05-14 03:31:31 +08:00
H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
/* open the file collectively */
2024-04-24 15:00:37 +08:00
fid = H5Fopen(FILENAME[0], H5F_ACC_RDONLY, acc_tpl);
VRFY_G((fid >= 0), "H5Fopen succeeded");
2022-05-14 03:31:31 +08:00
/* Release file-access template */
ret = H5Pclose(acc_tpl);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nRead Testing Dataset1 by COL\n");
dataset = H5Dopen2(fid, DATASET1, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dopen2 succeeded");
2022-05-14 03:31:31 +08:00
dims[0] = bigcount;
2024-04-24 15:00:37 +08:00
dims[1] = (hsize_t)mpi_size_g;
2022-05-14 03:31:31 +08:00
/* Each process takes a slabs of cols. */
2024-04-24 15:00:37 +08:00
block[0] = dims[0];
block[1] = dims[1] / (hsize_t)mpi_size_g;
2022-05-14 03:31:31 +08:00
stride[0] = block[0];
stride[1] = block[1];
2024-04-24 15:00:37 +08:00
count[0] = 1;
count[1] = 1;
start[0] = 0;
start[1] = (hsize_t)mpi_rank_g * block[1];
2022-05-14 03:31:31 +08:00
/* create a file dataspace independently */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_hyperslab succeeded");
2022-05-14 03:31:31 +08:00
/* create a memory dataspace independently */
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(RANK, block, NULL);
VRFY_G((mem_dataspace >= 0), "");
2022-05-14 03:31:31 +08:00
/* fill dataset with test data */
fill_datasets(start, block, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
2022-05-14 03:31:31 +08:00
}
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pcreate xfer succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
/* read data collectively */
2024-04-24 15:00:37 +08:00
ret = H5Dread(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, rdata);
VRFY_G((ret >= 0), "H5Dread dataset1 succeeded");
2022-05-14 03:31:31 +08:00
/* verify the read data with original expected data */
ret = verify_data(start, count, stride, block, rdata, wdata);
2024-04-24 15:00:37 +08:00
if (ret) {
HDfprintf(stderr, "verify failed\n");
exit(1);
}
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nRead Testing Dataset2 by ROW\n");
2024-04-24 15:00:37 +08:00
HDmemset(rdata, 0, bigcount * sizeof(B_DATATYPE));
2022-05-14 03:31:31 +08:00
dataset = H5Dopen2(fid, DATASET2, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dopen2 succeeded");
2022-05-14 03:31:31 +08:00
dims[0] = bigcount;
2024-04-24 15:00:37 +08:00
dims[1] = (hsize_t)mpi_size_g;
2022-05-14 03:31:31 +08:00
/* Each process takes a slabs of rows. */
2024-04-24 15:00:37 +08:00
block[0] = dims[0] / (hsize_t)mpi_size_g;
block[1] = dims[1];
2022-05-14 03:31:31 +08:00
stride[0] = block[0];
stride[1] = block[1];
2024-04-24 15:00:37 +08:00
count[0] = 1;
count[1] = 1;
start[0] = (hsize_t)mpi_rank_g * block[0];
start[1] = 0;
2022-05-14 03:31:31 +08:00
/* create a file dataspace independently */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_hyperslab succeeded");
2022-05-14 03:31:31 +08:00
/* create a memory dataspace independently */
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(RANK, block, NULL);
VRFY_G((mem_dataspace >= 0), "");
2022-05-14 03:31:31 +08:00
/* fill dataset with test data */
fill_datasets(start, block, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
2022-05-14 03:31:31 +08:00
}
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pcreate xfer succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
/* read data collectively */
2024-04-24 15:00:37 +08:00
ret = H5Dread(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, rdata);
VRFY_G((ret >= 0), "H5Dread dataset2 succeeded");
2022-05-14 03:31:31 +08:00
/* verify the read data with original expected data */
ret = verify_data(start, count, stride, block, rdata, wdata);
2024-04-24 15:00:37 +08:00
if (ret) {
HDfprintf(stderr, "verify failed\n");
exit(1);
}
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nRead Testing Dataset3 read select ALL proc 0, NONE others\n");
2024-04-24 15:00:37 +08:00
HDmemset(rdata, 0, bigcount * sizeof(B_DATATYPE));
2022-05-14 03:31:31 +08:00
dataset = H5Dopen2(fid, DATASET3, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dopen2 succeeded");
2022-05-14 03:31:31 +08:00
dims[0] = bigcount;
dims[1] = 1;
/* create a file dataspace independently */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
if (mpi_rank_g == 0) {
2022-05-14 03:31:31 +08:00
ret = H5Sselect_all(file_dataspace);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_all succeeded");
2022-05-14 03:31:31 +08:00
}
else {
ret = H5Sselect_none(file_dataspace);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_none succeeded");
2022-05-14 03:31:31 +08:00
}
/* create a memory dataspace independently */
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(RANK, dims, NULL);
VRFY_G((mem_dataspace >= 0), "");
if (mpi_rank_g != 0) {
2022-05-14 03:31:31 +08:00
ret = H5Sselect_none(mem_dataspace);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sset_none succeeded");
2022-05-14 03:31:31 +08:00
}
/* fill dataset with test data */
fill_datasets(start, dims, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
2022-05-14 03:31:31 +08:00
}
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pcreate xfer succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
/* read data collectively */
2024-04-24 15:00:37 +08:00
ret = H5Dread(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, rdata);
VRFY_G((ret >= 0), "H5Dread dataset3 succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0) {
2022-05-14 03:31:31 +08:00
/* verify the read data with original expected data */
ret = verify_data(start, count, stride, block, rdata, wdata);
2024-04-24 15:00:37 +08:00
if (ret) {
HDfprintf(stderr, "verify failed\n");
exit(1);
}
2022-05-14 03:31:31 +08:00
}
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDprintf("\nRead Testing Dataset4 with Point selection\n");
dataset = H5Dopen2(fid, DATASET4, H5P_DEFAULT);
2024-04-24 15:00:37 +08:00
VRFY_G((dataset >= 0), "H5Dopen2 succeeded");
2022-05-14 03:31:31 +08:00
dims[0] = bigcount;
2024-04-24 15:00:37 +08:00
dims[1] = (hsize_t)(mpi_size_g * 4);
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
block[0] = dims[0] / 2;
block[1] = 2;
stride[0] = dims[0] / 2;
2022-05-14 03:31:31 +08:00
stride[1] = 2;
2024-04-24 15:00:37 +08:00
count[0] = 1;
count[1] = 1;
start[0] = 0;
start[1] = dims[1] / (hsize_t)mpi_size_g * (hsize_t)mpi_rank_g;
2022-05-14 03:31:31 +08:00
fill_datasets(start, block, wdata);
MESG("data_array initialized");
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED) {
MESG("data_array created");
dataset_print(start, block, wdata);
2022-05-14 03:31:31 +08:00
}
num_points = bigcount;
2024-04-24 15:00:37 +08:00
coords = (hsize_t *)HDmalloc(num_points * RANK * sizeof(hsize_t));
VRFY_G((coords != NULL), "coords malloc succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
set_coords(start, count, stride, block, num_points, coords, IN_ORDER);
2022-05-14 03:31:31 +08:00
/* create a file dataspace */
2024-04-24 15:00:37 +08:00
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "H5Dget_space succeeded");
2022-05-14 03:31:31 +08:00
ret = H5Sselect_elements(file_dataspace, H5S_SELECT_SET, num_points, coords);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Sselect_elements succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (coords)
HDfree(coords);
2022-05-14 03:31:31 +08:00
/* create a memory dataspace */
/* Warning: H5Screate_simple requires an array of hsize_t elements
* even if we only pass only a single value. Attempting anything else
* appears to cause problems with 32 bit compilers.
*/
2024-04-24 15:00:37 +08:00
mem_dataspace = H5Screate_simple(1, dims, NULL);
VRFY_G((mem_dataspace >= 0), "");
2022-05-14 03:31:31 +08:00
/* set up the collective transfer properties list */
2024-04-24 15:00:37 +08:00
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "");
2022-05-14 03:31:31 +08:00
ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Pcreate xfer succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((ret >= 0), "set independent IO collectively succeeded");
2022-05-14 03:31:31 +08:00
}
/* read data collectively */
2024-04-24 15:00:37 +08:00
ret = H5Dread(dataset, H5T_NATIVE_LLONG, mem_dataspace, file_dataspace, xfer_plist, rdata);
VRFY_G((ret >= 0), "H5Dread dataset1 succeeded");
2022-05-14 03:31:31 +08:00
ret = verify_data(start, count, stride, block, rdata, wdata);
2024-04-24 15:00:37 +08:00
if (ret) {
HDfprintf(stderr, "verify failed\n");
exit(1);
}
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
H5Sclose(file_dataspace);
H5Sclose(mem_dataspace);
H5Pclose(xfer_plist);
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
HDfree(wdata);
HDfree(rdata);
2022-05-14 03:31:31 +08:00
wdata = NULL;
rdata = NULL;
/* We never wrote Dataset5 in the write section, so we can't
* expect to read it...
*/
file_dataspace = -1;
2024-04-24 15:00:37 +08:00
mem_dataspace = -1;
xfer_plist = -1;
dataset = -1;
2022-05-14 03:31:31 +08:00
/* release all temporary handles. */
2024-04-24 15:00:37 +08:00
if (file_dataspace != -1)
H5Sclose(file_dataspace);
if (mem_dataspace != -1)
H5Sclose(mem_dataspace);
if (xfer_plist != -1)
H5Pclose(xfer_plist);
2022-05-14 03:31:31 +08:00
if (dataset != -1) {
ret = H5Dclose(dataset);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "H5Dclose1 succeeded");
2022-05-14 03:31:31 +08:00
}
H5Fclose(fid);
/* release data buffers */
2024-04-24 15:00:37 +08:00
if (rdata)
HDfree(rdata);
if (wdata)
HDfree(wdata);
2022-05-14 03:31:31 +08:00
} /* dataset_large_readAll */
/*
* Create the appropriate File access property list
*/
hid_t
create_faccess_plist(MPI_Comm comm, MPI_Info info, int l_facc_type)
{
2024-04-24 15:00:37 +08:00
hid_t ret_pl = -1;
herr_t ret; /* generic return value */
int mpi_rank; /* mpi variables */
2022-05-14 03:31:31 +08:00
/* need the rank for error checking macros */
MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
2024-04-24 15:00:37 +08:00
ret_pl = H5Pcreate(H5P_FILE_ACCESS);
VRFY_G((ret_pl >= 0), "H5P_FILE_ACCESS");
2022-05-14 03:31:31 +08:00
if (l_facc_type == FACC_DEFAULT)
2024-04-24 15:00:37 +08:00
return (ret_pl);
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (l_facc_type == FACC_MPIO) {
/* set Parallel access with communicator */
ret = H5Pset_fapl_mpio(ret_pl, comm, info);
VRFY_G((ret >= 0), "");
2022-05-14 03:31:31 +08:00
ret = H5Pset_all_coll_metadata_ops(ret_pl, TRUE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "");
2022-05-14 03:31:31 +08:00
ret = H5Pset_coll_metadata_write(ret_pl, TRUE);
2024-04-24 15:00:37 +08:00
VRFY_G((ret >= 0), "");
return (ret_pl);
2022-05-14 03:31:31 +08:00
}
2024-04-24 15:00:37 +08:00
if (l_facc_type == (FACC_MPIO | FACC_SPLIT)) {
hid_t mpio_pl;
mpio_pl = H5Pcreate(H5P_FILE_ACCESS);
VRFY_G((mpio_pl >= 0), "");
/* set Parallel access with communicator */
ret = H5Pset_fapl_mpio(mpio_pl, comm, info);
VRFY_G((ret >= 0), "");
/* setup file access template */
ret_pl = H5Pcreate(H5P_FILE_ACCESS);
VRFY_G((ret_pl >= 0), "");
/* set Parallel access with communicator */
ret = H5Pset_fapl_split(ret_pl, ".meta", mpio_pl, ".raw", mpio_pl);
VRFY_G((ret >= 0), "H5Pset_fapl_split succeeded");
H5Pclose(mpio_pl);
return (ret_pl);
2022-05-14 03:31:31 +08:00
}
/* unknown file access types */
return (ret_pl);
}
/*-------------------------------------------------------------------------
2024-04-24 15:00:37 +08:00
* Function: coll_chunk1
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Purpose: Wrapper to test the collective chunk IO for regular JOINT
2022-05-14 03:31:31 +08:00
selection with a single chunk
*
2024-04-24 15:00:37 +08:00
* Return: Success: 0
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Failure: -1
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Programmer: Unknown
* July 12th, 2004
2022-05-14 03:31:31 +08:00
*
*-------------------------------------------------------------------------
*/
/* ------------------------------------------------------------------------
2024-04-24 15:00:37 +08:00
* Descriptions for the selection: One big singular selection inside one chunk
2022-05-14 03:31:31 +08:00
* Two dimensions,
*
* dim1 = space_dim1(5760)*mpi_size
* dim2 = space_dim2(3)
* chunk_dim1 = dim1
* chunk_dim2 = dim2
* block = 1 for all dimensions
* stride = 1 for all dimensions
* count0 = space_dim1(5760)
* count1 = space_dim2(3)
* start0 = mpi_rank*space_dim1
* start1 = 0
* ------------------------------------------------------------------------
*/
void
coll_chunk1(void)
{
const char *filename = FILENAME[0];
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
HDprintf("coll_chunk1\n");
2022-05-14 03:31:31 +08:00
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, HYPER, HYPER, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, HYPER, POINT, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, POINT, ALL, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, POINT, POINT, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, POINT, HYPER, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, POINT, ALL, IN_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, POINT, POINT, IN_ORDER);
coll_chunktest(filename, 1, BYROW_CONT, API_NONE, POINT, HYPER, IN_ORDER);
}
/*-------------------------------------------------------------------------
2024-04-24 15:00:37 +08:00
* Function: coll_chunk2
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Purpose: Wrapper to test the collective chunk IO for regular DISJOINT
2022-05-14 03:31:31 +08:00
selection with a single chunk
*
2024-04-24 15:00:37 +08:00
* Return: Success: 0
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Failure: -1
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Programmer: Unknown
* July 12th, 2004
2022-05-14 03:31:31 +08:00
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
2024-04-24 15:00:37 +08:00
/* ------------------------------------------------------------------------
2022-05-14 03:31:31 +08:00
* Descriptions for the selection: many disjoint selections inside one chunk
* Two dimensions,
*
* dim1 = space_dim1*mpi_size(5760)
* dim2 = space_dim2(3)
* chunk_dim1 = dim1
* chunk_dim2 = dim2
* block = 1 for all dimensions
* stride = 3 for all dimensions
* count0 = space_dim1/stride0(5760/3)
* count1 = space_dim2/stride(3/3 = 1)
* start0 = mpi_rank*space_dim1
* start1 = 0
*
* ------------------------------------------------------------------------
*/
void
coll_chunk2(void)
{
const char *filename = FILENAME[0];
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
HDprintf("coll_chunk2\n");
2022-05-14 03:31:31 +08:00
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, HYPER, HYPER, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, HYPER, POINT, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, POINT, ALL, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, POINT, POINT, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, POINT, HYPER, OUT_OF_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, POINT, ALL, IN_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, POINT, POINT, IN_ORDER);
coll_chunktest(filename, 1, BYROW_DISCONT, API_NONE, POINT, HYPER, IN_ORDER);
}
/*-------------------------------------------------------------------------
2024-04-24 15:00:37 +08:00
* Function: coll_chunk3
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Purpose: Wrapper to test the collective chunk IO for regular JOINT
2022-05-14 03:31:31 +08:00
selection with at least number of 2*mpi_size chunks
*
2024-04-24 15:00:37 +08:00
* Return: Success: 0
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Failure: -1
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Programmer: Unknown
* July 12th, 2004
2022-05-14 03:31:31 +08:00
*
*-------------------------------------------------------------------------
*/
/* ------------------------------------------------------------------------
2024-04-24 15:00:37 +08:00
* Descriptions for the selection: one singular selection across many chunks
2022-05-14 03:31:31 +08:00
* Two dimensions, Num of chunks = 2* mpi_size
*
* dim1 = space_dim1*mpi_size
* dim2 = space_dim2(3)
* chunk_dim1 = space_dim1
* chunk_dim2 = dim2/2
* block = 1 for all dimensions
* stride = 1 for all dimensions
* count0 = space_dim1
* count1 = space_dim2(3)
* start0 = mpi_rank*space_dim1
* start1 = 0
*
* ------------------------------------------------------------------------
*/
void
coll_chunk3(void)
{
const char *filename = FILENAME[0];
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
HDprintf("coll_chunk3\n");
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, HYPER, HYPER, OUT_OF_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, HYPER, POINT, OUT_OF_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, POINT, ALL, OUT_OF_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, POINT, POINT, OUT_OF_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, POINT, HYPER, OUT_OF_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, POINT, ALL, IN_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, POINT, POINT, IN_ORDER);
coll_chunktest(filename, mpi_size_g, BYROW_CONT, API_NONE, POINT, HYPER, IN_ORDER);
2022-05-14 03:31:31 +08:00
}
//-------------------------------------------------------------------------
// Borrowed/Modified (slightly) from t_coll_chunk.c
/*-------------------------------------------------------------------------
2024-04-24 15:00:37 +08:00
* Function: coll_chunktest
2022-05-14 03:31:31 +08:00
*
* Purpose: The real testing routine for regular selection of collective
chunking storage
testing both write and read,
2024-04-24 15:00:37 +08:00
If anything fails, it may be read or write. There is no
separation test between read and write.
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Return: Success: 0
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Failure: -1
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Programmer: Unknown
* July 12th, 2004
2022-05-14 03:31:31 +08:00
*
*-------------------------------------------------------------------------
*/
static void
2024-04-24 15:00:37 +08:00
coll_chunktest(const char *filename, int chunk_factor, int select_factor, int api_option, int file_selection,
int mem_selection, int mode)
2022-05-14 03:31:31 +08:00
{
2024-04-24 15:00:37 +08:00
hid_t file, dataset, file_dataspace, mem_dataspace;
hid_t acc_plist, xfer_plist, crp_plist;
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
hsize_t dims[RANK], chunk_dims[RANK];
int *data_array1 = NULL;
int *data_origin1 = NULL;
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
hsize_t start[RANK], count[RANK], stride[RANK], block[RANK];
2022-05-14 03:31:31 +08:00
#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
2024-04-24 15:00:37 +08:00
unsigned prop_value;
2022-05-14 03:31:31 +08:00
#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */
2024-04-24 15:00:37 +08:00
herr_t status;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Info info = MPI_INFO_NULL;
size_t num_points; /* for point selection */
hsize_t *coords = NULL; /* for point selection */
/* Create the data space */
acc_plist = create_faccess_plist(comm, info, facc_type);
VRFY_G((acc_plist >= 0), "");
file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, acc_plist);
VRFY_G((file >= 0), "H5Fcreate succeeded");
status = H5Pclose(acc_plist);
VRFY_G((status >= 0), "");
/* setup dimensionality object */
dims[0] = space_dim1 * (hsize_t)mpi_size_g;
dims[1] = space_dim2;
/* allocate memory for data buffer */
data_array1 = (int *)HDmalloc(dims[0] * dims[1] * sizeof(int));
VRFY_G((data_array1 != NULL), "data_array1 malloc succeeded");
/* set up dimensions of the slab this process accesses */
ccslab_set(mpi_rank_g, mpi_size_g, start, count, stride, block, select_factor);
/* set up the coords array selection */
num_points = block[0] * block[1] * count[0] * count[1];
coords = (hsize_t *)HDmalloc(num_points * RANK * sizeof(hsize_t));
VRFY_G((coords != NULL), "coords malloc succeeded");
point_set(start, count, stride, block, num_points, coords, mode);
/* Warning: H5Screate_simple requires an array of hsize_t elements
* even if we only pass only a single value. Attempting anything else
* appears to cause problems with 32 bit compilers.
*/
file_dataspace = H5Screate_simple(2, dims, NULL);
VRFY_G((file_dataspace >= 0), "file dataspace created succeeded");
if (ALL != mem_selection) {
mem_dataspace = H5Screate_simple(2, dims, NULL);
VRFY_G((mem_dataspace >= 0), "mem dataspace created succeeded");
}
else {
/* Putting the warning about H5Screate_simple (above) into practice... */
hsize_t dsdims[1] = {num_points};
mem_dataspace = H5Screate_simple(1, dsdims, NULL);
VRFY_G((mem_dataspace >= 0), "mem_dataspace create succeeded");
}
crp_plist = H5Pcreate(H5P_DATASET_CREATE);
VRFY_G((crp_plist >= 0), "");
/* Set up chunk information. */
chunk_dims[0] = dims[0] / (hsize_t)chunk_factor;
/* to decrease the testing time, maintain bigger chunk size */
(chunk_factor == 1) ? (chunk_dims[1] = space_dim2) : (chunk_dims[1] = space_dim2 / 2);
status = H5Pset_chunk(crp_plist, 2, chunk_dims);
VRFY_G((status >= 0), "chunk creation property list succeeded");
dataset = H5Dcreate2(file, DSET_COLLECTIVE_CHUNK_NAME, H5T_NATIVE_INT, file_dataspace, H5P_DEFAULT,
crp_plist, H5P_DEFAULT);
VRFY_G((dataset >= 0), "dataset created succeeded");
status = H5Pclose(crp_plist);
VRFY_G((status >= 0), "");
/*put some trivial data in the data array */
ccdataset_fill(start, stride, count, block, data_array1, mem_selection);
MESG("data_array initialized");
switch (file_selection) {
case HYPER:
status = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
VRFY_G((status >= 0), "hyperslab selection succeeded");
break;
case POINT:
if (num_points) {
status = H5Sselect_elements(file_dataspace, H5S_SELECT_SET, num_points, coords);
VRFY_G((status >= 0), "Element selection succeeded");
}
else {
status = H5Sselect_none(file_dataspace);
VRFY_G((status >= 0), "none selection succeeded");
}
break;
case ALL:
status = H5Sselect_all(file_dataspace);
VRFY_G((status >= 0), "H5Sselect_all succeeded");
break;
}
switch (mem_selection) {
case HYPER:
status = H5Sselect_hyperslab(mem_dataspace, H5S_SELECT_SET, start, stride, count, block);
VRFY_G((status >= 0), "hyperslab selection succeeded");
break;
case POINT:
if (num_points) {
status = H5Sselect_elements(mem_dataspace, H5S_SELECT_SET, num_points, coords);
VRFY_G((status >= 0), "Element selection succeeded");
}
else {
status = H5Sselect_none(mem_dataspace);
VRFY_G((status >= 0), "none selection succeeded");
}
break;
case ALL:
status = H5Sselect_all(mem_dataspace);
VRFY_G((status >= 0), "H5Sselect_all succeeded");
break;
}
/* set up the collective transfer property list */
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "");
status = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
VRFY_G((status >= 0), "MPIO collective transfer property succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
status = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((status >= 0), "set independent IO collectively succeeded");
}
switch (api_option) {
case API_LINK_HARD:
status = H5Pset_dxpl_mpio_chunk_opt(xfer_plist, H5FD_MPIO_CHUNK_ONE_IO);
VRFY_G((status >= 0), "collective chunk optimization succeeded");
break;
case API_MULTI_HARD:
status = H5Pset_dxpl_mpio_chunk_opt(xfer_plist, H5FD_MPIO_CHUNK_MULTI_IO);
VRFY_G((status >= 0), "collective chunk optimization succeeded ");
break;
case API_LINK_TRUE:
status = H5Pset_dxpl_mpio_chunk_opt_num(xfer_plist, 2);
VRFY_G((status >= 0), "collective chunk optimization set chunk number succeeded");
break;
case API_LINK_FALSE:
status = H5Pset_dxpl_mpio_chunk_opt_num(xfer_plist, 6);
VRFY_G((status >= 0), "collective chunk optimization set chunk number succeeded");
break;
case API_MULTI_COLL:
status = H5Pset_dxpl_mpio_chunk_opt_num(xfer_plist, 8); /* make sure it is using multi-chunk IO */
VRFY_G((status >= 0), "collective chunk optimization set chunk number succeeded");
status = H5Pset_dxpl_mpio_chunk_opt_ratio(xfer_plist, 50);
VRFY_G((status >= 0), "collective chunk optimization set chunk ratio succeeded");
break;
case API_MULTI_IND:
status = H5Pset_dxpl_mpio_chunk_opt_num(xfer_plist, 8); /* make sure it is using multi-chunk IO */
VRFY_G((status >= 0), "collective chunk optimization set chunk number succeeded");
status = H5Pset_dxpl_mpio_chunk_opt_ratio(xfer_plist, 100);
VRFY_G((status >= 0), "collective chunk optimization set chunk ratio succeeded");
break;
default:;
}
2022-05-14 03:31:31 +08:00
#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
2024-04-24 15:00:37 +08:00
if (facc_type == FACC_MPIO) {
switch (api_option) {
2022-05-14 03:31:31 +08:00
case API_LINK_HARD:
2024-04-24 15:00:37 +08:00
prop_value = H5D_XFER_COLL_CHUNK_DEF;
status = H5Pinsert2(xfer_plist, H5D_XFER_COLL_CHUNK_LINK_HARD_NAME, H5D_XFER_COLL_CHUNK_SIZE,
&prop_value, NULL, NULL, NULL, NULL, NULL, NULL);
VRFY_G((status >= 0), "testing property list inserted succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_MULTI_HARD:
2024-04-24 15:00:37 +08:00
prop_value = H5D_XFER_COLL_CHUNK_DEF;
status = H5Pinsert2(xfer_plist, H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME, H5D_XFER_COLL_CHUNK_SIZE,
&prop_value, NULL, NULL, NULL, NULL, NULL, NULL);
VRFY_G((status >= 0), "testing property list inserted succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_LINK_TRUE:
2024-04-24 15:00:37 +08:00
prop_value = H5D_XFER_COLL_CHUNK_DEF;
status =
H5Pinsert2(xfer_plist, H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME, H5D_XFER_COLL_CHUNK_SIZE,
&prop_value, NULL, NULL, NULL, NULL, NULL, NULL);
VRFY_G((status >= 0), "testing property list inserted succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_LINK_FALSE:
2024-04-24 15:00:37 +08:00
prop_value = H5D_XFER_COLL_CHUNK_DEF;
status =
H5Pinsert2(xfer_plist, H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME, H5D_XFER_COLL_CHUNK_SIZE,
&prop_value, NULL, NULL, NULL, NULL, NULL, NULL);
VRFY_G((status >= 0), "testing property list inserted succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_MULTI_COLL:
2024-04-24 15:00:37 +08:00
prop_value = H5D_XFER_COLL_CHUNK_DEF;
status =
H5Pinsert2(xfer_plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME,
H5D_XFER_COLL_CHUNK_SIZE, &prop_value, NULL, NULL, NULL, NULL, NULL, NULL);
VRFY_G((status >= 0), "testing property list inserted succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_MULTI_IND:
2024-04-24 15:00:37 +08:00
prop_value = H5D_XFER_COLL_CHUNK_DEF;
status =
H5Pinsert2(xfer_plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME, H5D_XFER_COLL_CHUNK_SIZE,
&prop_value, NULL, NULL, NULL, NULL, NULL, NULL);
VRFY_G((status >= 0), "testing property list inserted succeeded");
break;
default:;
}
}
2022-05-14 03:31:31 +08:00
#endif
2024-04-24 15:00:37 +08:00
/* write data collectively */
status = H5Dwrite(dataset, H5T_NATIVE_INT, mem_dataspace, file_dataspace, xfer_plist, data_array1);
VRFY_G((status >= 0), "dataset write succeeded");
2022-05-14 03:31:31 +08:00
#ifdef H5_HAVE_INSTRUMENTED_LIBRARY
2024-04-24 15:00:37 +08:00
if (facc_type == FACC_MPIO) {
switch (api_option) {
2022-05-14 03:31:31 +08:00
case API_LINK_HARD:
2024-04-24 15:00:37 +08:00
status = H5Pget(xfer_plist, H5D_XFER_COLL_CHUNK_LINK_HARD_NAME, &prop_value);
VRFY_G((status >= 0), "testing property list get succeeded");
VRFY_G((prop_value == 0), "API to set LINK COLLECTIVE IO directly succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_MULTI_HARD:
2024-04-24 15:00:37 +08:00
status = H5Pget(xfer_plist, H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME, &prop_value);
VRFY_G((status >= 0), "testing property list get succeeded");
VRFY_G((prop_value == 0), "API to set MULTI-CHUNK COLLECTIVE IO optimization succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_LINK_TRUE:
2024-04-24 15:00:37 +08:00
status = H5Pget(xfer_plist, H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME, &prop_value);
VRFY_G((status >= 0), "testing property list get succeeded");
VRFY_G((prop_value == 0), "API to set LINK COLLECTIVE IO succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_LINK_FALSE:
2024-04-24 15:00:37 +08:00
status = H5Pget(xfer_plist, H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME, &prop_value);
VRFY_G((status >= 0), "testing property list get succeeded");
VRFY_G((prop_value == 0), "API to set LINK IO transferring to multi-chunk IO succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_MULTI_COLL:
2024-04-24 15:00:37 +08:00
status = H5Pget(xfer_plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME, &prop_value);
VRFY_G((status >= 0), "testing property list get succeeded");
VRFY_G((prop_value == 0), "API to set MULTI-CHUNK COLLECTIVE IO with optimization succeeded");
break;
2022-05-14 03:31:31 +08:00
case API_MULTI_IND:
2024-04-24 15:00:37 +08:00
status = H5Pget(xfer_plist, H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME, &prop_value);
VRFY_G((status >= 0), "testing property list get succeeded");
VRFY_G((prop_value == 0),
"API to set MULTI-CHUNK IO transferring to independent IO succeeded");
break;
default:;
}
}
2022-05-14 03:31:31 +08:00
#endif
2024-04-24 15:00:37 +08:00
status = H5Dclose(dataset);
VRFY_G((status >= 0), "");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
status = H5Pclose(xfer_plist);
VRFY_G((status >= 0), "property list closed");
status = H5Sclose(file_dataspace);
VRFY_G((status >= 0), "");
status = H5Sclose(mem_dataspace);
VRFY_G((status >= 0), "");
status = H5Fclose(file);
VRFY_G((status >= 0), "");
if (data_array1)
HDfree(data_array1);
/* Use collective read to verify the correctness of collective write. */
/* allocate memory for data buffer */
data_array1 = (int *)HDmalloc(dims[0] * dims[1] * sizeof(int));
VRFY_G((data_array1 != NULL), "data_array1 malloc succeeded");
/* allocate memory for data buffer */
data_origin1 = (int *)HDmalloc(dims[0] * dims[1] * sizeof(int));
VRFY_G((data_origin1 != NULL), "data_origin1 malloc succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
acc_plist = create_faccess_plist(comm, info, facc_type);
VRFY_G((acc_plist >= 0), "MPIO creation property list succeeded");
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
file = H5Fopen(FILENAME[0], H5F_ACC_RDONLY, acc_plist);
VRFY_G((file >= 0), "H5Fcreate succeeded");
status = H5Pclose(acc_plist);
VRFY_G((status >= 0), "");
/* open the collective dataset*/
dataset = H5Dopen2(file, DSET_COLLECTIVE_CHUNK_NAME, H5P_DEFAULT);
VRFY_G((dataset >= 0), "");
/* set up dimensions of the slab this process accesses */
ccslab_set(mpi_rank_g, mpi_size_g, start, count, stride, block, select_factor);
/* obtain the file and mem dataspace*/
file_dataspace = H5Dget_space(dataset);
VRFY_G((file_dataspace >= 0), "");
if (ALL != mem_selection) {
mem_dataspace = H5Dget_space(dataset);
VRFY_G((mem_dataspace >= 0), "");
}
else {
/* Warning: H5Screate_simple requires an array of hsize_t elements
* even if we only pass only a single value. Attempting anything else
* appears to cause problems with 32 bit compilers.
*/
hsize_t dsdims[1] = {num_points};
mem_dataspace = H5Screate_simple(1, dsdims, NULL);
VRFY_G((mem_dataspace >= 0), "mem_dataspace create succeeded");
}
switch (file_selection) {
case HYPER:
status = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
VRFY_G((status >= 0), "hyperslab selection succeeded");
break;
case POINT:
if (num_points) {
status = H5Sselect_elements(file_dataspace, H5S_SELECT_SET, num_points, coords);
VRFY_G((status >= 0), "Element selection succeeded");
}
else {
status = H5Sselect_none(file_dataspace);
VRFY_G((status >= 0), "none selection succeeded");
}
break;
case ALL:
status = H5Sselect_all(file_dataspace);
VRFY_G((status >= 0), "H5Sselect_all succeeded");
break;
}
switch (mem_selection) {
case HYPER:
status = H5Sselect_hyperslab(mem_dataspace, H5S_SELECT_SET, start, stride, count, block);
VRFY_G((status >= 0), "hyperslab selection succeeded");
break;
case POINT:
if (num_points) {
status = H5Sselect_elements(mem_dataspace, H5S_SELECT_SET, num_points, coords);
VRFY_G((status >= 0), "Element selection succeeded");
}
else {
status = H5Sselect_none(mem_dataspace);
VRFY_G((status >= 0), "none selection succeeded");
}
break;
case ALL:
status = H5Sselect_all(mem_dataspace);
VRFY_G((status >= 0), "H5Sselect_all succeeded");
break;
}
/* fill dataset with test data */
ccdataset_fill(start, stride, count, block, data_origin1, mem_selection);
xfer_plist = H5Pcreate(H5P_DATASET_XFER);
VRFY_G((xfer_plist >= 0), "");
status = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
VRFY_G((status >= 0), "MPIO collective transfer property succeeded");
if (dxfer_coll_type == DXFER_INDEPENDENT_IO) {
status = H5Pset_dxpl_mpio_collective_opt(xfer_plist, H5FD_MPIO_INDIVIDUAL_IO);
VRFY_G((status >= 0), "set independent IO collectively succeeded");
}
status = H5Dread(dataset, H5T_NATIVE_INT, mem_dataspace, file_dataspace, xfer_plist, data_array1);
VRFY_G((status >= 0), "dataset read succeeded");
/* verify the read data with original expected data */
status = ccdataset_vrfy(start, count, stride, block, data_array1, data_origin1, mem_selection);
if (status)
nerrors++;
status = H5Pclose(xfer_plist);
VRFY_G((status >= 0), "property list closed");
/* close dataset collectively */
status = H5Dclose(dataset);
VRFY_G((status >= 0), "H5Dclose");
/* release all IDs created */
status = H5Sclose(file_dataspace);
VRFY_G((status >= 0), "H5Sclose");
status = H5Sclose(mem_dataspace);
VRFY_G((status >= 0), "H5Sclose");
/* close the file collectively */
status = H5Fclose(file);
VRFY_G((status >= 0), "H5Fclose");
/* release data buffers */
if (coords)
HDfree(coords);
if (data_array1)
HDfree(data_array1);
if (data_origin1)
HDfree(data_origin1);
}
2022-05-14 03:31:31 +08:00
/*****************************************************************************
*
2024-04-24 15:00:37 +08:00
* Function: do_express_test()
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Purpose: Do an MPI_Allreduce to obtain the maximum value returned
* by GetTestExpress() across all processes. Return this
* value.
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Envirmoment variables can be different across different
* processes. This function ensures that all processes agree
* on whether to do an express test.
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Return: Success: Maximum of the values returned by
* GetTestExpress() across all processes.
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Failure: -1
2022-05-14 03:31:31 +08:00
*
2024-04-24 15:00:37 +08:00
* Programmer: JRM -- 4/25/06
2022-05-14 03:31:31 +08:00
*
*****************************************************************************/
static int
do_express_test(int world_mpi_rank)
{
int express_test;
int max_express_test;
int result;
express_test = GetTestExpress();
2024-04-24 15:00:37 +08:00
result =
MPI_Allreduce((void *)&express_test, (void *)&max_express_test, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (result != MPI_SUCCESS) {
2022-05-14 03:31:31 +08:00
nerrors++;
max_express_test = -1;
2024-04-24 15:00:37 +08:00
if (VERBOSE_MED && (world_mpi_rank == 0)) {
HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n", world_mpi_rank, FUNC);
2022-05-14 03:31:31 +08:00
}
}
2024-04-24 15:00:37 +08:00
return (max_express_test);
2022-05-14 03:31:31 +08:00
} /* do_express_test() */
2024-04-24 15:00:37 +08:00
int
main(int argc, char **argv)
2022-05-14 03:31:31 +08:00
{
2024-04-24 15:00:37 +08:00
int ExpressMode = 0;
hsize_t newsize = 1048576;
2022-05-14 03:31:31 +08:00
/* Set the bigio processing limit to be 'newsize' bytes */
2024-04-24 15:00:37 +08:00
hsize_t oldsize = H5_mpi_set_bigio_count(newsize);
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
/* Having set the bigio handling to a size that is manageable,
2022-05-14 03:31:31 +08:00
* we'll set our 'bigcount' variable to be 2X that limit so
* that we try to ensure that our bigio handling is actually
2024-04-24 15:00:37 +08:00
* invoked and tested.
2022-05-14 03:31:31 +08:00
*/
2024-04-24 15:00:37 +08:00
if (newsize != oldsize)
bigcount = newsize * 2;
2022-05-14 03:31:31 +08:00
MPI_Init(&argc, &argv);
2024-04-24 15:00:37 +08:00
MPI_Comm_size(MPI_COMM_WORLD, &mpi_size_g);
MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank_g);
2022-05-14 03:31:31 +08:00
/* Attempt to turn off atexit post processing so that in case errors
* happen during the test and the process is aborted, it will not get
* hang in the atexit post processing in which it may try to make MPI
* calls. By then, MPI calls may not work.
*/
2024-04-24 15:00:37 +08:00
if (H5dont_atexit() < 0)
HDprintf("Failed to turn off atexit processing. Continue.\n");
2022-05-14 03:31:31 +08:00
/* set alarm. */
2024-04-24 15:00:37 +08:00
TestAlarmOn();
ExpressMode = do_express_test(mpi_rank_g);
2022-05-14 03:31:31 +08:00
dataset_big_write();
MPI_Barrier(MPI_COMM_WORLD);
dataset_big_read();
MPI_Barrier(MPI_COMM_WORLD);
if (ExpressMode > 0) {
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
HDprintf("***Express test mode on. Several tests are skipped\n");
2022-05-14 03:31:31 +08:00
}
else {
2024-04-24 15:00:37 +08:00
coll_chunk1();
MPI_Barrier(MPI_COMM_WORLD);
coll_chunk2();
MPI_Barrier(MPI_COMM_WORLD);
coll_chunk3();
2022-05-14 03:31:31 +08:00
}
/* turn off alarm */
2024-04-24 15:00:37 +08:00
TestAlarmOff();
2022-05-14 03:31:31 +08:00
2024-04-24 15:00:37 +08:00
if (mpi_rank_g == 0)
2022-05-14 03:31:31 +08:00
HDremove(FILENAME[0]);
/* close HDF5 library */
H5close();
MPI_Finalize();
return 0;
}