Как сохранить треугольную (верхнюю / нижнюю) матрицу в одном файле, используя mpi с параллельным hdf5? - PullRequest
0 голосов
/ 15 января 2019

У меня есть матрица с двойной плавающей запятой размером 1 млн. Х 1 млн. (Таблица), которую нужно сохранить в одном файле hdf5, сама матрица симметрична, поэтому необходим только нижний / верхний треугольник, код, который записывает эту матрицу, является MPI-код, поэтому каждый MPI-процесс будет записывать часть матрицы (блок или треугольник), треугольная матрица будет выглядеть как показано ниже, каждый p [i] представляет значение матрицы, рассчитанное процессом i:

p0 
p0 p0
p0 p0 p0
p0 p0 p0 p0
p1 p1 p1 p1 p2
p1 p1 p1 p1 p2 p2
p1 p1 p1 p1 p2 p2 p2
p1 p1 p1 p1 p2 p2 p2 p2
p3 p3 p3 p3 p4 p4 p4 p4 p5
p3 p3 p3 p3 p4 p4 p4 p4 p5 p5
p3 p3 p3 p3 p4 p4 p4 p4 p5 p5 p5
p3 p3 p3 p3 p4 p4 p4 p4 p5 p5 p5 p5

Исходя из моего нынешнего понимания, конечное пространство памяти hdf5 может быть сведенной версией вышеуказанного треугольника к одномерному вектору, в котором хранится вся полуматрица, поэтому фактические конечные данные в hdf5 могут быть:

p0 p0 p0 p0 p0 p0 p0 p0 p0 p0 p1 p1 p1 p1 p2 p1 p1 p1 p1 p2 p2 p1 p1 p1 p1 p2 p2 p2 p1 p1 p1 p1 p2 p2 p2 p2 p3 p3 p3 p3 p4 p4 p4 p4 p5 p3 p3 p3 p3 p4 p4 p4 p4 p5 p5 p3 p3 p3 p3 p4 p4 p4 p4 p5 p5 p5 p3 p3 p3 p3 p4 p4 p4 p4 p5 p5 p5 p5

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

Надеюсь, я прояснил свою проблему, и спасибо за любые предложения!

1 Ответ

0 голосов
/ 24 января 2019

С HDF5 нет реальной разницы для параллельной и последовательной записи (всего несколько флагов). 1) Вы уверены, что ваш кластер поддерживает HDF5 параллельно? (если не просто сделать это последовательно: в цикле над каждым процессом)

Если да:

Сначала вам нужно открыть файл:

plist_id = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_fapl_mpio(plist_id, comm, info);
file_id = H5Fcreate(filename_str.c_str(), H5F_ACC_EXCL, H5P_DEFAULT,plist_id);

затем во время записи вы устанавливаете «параллельную запись»

plist_id = H5Pcreate(H5P_DATASET_XFER);
H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
status = H5Dwrite(dset_id, dtype_id, memspace, filespace, plist_id, data);

Все остальные манипуляции одинаковы в параллельном или последовательном.

Чтобы выбрать гиперслаб, используйте метод: H5Sselect_hyperslab, этот метод позволяет вам выбрать гиперслаб как в memspace, так и в файловом пространстве, он позволяет вам указать смещение, шаг, количество.

Документ - кошмар для параллели HDF5, но может быть очень полезным :-). Этот файл является хорошим примером использования параллели hdf5.

https://support.hdfgroup.org/ftp/HDF5/examples/parallel/coll_test.c

...