3


3D データ (メモリ レイアウトは単一配列、データ次元はNX * NY * NZ) を HDF5 ファイルに保存しようとしています。大きな配列を複数の MPI プロセスに分散させたいので、各プロセスにはサイズmyNX * NY * NZmyNX = 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()doublelikeを返すi.j0kので、各エントリがファイル内のどこで終わるかを確認できます (たとえばi = 3j = 2は にk = 1なります3.201)。テストのために、私は入れましたNX = 9; 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);

メモリ ハイパースラブとファイル書き込み:

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 ファイルの間に「マッピング」を作成する方法が必要です。どうやってやるの?

4

0 に答える 0