Параллельное создание расширяемых наборов данных HDF5

Я пытаюсь параллельно записывать данные в файл hdf5. Каждый узел имеет свой собственный набор данных, который уникален (хотя и имеет одинаковый размер). Я пытаюсь записать их все в отдельные наборы данных в файле hdf5 параллельно. Загвоздка в том, что позже я, возможно, захочу перезаписать их наборами данных другого размера (другой размер по сравнению с исходным набором наборов данных - набор данных на каждом процессоре имеет одинаковый размер). Кто-нибудь знает как это сделать?

(код полагается на boost и Eigen)

У меня есть код для первого открытия файла:

boost::mpi::environment env(argc, argv);

// set up the info for HDF5 and MPI
MPI_Comm comm = MPI_COMM_SELF;
MPI_Info info = MPI_INFO_NULL;

// Set up file access property list with parallel I/O access
hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_mpio(plist_id, comm, info);

// declare the file ID
std::string filename = "test.h5";

// create a file
hid_t fileID = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);

// close the property list
H5Pclose(plist_id);

Затем, чтобы создать и записать наборы данных:

// get the mpi communicator
unique_ptr<mpi::communicator> worldComm(new mpi::communicator);

const Eigen::VectorXd dataset = worldComm->rank() * Eigen::VectorXd::Ones(3);
const std::string name = "/vector";

// sleep for a bit so the processors are doing something different
sleep(worldComm->rank() * 2.0);

// the sizes of the data set
const hsize_t dimsf[2] = {(hsize_t)dataset.rows(), (hsize_t)dataset.cols()};

// set the maximum size of the data set to be unlimited
const hsize_t maxdim[2] = {H5S_UNLIMITED, H5S_UNLIMITED};

// the size of each chuck --- is there a better way to choose these numbers!?!?!?!
const hsize_t chunkDims[2] = {2, 5};

// create the dataspace for the dataset.
const hid_t filespace = H5Screate_simple(2, dimsf, maxdim); 
assert(filespace>0);

// modify data set creation properties --- enable chunking
const hid_t prop = H5Pcreate(H5P_DATASET_CREATE);
const hid_t status = H5Pset_chunk(prop, 2, chunkDims);

// create the dataset with default properties for each process
std::vector<hid_t> dsetVec(worldComm->size());
for( int i=0; i<worldComm->size(); ++i ) {
  const std::string datasetName = name+"_rank_"+std::to_string(i);

  dsetVec[i] = H5Dcreate2(fileID, datasetName.c_str(), H5T_NATIVE_DOUBLE, filespace, H5P_DEFAULT, prop, H5P_DEFAULT);
}

// Create property list for dataset write.
const hid_t plistID = H5Pcreate(H5P_DATASET_XFER);

// write the data to file
H5Dwrite(dsetVec[worldComm->rank()], H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, plistID, dataset.data());

// close the filespace 
H5Sclose(filespace);

// close the datasets
for( int i=0; i<worldComm->size(); ++i ) {
  H5Dclose(dsetVec[i]);
}

// close the file
H5Fclose(fileID);

Я ожидаю четыре набора данных с именем "/ vector_rank_i" (i = 0,1,2,3), каждый размером 3 и оцененным [0, 0, 0], [1, 1, 1], [2, 2, 2 ] и [3, 3, 3] соответственно. Однако создается четыре набора данных с именем "/ vector_rank_i" (i = 0,1,2,3), каждый размером 3, но значениями являются [0, 0, 0], [0, 0, 0], [ 0, 0, 0] и [3, 3, 3].

Этот точный код отлично работает, если я не использую разбиение на части. Однако, поскольку мне нужно будет расширить наборы данных позже, это далеко не идеально. Кто-нибудь знает хорошую работу?


person ad_ad    schedule 19.08.2015    source источник


Ответы (1)


Прежде чем отвечать на ваш конкретный код, я хотел бы узнать больше о том, почему вы решили декомпозировать проблему «по одному набору данных на процесс». Это похоже на беспорядок, если вы когда-нибудь собираетесь масштабироваться за пределы горстки процессов.

Вы выполняете параллельный ввод-вывод для набора данных и включили MPI-IO, но не коллективный доступ. это вряд ли даст ужасно хорошую производительность в масштабе.

Тусклый цвет ваших кусков мне кажется очень маленьким. Я бы сделал их больше, но "насколько большой" зависит от множества факторов. Что ж, посмотрим, как обстоят дела с этими значениями. Может, будет не так уж плохо, если включить коллективный ввод-вывод?

Если оставить в стороне эти первые впечатления, возможно, вы просто хотите поэкспериментировать с HDF5. Я не знаю, почему при включении фрагментации некоторые наборы данных становятся пустыми ... если только вы не пишете в NFS. Если вы пишете в NFS, что ж, удачи, дружище, но это безнадежно.

person Rob Latham    schedule 20.08.2015