Parallel HDF5: Creating/Accessing Datasets by MPI rank

Hello,

I am quite new to HDF5 so this might probably be a beginners question:
I want to create and access different datasets depending on my mpi rank.
Accessing parts of one dataset via hyperslabs works perfect, but the following doesn't work:
I want to write the name of each processor in a different dataset which is named 'attr_processor_[mpi_rank]'. However, it will only create one dataset named 'attr_processor_0'.

     plist_id = H5Pcreate(H5P_FILE_ACCESS);
     H5Pset_fapl_mpio(plist_id, mpi_comm, MPI_INFO_NULL);

     file_id = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT,
       plist_id);
     H5Pclose(plist_id);

... // some hsize_t initializations and so on

     hid_t procs_dataset_id;
     hid_t proc_name_t;
// datatype for processor name
     proc_name_t = H5Tcopy(H5T_C_S1);
     H5Tset_size(proc_name_t, MPI_MAX_PROCESSOR_NAME + 1);

     plist_id = H5Pcreate(H5P_DATASET_XFER);
     H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_INDEPENDENT);

// create dataset
     char *proc_dataset_name = new char[256];
     hid_t proc_dataset_space = H5Screate(H5S_SCALAR);

     memset(proc_dataset_name, 0, 256);
     sprintf(proc_dataset_name, "%s_%d", "attr_processor", mpi_rank);
     procs_dataset_id = H5Dcreate(group_id, proc_dataset_name, proc_name_t, proc_dataset_space, H5P_DEFAULT);

// retrieve mpi processor name
     char *proc_name = new char[MPI_MAX_PROCESSOR_NAME + 1];
     int result_len = 0;
     MPI_Get_processor_name(proc_name, &result_len);
     proc_name[result_len] = 0;

// write processor name
     H5Dwrite(procs_dataset_id, proc_name_t, proc_dataset_space, proc_dataset_space, plist_id, proc_name);

// cleanup
     H5Dclose(procs_dataset_id);
     H5Sclose(proc_dataset_space);
     H5Pclose(plist_id);
     delete[] proc_dataset_name;
     delete[] proc_name;

... // writing the actual data

Thanks for replying.
Felix

Felix,

H5Dcreate is a collective call. ALL processes have to participate in creation of each dataset. After datasets are created, data can be written independently by each process to a corresponding dataset.

Elena

···

On Feb 27, 2010, at 4:00 PM, Felix Schmitt wrote:

Hello,

I am quite new to HDF5 so this might probably be a beginners question:
I want to create and access different datasets depending on my mpi rank.
Accessing parts of one dataset via hyperslabs works perfect, but the following doesn't work:
I want to write the name of each processor in a different dataset which is named 'attr_processor_[mpi_rank]'. However, it will only create one dataset named 'attr_processor_0'.

   plist_id = H5Pcreate(H5P_FILE_ACCESS);
   H5Pset_fapl_mpio(plist_id, mpi_comm, MPI_INFO_NULL);

   file_id = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT,
     plist_id);
   H5Pclose(plist_id);

... // some hsize_t initializations and so on

   hid_t procs_dataset_id;
   hid_t proc_name_t;
// datatype for processor name
   proc_name_t = H5Tcopy(H5T_C_S1);
   H5Tset_size(proc_name_t, MPI_MAX_PROCESSOR_NAME + 1);

   plist_id = H5Pcreate(H5P_DATASET_XFER);
   H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_INDEPENDENT);

// create dataset
   char *proc_dataset_name = new char[256];
   hid_t proc_dataset_space = H5Screate(H5S_SCALAR);

   memset(proc_dataset_name, 0, 256);
   sprintf(proc_dataset_name, "%s_%d", "attr_processor", mpi_rank);
   procs_dataset_id = H5Dcreate(group_id, proc_dataset_name, proc_name_t, proc_dataset_space, H5P_DEFAULT);

// retrieve mpi processor name
   char *proc_name = new char[MPI_MAX_PROCESSOR_NAME + 1];
   int result_len = 0;
   MPI_Get_processor_name(proc_name, &result_len);
   proc_name[result_len] = 0;

// write processor name
   H5Dwrite(procs_dataset_id, proc_name_t, proc_dataset_space, proc_dataset_space, plist_id, proc_name);

// cleanup
   H5Dclose(procs_dataset_id);
   H5Sclose(proc_dataset_space);
   H5Pclose(plist_id);
   delete[] proc_dataset_name;
   delete[] proc_name;

... // writing the actual data

Thanks for replying.
Felix

_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org