我有许多进程(大约 100 到 1000 个),每个进程都必须将一些数据发送到其他一些进程(比如大约 10 个)。 (通常,但并非总是必要,如果 A 发送到 B,B 也会发送到 A。)每个进程都知道它必须从哪个进程接收多少数据。
所以我可以用MPI_Alltoallv
,许多或大部分消息长度为零。
不过,我听说对于表现原因better to use several MPI_send
and MPI_recv
通讯而不是全球的MPI_Alltoallv
。
我不明白的是:如果一系列发送和接收调用比一个 Alltoallv 调用更有效,why is 全部不是 just 实施为 a 一系列的发送和接收?
对于我(和其他人?)来说,仅使用一个全局调用会方便得多。另外,我可能不得不担心不会遇到多个发送和接收的死锁情况(可以通过某种奇偶策略或更复杂的策略修复?或者通过使用缓冲发送/接收?)。
你同意吗MPI_Alltoallv
是必要的slower比,比方说,10MPI_Send
and MPI_Recv
;如果是的话为什么以及多少?
通常,集体的默认建议是相反的:尽可能使用集体操作,而不是编写自己的代码。 MPI 库拥有的有关通信模式的信息越多,其内部优化的机会就越多。
除非有特殊的硬件支持,集体呼叫实际上是在发送和接收方面在内部实现的。但实际的通信模式可能不仅仅是一系列发送和接收。例如,使用树来广播一段数据可能比使用相同的等级将其发送到一堆接收器更快。优化集体沟通需要做很多工作,而且很难做得更好。
话说回来,MPI_Alltoallv
有点不同。在 MPI 级别针对所有不规则通信场景进行优化可能很困难,因此可以想象一些自定义通信代码可以做得更好。例如,一个实现MPI_Alltoallv
可能正在同步:它可能要求所有进程“签入”,即使它们必须发送 0 长度的消息。我认为这样的实现不太可能,但是这是野外的一个 http://www-01.ibm.com/support/docview.wss?uid=isg1IZ58190.
所以真正的答案是“这取决于”。如果库实现MPI_Alltoallv
与任务不匹配,自定义通信代码将获胜。但在走这条路之前,请检查 MPI-3 邻居集合是否适合您的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)