【问题标题】:How to Implement embarrassingly parallel task (FOR loop) WITHOUT MPI-IO?如何在没有 MPI-IO 的情况下实现令人尴尬的并行任务(FOR 循环)?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 还有一件事:实际上,您能够在不了解 MPI 一些更基本的东西的情况下处理 MPI-IO,这给我留下了深刻的印象。我会说你可能会在这个项目上做得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2020-03-29
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多