0

序言

我有一个非常大的数组(一个暗淡),需要求解进化方程(类波方程)。我需要在这个数组的每个值处计算积分,存储得到的积分数组并再次对这个数组应用积分,等等(简单来说,我在值的网格上应用积分,存储这个新的网格,应用积分再次等等)。

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

当前问题

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

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

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

问题

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

重要的一点是,如果不完成整个一维数组,我就无法进入下一步。

我的想法:

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

提前致谢!!!

4

1 回答 1

2

我会看这里这里。第二个站点的 FORTRAN 代码在这里,C 代码在这里

这个想法是您不要将整个阵列提供给每个处理器。你只给每个处理器它工作的部分,处理器之间有一些重叠,这样它们就可以处理它们的相互边界。

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

于 2013-05-07T20:58:04.257 回答