我试图将3D数据(内存布局是单个数组;数据维度为NX * NY * NZ
)存储到HDF5文件中。由于我想将大型数组分发到多个MPI进程,因此每个进程都有一个大小为myNX * NY * NZ
的数据数组,其中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
i.j0k
,因此我可以看到每个条目在文件中的最终位置(例如i = 3
,j = 2
,{{1将导致k = 1
)。为了测试,我放了3.201
; NX = 9
。
文件hyperslab:
NY = NZ = 2
内存超文本和文件编写:
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);
我弄乱了内存和文件超级板的各种设置,但无法弄清楚正确的。关于这个的文档也有点模糊(或者至少我不理解它:()。
提前谢谢你,
韦利内
编辑:澄清:我的问题是我的数据保存在不同的位置,具体取决于编写文件的处理次数。所以我需要一种方法来创建我的数据数组和HDF5文件之间的“映射”。我怎么能这样做?