我正在尝试通过多个进程将其写入一个文件。通常,我会将所有进程写入同一数据集。 HDF5文档提供了有关如何执行此操作的非常好的示例(例如,在教程here中)。我想考虑更普遍的情况,即流程可以具有不同的数据集。在以下示例中,我尝试在单个HDF5文件(基于Hyperslab_by_row.c)中为每个MPI等级创建一个数据集:
// file name
char H5FILE_NAME[512];
sprintf( H5FILE_NAME, "SDS.h5", mpi_rank );
// dataset name
char DATASETNAME[512];
sprintf( DATASETNAME, "IntArray-%d", mpi_rank );
// use mpi-io driver for single file
plist_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_mpio(plist_id, comm, info);
// create file
file_id = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);
H5Pclose(plist_id);
// define dataset dimension
filespace = H5Screate_simple(RANK, dimsf, NULL);
// create dataset
dset_id = H5Dcreate(file_id, DATASETNAME, H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
// write dataset
status = H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
我希望看到一个类似的结构:
HDF5 "SDS.h5" {
GROUP "/" {
DATASET "IntArray-0" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 5, 6, 7, 8, 9,
(2,0): 10, 11, 12, 13, 14,
(3,0): 15, 16, 17, 18, 19,
(4,0): 20, 21, 22, 23, 24,
(5,0): 25, 26, 27, 28, 29,
(6,0): 30, 31, 32, 33, 34,
(7,0): 35, 36, 37, 38, 39
}
}
...
...
...
DATASET "IntArray-7" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 5, 6, 7, 8, 9,
(2,0): 10, 11, 12, 13, 14,
(3,0): 15, 16, 17, 18, 19,
(4,0): 20, 21, 22, 23, 24,
(5,0): 25, 26, 27, 28, 29,
(6,0): 30, 31, 32, 33, 34,
(7,0): 35, 36, 37, 38, 39
}
}
}
}
但是我得到了:
HDF5 "SDS.h5" {
GROUP "/" {
DATASET "IntArray-3" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 5, 6, 7, 8, 9,
(2,0): 10, 11, 12, 13, 14,
(3,0): 15, 16, 17, 18, 19,
(4,0): 20, 21, 22, 23, 24,
(5,0): 25, 26, 27, 28, 29,
(6,0): 30, 31, 32, 33, 34,
(7,0): 35, 36, 37, 38, 39
}
}
}
}
数据集名称因执行而异,有时有时IntArray-0
有时有时IntArray-3
,依此类推。因此,似乎其中一个进程获胜,并被选为设置数据集的名称。有人可以提示我我做错了什么吗?