在共享的HDF5文件中为每个进程创建不同的数据集

时间:2018-11-08 15:59:07

标签: hdf5 shared-file parallel-io

我正在尝试通过多个进程将其写入一个文件。通常,我会将所有进程写入同一数据集。 HDF5文档提供了有关如何执行此操作的非常好的示例(例如,在教程here中)。我想考虑更普遍的情况,即流程可以具有不同的数据集。在以下示例中,我尝试在单个HDF5文件(基于Hyperslab_by_row.c)中为每个MPI等级创建一个数据集:

// 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 个答案:

没有答案