我有一个MPI应用程序,当前有一个进程(称为A
),这会导致严重的可伸缩性问题。目前,所有其他进程都在MPI_Recv
等待该进程向其发送信息。
由于我想尽可能少地加快现在的速度,我正在考虑使用OpenMP并行化进程A
。这有用吗?
由于与A
共享节点的其他进程位于MPI_Recv
,我可以利用该节点的所有资源处理进程A
,还是{{1}阻止那个?
使用OpenMP的另一个好处是可以共享内存,因为进程MPI_Recv
需要很多。
顺便说一句,如果我的处理器在A
而不是MPI_Send
等待,它会改变什么吗?
答案 0 :(得分:3)
是的,可以使用OpenMP来并行化与OpenMPI本地结合的某个进程,该OpenMPI负责工作分配(即跨节点的OpenMPI和节点内的OpenMP)。这个概念被称为使用OpenMP和MPI的混合编程(如果你谷歌这样你将找到几个有用的链接)。
MPI_Send
和MPI_Recv
来电是阻止来电(有关详细信息,您可以查看此帖子In message passing (MPI) mpi_send and recv “what waits”),这意味着如果您的节点在MPI_Recv
被屏蔽,他们会被阻止等待数据。但是,您可以使用相应的异步方法MPI_Isend和MPI_Irecv来提高性能,代价是必须处理竞争条件和仔细的缓冲区处理。可以找到示例和更多信息here。
在我看来,你有两个选择:
我希望这会有所帮助。
答案 1 :(得分:0)
使用OpenMP和MPI相对容易,如果我理解正确的话应该加快速度。但整个事情看起来像一个黑客。您是否考虑重新设计(fosters design methodology)您的计划?让一个节点阻塞所有其他节点并不是一个好的设计。