如何在没有MPI-IO的情况下实现令人尴尬的并行任务(FOR循环)?

如何在没有MPI-IO的情况下实现令人尴尬的并行任务(FOR循环)?,mpi,openmp,communication,Mpi,Openmp,Communication,序言: 我有一个非常大的数组(一维),需要解演化方程(波动方程)。我需要在这个数组的每个值上计算积分,存储得到的积分数组,然后再次对这个数组进行积分,依此类推(简单地说,我对值网格进行积分,存储这个新网格,再次进行积分,依此类推) 我使用MPI-IO在所有节点上分布:我的光盘上有一个共享的.dat文件,每个MPI副本读取该文件(作为集成源),执行集成并再次写入该共享文件。这个过程一次又一次地重复。它很好用。最耗时的部分是集成,文件读写可以忽略不计 当前问题: 现在我转到了1024(16x64 C

序言

我有一个非常大的数组(一维),需要解演化方程(波动方程)。我需要在这个数组的每个值上计算积分,存储得到的积分数组,然后再次对这个数组进行积分,依此类推(简单地说,我对值网格进行积分,存储这个新网格,再次进行积分,依此类推)

我使用MPI-IO在所有节点上分布:我的光盘上有一个共享的.dat文件,每个MPI副本读取该文件(作为集成源),执行集成并再次写入该共享文件。这个过程一次又一次地重复。它很好用。最耗时的部分是集成,文件读写可以忽略不计

当前问题

现在我转到了1024(16x64 CPU)HPC集群,现在我面临一个相反的问题:读写过程的计算时间可以忽略不计

我试图减少一些MPI进程:我只使用16个MPI进程(分布在节点上)+64个线程和OpenMP来并行化每个节点内的计算

同样,阅读和写作过程是现在最耗时的部分

问题

我应该如何修改我的程序,以便以最小的损失利用1024个CPU的全部功能

重要的一点是,如果不完成整个1D阵列,我无法进入下一步

我的想法:

我可以要求我的秩=0(主秩)将整个数组发送到所有节点(MPI_Bcast),而不是读写。因此,不是每个节点都进行I/O,而是只有一个节点进行I/O

提前感谢

我会仔细看看。第二个站点的FORTRAN代码为,C代码为

这样做的目的是不将整个阵列分配给每个处理器。您只为每个处理器提供其工作的部分,处理器之间有一些重叠,以便它们可以处理彼此的边界


此外,每隔一段时间将计算保存到磁盘也是正确的。我喜欢MPI-IO。我认为这是一条路要走。但是链接中的代码将允许您无需每次阅读即可运行。而且,以我的钱来说,每次都把数据写出来是过分的。

我想我是糊涂了。听起来您在每次迭代后都在读写磁盘,并使用读写操作在所有处理器之间共享数据。但是有了MPI(即使没有MPI-IO),也有更有效的方法来共享数据。我误解你的问题了吗?是的,你是对的!在一次迭代(完整矩阵)完成后,我将(每个MPI进程写入其部分)写入光盘(共享文件)。第二次迭代从读取该文件开始(该矩阵用作下一次迭代的初始值),存储在阵列中(每个MPI过程都是本地的),执行计算并再次写入磁盘上的(新)共享文件。等等。使用读/写光盘还有另一个原因(由于某些原因,计算可能会意外终止),我更喜欢存储最后一步(在进化中)在我的本地磁盘上,以便从这一步重新开始进化。在所有MPI进程中共享数据阵列的最佳方式是什么?请参阅我答案中的链接。还有一件事:我非常高兴您能够在不了解MPI的一些更基本的内容的情况下处理MPI-IO。我想说你可能会做好这个项目。