gpt4 book ai didi

c - 如何使用 mpi 和并行 hdf5 将三角(上/下)矩阵存储到单个文件中?

转载 作者:行者123 更新时间:2023-11-30 14:43:01 41 4
gpt4 key购买 nike

我有一个 100 万 x 100 万双浮点矩阵(表),想要存储在单个 hdf5 文件中,矩阵本身是对称的,因此只需要下/上三角形,编写这个矩阵的代码是mpi代码,因此每个mpi进程都会写入矩阵的一部分(一个 block 或一个三角形),三角矩阵如下所示,每个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内存空间可以是上述三角形的扁平化版本,变成存储整个半矩阵的一维 vector ,因此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 分成多个带有开始、步长、偏移的部分,以便每个进程的数据可以在最终的一维 vector 中找到其位置,但这种类型是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);

然后在写入过程中设置“并行写入”

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

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

要选择一个hyperslab,请使用方法:H5Sselect_hyperslab,此方法允许您在内存空间和文件空间中选择一个hyperslab,它允许您指定偏移量、步幅、计数。

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

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

关于c - 如何使用 mpi 和并行 hdf5 将三角(上/下)矩阵存储到单个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54190303/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com