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
likeを返すi.j0k
ので、各エントリがファイル内のどこで終わるかを確認できます (たとえばi = 3
、j = 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 ファイルの間に「マッピング」を作成する方法が必要です。どうやってやるの?