Hi,
We are trying to use parallel HDF5 to write data to a file.
The execution seems to be going well, but the H5Fclose hangs the execution.
I.e the following message is printed:
"All parallel hdf5 content written, closing file...\n"
but the
"Done"
never gets to be printed.
Any suggestion or amendment to the following code?
Thanks
Bruno Magalhaes, Blue Brain Project, EPFL, Lausanne CH [+41 2169 31805]
//------------------- BEGINNING OF SOURCE CODE --------------------
#include <stdio.h>
#include <cstdlib>
#include <mpi.h>
#define H5_USE_16_API 1
#include "hdf5.h"
#define NUMVALUES 19
using namespace std;
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
int mpiRank=-1, mpiSize=-1;
MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank);
MPI_Comm_size(MPI_COMM_WORLD, &mpiSize);
if (mpiRank==0) printf("Writing header...\n");
int numOfNeurons = 100;
hid_t file_id = 0;
herr_t status;
hsize_t dims[2];
char filename[1024] = "/bgscratch/bmagalha/delete.h5";
//Set up file access property list with parallel I/O access
hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_mpio(plist_id, MPI_COMM_WORLD, MPI_INFO_NULL) ;
//Create a new file collectively and release property list identifier.
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);
H5Pclose(plist_id);
if (mpiRank == 0) {
//Initialize the attribute data.
int info_version_data = 3;
int info_numberOfFiles_data = 1;
hsize_t info_dims = 1;
hid_t filespace_h = H5Screate_simple(0,&info_dims, NULL);
hid_t dset_id_info = H5Dcreate(file_id, "/info", H5T_NATIVE_FLOAT, filespace_h, H5P_DEFAULT);
//Create the data space for the attribute.
hid_t info_dataspace_id = H5Screate_simple(1, &info_dims, NULL);
//Create a dataset attribute and count of files.
hid_t info_version_id = H5Acreate(dset_id_info, "version", H5T_STD_I32BE, info_dataspace_id, H5P_DEFAULT);
hid_t info_numberOfFiles_id = H5Acreate(dset_id_info, "numberOfFiles", H5T_STD_I32BE, info_dataspace_id, H5P_DEFAULT);
//Write the attribute and files Countdata.
H5Awrite(info_version_id, H5T_NATIVE_INT, &info_version_data);
H5Awrite(info_numberOfFiles_id, H5T_NATIVE_INT, &info_numberOfFiles_data);
//Create property list for individual dataset write (default).
plist_id = H5Pcreate(H5P_DATASET_XFER);
H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_INDEPENDENT);
//to write data collectively, use:
// plist_id = H5Pcreate(H5P_DATASET_XFER);
// H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
//Close the attributes, dataspace and dataset.
status = H5Aclose(info_version_id);
status = H5Aclose(info_numberOfFiles_id);
status = H5Dclose(dset_id_info);
status = H5Sclose(info_dataspace_id);
}
if (mpiRank==0) printf("Writing body...\n");
char name[512];
float *allSynapsesSendBuff;
for (int i = 0; i < numOfNeurons; i++) {
dims[0] = 2000; // Create the dataset.
allSynapsesSendBuff = new float[NUMVALUES * dims[0]];
dims[1] = NUMVALUES;
hid_t filespace = H5Screate_simple(2, dims, NULL);
sprintf(name, "a.%d.%d", mpiRank, i);
//Create dataset with default properties and close filespace
hid_t dset_id = H5Dcreate(file_id, name, H5T_NATIVE_FLOAT, filespace, H5P_DEFAULT);
//Create property list for independent dataset write
hid_t plist_id = H5Pcreate(H5P_DATASET_XFER);
H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_INDEPENDENT);
H5Dwrite(dset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, plist_id, allSynapsesSendBuff);
// End access to the dataset and release resources used by it.
status = H5Dclose(dset_id);
status = H5Sclose(filespace);
status = H5Pclose(plist_id);
}
MPI_Barrier(MPI_COMM_WORLD);
if (mpiRank==0) printf("All parallel hdf5 content written, closing file...\n");
fflush(stdout);
// Terminates access to the file.
status = H5Fclose(file_id);
MPI_Barrier(MPI_COMM_WORLD);
if (mpiRank==0) printf("Done.\n");
MPI_Finalize();
return 0;
}
//------------------- END OF SOURCE CODE --------------------