如何使用带有并行 hdf5 的 mpi 将三角形(upper/lower)矩阵存储到单个文件中?

How to store triangular (upper/lower) matrix into a single file using mpi with parallel hdf5?

我有一个 100 万 x 100 万双浮点矩阵 (table) 想要存储在单个 hdf5 文件中,矩阵本身是对称的因此只需要 lower/upper 三角形,写入这个矩阵的代码是一个mpi代码,所以每个mpi进程都会写入矩阵的一部分(一个块或一个三角形),三角矩阵如下所示,每个p[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 内存 space 可以是上述三角形的扁平化版本到存储整个半矩阵的一维向量,因此 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 文件中正确位置的正确方法吗?看来我需要使用 hyperslab,但是我需要将每个进程的 hyperslab 分成具有开始、步幅、偏移量的多个部分,以便来自每个进程的数据可以在最终的 1D 向量中找到它的位置,但是那种类型的hdf5 实际支持的操作?

希望我已经把我的问题说清楚了,感谢您的任何建议!

对于 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);

然后在写入过程中设置 "parallel write"

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);

所有其他操作在并行或串行中都是相同的。

要select一个hyperslab使用方法:H5Sselect_hyperslab,这个方法允许你在内存空间和文件空间中select一个hyperslab,它允许你指定偏移量, 步幅, 计数。

该文档是 HDF5 并行的噩梦,但可能非常有用:-)。 此文件是如何使用 hdf5-parallel 的一个很好的示例。

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