2012-05-29 74 views
1

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

因为我想尽可能地加快这个速度现在我正在考虑使用OpenMP并行化过程A。这是否实用?

因为其它进程共享与A一个节点是在MPI_Recv,我可以利用所有的资源,从该节点到工艺A工作,或将MPI_Recv阻止?

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

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

+0

你想要这样的[OpenMPI和OpenMP示例](https://www.rc.colorado.edu/crcdocs/openmpi-openmp)吗? – bacchus

+0

@baccus - 类似的东西,但是,比方说,我有一台机器,有10个节点,每个节点有4个核心 - 在9个节点上,我想运行4个mpi进程,10日我希望只运行一个MPI进程(通过openmp生成几个进程) – mgilson

回答

3

是的,可以使用OpenMP并行化本地与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进行计算。

我希望这会有所帮助。

+0

是的,我了解阻塞和非阻塞通信的区别。我想我想知道,如果坐在阻塞通信呼叫中(通常)会消耗该内核的所有CPU资源。我想,如果我不想消耗所有的资源,我可以使用非阻塞,然后是MPI_Test /睡眠组合......但是这很快就变得比我想要的要复杂得多。 (我真的只是寻找一个快速破解,现在完成工作,而我继续努力,使其扩大规模) – mgilson

+0

我想知道你是否可以做到以下几点:我们知道'MPI_Recv()'块,直到大小消息,来源和标签匹配。因此,在调用'MPI_Recv()'之前进行一个简单的测试,比如检查消息的大小,会说我们是否应该调用它,或者如果我们可以在等待消息时帮助其他节点。例如,每秒钟检查邮件大小,如果不匹配,则可以分配资源以帮助其他节点。这只是一个想法。 – bacchus

+0

实际上,大小不必匹配,并且您正在描述MPI_Irecv()+ MPI_Test()的完美用例。但是这种方法在这里可能不会起作用。 “快速”节点不具备帮助“慢速”节点所需的信息。我的最终目标是取1个慢速节点并将其转变为多个快速节点。这很有效,但内存不能很好地扩展(慢节点需要大量的内存) - 所以我认为共享内存paradim可能会有所帮助。最终,我可以做一些事情来帮助记忆问题 - 这只是很多工作。不过谢谢。 – mgilson

0

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

+0

是的,有一个节点阻塞其他节点并不好 - 这就是我想要阻止的。最好的解决方案是并行化一个(慢速)节点正在做的工作,以便它可以像其他节点一样快速地工作......尽管如此,还是有一些问题。一个节点比另外一个需要更多的内存,所以并行化(每个进程需要使用所有的内存),使用MPI不能很好地扩展。它可能会被优化,但不是没有很多的努力 - OpenMP似乎更容易在创建更好的解决方案时产生结果。 – mgilson

+0

检查MPI库的线程兼容性。 MPI定义了四种线程支持级别,并且在配置/编译时选择了Open MPI实现了哪些级别。如果您不通过OpenMP平行区域进行通信,那么您会很安全。 –