我正在尝试将 3D 数据(内存布局是单个数组;数据维度是NX * NY * NZ
)存储到 HDF5 文件中。由于我想将大数组分配给多个 MPI 进程,每个进程都有一个大小为myNX * NY * NZ
where的数据数组myNX = NX / mpi_size
。
我希望它始终将相同的数据写入 HDF5 文件内的相同“坐标”,因此写入/读取 HDF5 文件的进程数不会对数据布局产生任何影响。这是我的一些代码:
设置本地数组:
data = new double[myNX * NY * NZ];
for(unsigned int k = 0; k < NZ; k++) {
for(unsigned int j = 0; j < NY; j++) {
for(unsigned int i = 0; i < myNX; i++) {
data[k * (myNX * NY) + j * myNX + i] = getValue(i, j, k);
}
}
}
getValue()
返回一个double
like i.j0k
,这样我就可以看到每个条目在文件中的最终位置(例如,,i = 3
将导致)。为了测试,我放了;.j = 2
k = 1
3.201
NX = 9
NY = NZ = 2
文件 hyperslab:
hid_t h5_hyperslab_file_id = H5Dget_space(h5_dataset_id);
hsize_t offset[] = {0, 0, 0};
offset[0] = getOffsetX(mpi_rank, mpi_size);
hsize_t length[] = {myNX, NY, NZ};
hsize_t stride[] = {1, 1, 1};
H5Sselect_hyperslab(h5_hyperslab_file_id, H5S_SELECT_SET, offset, stride, length, NULL);
内存超切片和文件写入:
hid_t h5_memory_dataspace_id = H5Screate_simple(3, length, length);
h5_plist_id = H5Pcreate(H5P_DATASET_XFER);
H5Pset_dxpl_mpio(h5_plist_id, H5FD_MPIO_COLLECTIVE);
H5Dwrite(h5_dataset_id, H5T_NATIVE_DOUBLE, h5_memory_dataspace_id, h5_hyperslab_file_id, h5_plist_id, data);
我弄乱了内存和文件超平板的各种设置,但找不到正确的设置。此外,关于此的文档有点模糊(或者至少我没有正确理解它:()。
提前谢谢你,
Velines
编辑:澄清:我的问题是我的数据保存在不同的位置,具体取决于写入文件的处理次数。所以我需要一种在我的数据数组和 HDF5 文件之间创建“映射”的方法。我怎样才能做到这一点?