Создание отдельных наборов данных для процесса в общем файле HDF5
Я пытаюсь записать в один файл с несколькими процессами. В общем, все процессы будут записываться в один и тот же набор данных. Документация HDF5 дает очень хорошие примеры того, как это сделать (например, в руководстве здесь). Я хотел бы принять во внимание более общий случай, когда процессы могут иметь различные наборы данных. В следующем примере я пытаюсь создать один набор данных на ранг MPI в одном файле HDF5 (на основе Hyperslab_by_row.c):
// file name
char H5FILE_NAME[512];
sprintf( H5FILE_NAME, "SDS.h5", mpi_rank );
// dataset name
char DATASETNAME[512];
sprintf( DATASETNAME, "IntArray-%d", mpi_rank );
// use mpi-io driver for single file
plist_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_mpio(plist_id, comm, info);
// create file
file_id = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);
H5Pclose(plist_id);
// define dataset dimension
filespace = H5Screate_simple(RANK, dimsf, NULL);
// create dataset
dset_id = H5Dcreate(file_id, DATASETNAME, H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
// write dataset
status = H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
Я хотел бы видеть структуру как:
HDF5 "SDS.h5" {
GROUP "/" {
DATASET "IntArray-0" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 5, 6, 7, 8, 9,
(2,0): 10, 11, 12, 13, 14,
(3,0): 15, 16, 17, 18, 19,
(4,0): 20, 21, 22, 23, 24,
(5,0): 25, 26, 27, 28, 29,
(6,0): 30, 31, 32, 33, 34,
(7,0): 35, 36, 37, 38, 39
}
}
...
...
...
DATASET "IntArray-7" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 5, 6, 7, 8, 9,
(2,0): 10, 11, 12, 13, 14,
(3,0): 15, 16, 17, 18, 19,
(4,0): 20, 21, 22, 23, 24,
(5,0): 25, 26, 27, 28, 29,
(6,0): 30, 31, 32, 33, 34,
(7,0): 35, 36, 37, 38, 39
}
}
}
}
Но я получаю:
HDF5 "SDS.h5" {
GROUP "/" {
DATASET "IntArray-3" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 8, 5 ) / ( 8, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 5, 6, 7, 8, 9,
(2,0): 10, 11, 12, 13, 14,
(3,0): 15, 16, 17, 18, 19,
(4,0): 20, 21, 22, 23, 24,
(5,0): 25, 26, 27, 28, 29,
(6,0): 30, 31, 32, 33, 34,
(7,0): 35, 36, 37, 38, 39
}
}
}
}
Имя набора данных варьируется от исполнения к исполнению, иногда IntArray-0
иногда IntArray-3
, и так далее. Таким образом, кажется, что один из процессов выигрывает и выбирается для задания имени набора данных. Может кто-нибудь подсказать мне, что я делаю не так?