如何将3D数据并行存储在相同的坐标处?

时间:2012-05-24 13:08:13

标签: c++ c hdf5


我试图将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 = 3j = 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文件之间的“映射”。我怎么能这样做?

0 个答案:

没有答案