【问题标题】:OpenMP with OpenMPIOpenMP 与 OpenMPI
【发布时间】:2012-05-29 02:43:52
【问题描述】:

我有一个 MPI 应用程序,它当前有一个进程(称为 A),这会导致严重的可伸缩性问题。目前,所有其他进程都坐在MPI_Recv 中等待那个进程向他们发送信息。

由于我想现在尽可能地加快速度,因此我正在考虑使用 OpenMP 并行化进程 A。这实用吗?

由于与A 共享节点的其他进程位于MPI_Recv 中,我可以利用该节点的所有资源来处理进程A,还是MPI_Recv 会阻止这种情况?

使用 OpenMP 的另一个好处是内存可以共享,因为进程 A 占用大量资源。

顺便说一句,如果我的处理器在 MPI_Send 而不是 MPI_Recv 中等待,它会改变什么吗?

【问题讨论】:

  • 你想要这样的OpenMPI and OpenMP Example吗?
  • @baccus -- 类似的东西,但是,比如说(例如)我有一台机器有 10 个节点,每个节点有 4 个核心 -- 在 9 个节点上,我想运行 4 个 mpi 进程, 10 号,我只想运行一个 MPI 进程(通过 openmp 产生更多)

标签: openmp openmpi


【解决方案1】:

是的,可以使用 OpenMP 在本地并行化某个进程,并结合 OpenMPI 处理工作分配(即跨节点的 OpenMPI 和节点内的 OpenMP)。这个概念被称为使用 OpenMP 和 MPI 进行混合编程(如果您对此进行 google,您会发现一些有用的链接)。

MPI_Send 和MPI_Recv 调用是阻塞调用(详细信息可以查看In message passing (MPI) mpi_send and recv “what waits” 这个帖子),这意味着如果您的节点在MPI_Recv 中被阻塞,它们将被阻塞等待数据。但是,您可以使用各自的异步方法 MPI_Isend 和 MPI_Irecv 来提高性能,但代价是必须处理竞争条件和仔细的缓冲区处理。可以在here 找到示例和更多信息。

在我看来你有两个选择:

  1. 使用 OpenMPI 平均分配工作负载,然后使用 OpenMP 在本地并行化工作负载(如果您有多个内核和多个节点,您可以使用 OpenMP 将任务分配给每个内核;OpenMPI 通过节点分配部分工作负载然后可以利用每个节点的本地架构并使用 OpenMP);
  2. 重新编程您的程序以使用异步方法,以便在必要时让其他节点帮助节点 A 进行计算。

我希望这会有所帮助。

【讨论】:

  • 是的,我理解阻塞和非阻塞通信的区别。我想我想知道坐在阻塞通信调用中是否会(通常)消耗该内核的所有 CPU 资源。我想如果我不想消耗所有资源,我可以使用非阻塞,然后使用 MPI_Test/sleep 组合......但这很快变得比我想要的更多。 (我真的只是在寻找一种快速的技巧来完成现在的工作,同时我继续努力让它更好地扩展)
  • 我想知道您是否可以执行以下操作:我们知道 MPI_Recv() 会阻塞直到消息、源和标签的大小匹配。所以在调用MPI_Recv()之前做一个简单的测试,比如检查消息的大小,会告诉我们是否应该调用它,或者在等待消息时我们是否可以帮助其他节点。例如,每秒都会检查消息大小,如果不匹配,您可以分配资源来帮助其他节点。这只是一个想法。
  • 实际上,大小不必匹配,您正在描述 MPI_Irecv()+MPI_Test() 的完美用例。但无论如何,这种方法可能在这里行不通。 “快”节点没有帮​​助“慢”节点所需的信息。我的最终目标是采用 1 个慢速节点并将其变成多个快速节点。这行得通,但是内存不能很好地扩展(慢速节点需要大量内存)——所以我认为共享内存范式可能会有所帮助。最终,我可以做一些事情来帮助解决记忆问题——这只是很多工作。不过还是谢谢。
  • 我在阅读thisMPI_Recv()的详细解释后得到了这个想法,但是在与OpenMPI网站上的详细解释进行比较后,我同意你的看法。
  • @baccus :但是这个想法仍然是合理的——您可以 MPI_Iprobe 在特定标签上针对来自特定来源的消息进行 MPI_Iprobe,然后您还可以从那里获取消息的大小。 ..最终我只是不认为该模型将在我的应用程序中工作。 :-/
【解决方案2】:

使用 OpenMP 和 MPI 相对容易,如果我理解正确的话应该加快速度。但整个事情看起来像一个黑客。您是否考虑过重新设计(fosters design methodology)您的程序?让一个节点阻止所有其他节点不是一个好的设计。

【讨论】:

  • 是的,让一个节点阻塞其他节点并不好——这就是我想要阻止的。最好的解决方案是并行化一个(慢)节点正在执行的工作,以便它与其他节点一样快地工作......虽然有几个问题。一个节点比其他节点占用 大量 内存,因此并行化它(每个进程需要使用所有内存)使用 MPI 不能很好地扩展。它可能会被优化,但并非没有大量的努力——OpenMP 似乎更容易在开发更好的解决方案时产生结果。
  • 检查 MPI 库的线程兼容性。 MPI 定义了四个级别的线程支持,其中哪些由 Open MPI 实现,在配置/编译时选择。如果您不在 OpenMP 并行区域内部进行通信,您将是安全的。
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多