Создание отдельных наборов данных для процесса в общем файле 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, и так далее. Таким образом, кажется, что один из процессов выигрывает и выбирается для задания имени набора данных. Может кто-нибудь подсказать мне, что я делаю не так?

0 ответов

Другие вопросы по тегам