1

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

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

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

使用 OpenMP 的另一个好处是内存可以共享,因为进程A需要很多时间。

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

4

2 回答 2

3

是的,可以使用 OpenMP 将某个进程与处理工作分配的 OpenMPI 结合在本地并行化(即跨节点的 OpenMPI 和节点内的 OpenMP)。这个概念被称为OpenMP 和 MPI 的混合编程(如果你用谷歌搜索,你会发现几个有用的链接)。

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

在我看来,你有两个选择:

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

我希望这有帮助。

于 2012-05-30T02:23:12.933 回答
0

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

于 2012-05-29T20:42:35.590 回答