【发布时间】:2013-04-29 23:40:11
【问题描述】:
序言:
我有一个非常大的数组(一个暗淡),需要求解进化方程(类波方程)。我需要计算这个数组的每个值的积分,存储积分的结果数组并再次对这个数组应用积分,等等(简单来说,我在值的网格上应用积分,存储这个新的网格,应用积分以此类推)。
我使用 MPI-IO 分布在所有节点上:我的磁盘上有一个共享的 .dat 文件,每个 MPI 副本读取此文件(作为集成源),执行集成并再次写入此共享文件。这个过程一次又一次地重复。它工作正常。最耗时的部分是集成,文件读写可以忽略不计。
当前问题:
现在我搬到 1024 (16x64 CPU) HPC 集群,现在我面临一个相反的问题:计算时间对于读写过程来说是可以忽略不计的!!!
我试图减少 MPI 进程的数量:我只使用 16 个 MPI 进程(分布在节点上)+ 64 个线程和 OpenMP 来并行化每个节点内的计算。
同样,读写过程是现在最耗时的部分。
问题
我应该如何修改我的程序,以最大限度地利用 1024 个 CPU 的全部功能?
重要的一点是,如果不完成整个一维数组,我就无法进入下一步。
我的想法:
我可以要求我的 rank=0(master rank)将整个数组发送接收到所有节点(MPI_Bcast),而不是读写。因此,不是每个节点都会进行 I/O,而是只有一个节点会这样做。
提前致谢!!!
【问题讨论】:
-
我觉得我很困惑。听起来您在每次迭代后都在读取和写入磁盘,并使用读取和写入在所有处理器之间共享您的数据。但是使用 MPI(即使没有 MPI-IO)也有更有效的方法来共享数据。我误解你的问题了吗?
-
是的,你是对的!完成一次迭代(完整矩阵)后,我将(每个 MPI 过程写入其部分)写入磁盘(共享文件)。第二次迭代从读取该文件开始(该矩阵用作下一次迭代的初始值),存储在数组中(每个 MPI procs 的本地),执行计算并再次写入磁盘上的(新)共享文件。以此类推。
-
使用读/写磁盘还有另一个原因(由于某些原因,计算可能会意外终止),我更喜欢将最后一步(进化中)按顺序存储在我的本地磁盘上从这一步重新开始进化。
-
在所有 MPI proc 之间共享数据数组的最佳方式是什么?
-
查看我的答案中的链接。
标签: mpi openmp communication