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

时间:2013-05-06 08:39:40

标签: mpi openmp communication

序言

我有一个非常大的阵列(一个暗淡),需要解决进化方程(波状eq)。 II需要计算此数组的每个值的积分,以存储生成的积分数组并再次应用积分到此数组,依此类推(简单来说,我在值网格上应用积分,存储此新网格,应用积分再次等等。)

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

当前问题

现在我转移到 1024 (16x64 CPU)HPC群集,现在我遇到了一个相反的问题:计算时间是无法读写的过程!!!

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

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

问题

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

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

我的想法:

我可以要求我的rank = 0(主等级)发送 - 接收整个阵列到所有节点(MPI_Bcast),而不是读写。因此,I / O代替每个节点,只有一个节点会这样做。

提前致谢!!!

1 个答案:

答案 0 :(得分:2)

我会看herehere。第二个网站的FORTRAN代码为here,C代码为here

这个想法是你将整个数组交给每个处理器。您只为每个处理器提供它所处理的部分,处理器之间有一些重叠,以便它们可以处理它们的相互边界。

此外,您经常将计算保存到磁盘是正确的。我喜欢MPI-IO。我认为这是要走的路。但链接中的代码将允许您每次都无需阅读。而且,为了我的钱,每次写出数据都是过度的。