使用OpenMPI的OpenMP

时间:2012-05-29 02:43:52

标签: openmp openmpi

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

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

由于与A共享节点的其他进程位于MPI_Recv,我可以利用该节点的所有资源处理进程A,还是{{1}阻止那个?

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

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

2 个答案:

答案 0 :(得分:3)

是的,可以使用OpenMP来并行化与OpenMPI本地结合的某个进程,该OpenMPI负责工作分配(即跨节点的OpenMPI和节点内的OpenMP)。这个概念被称为使用OpenMP和MPI的混合编程(如果你谷歌这样你将找到几个有用的链接)。

MPI_SendMPI_Recv来电是阻止来电(有关详细信息,您可以查看此帖子In message passing (MPI) mpi_send and recv “what waits”),这意味着如果您的节点在MPI_Recv被屏蔽,他们会被阻止等待数据。但是,您可以使用相应的异步方法MPI_IsendMPI_Irecv来提高性能,代价是必须处理竞争条件和仔细的缓冲区处理。可以找到示例和更多信息here

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

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

答案 1 :(得分:0)

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