Performance MPI Alltoallv或更好的个人发送和接收?(表演)

Performance MPI Alltoallv或更好的个人发送和接收?(表演),performance,parallel-processing,mpi,Performance,Parallel Processing,Mpi,我有许多进程(大约100到1000个),每个进程都必须向其他进程中的一些进程(比如说大约10个进程)发送一些数据。(通常,但并非总是必要的,如果A发送给B,B也发送给A。)每个进程都知道它必须从哪个进程接收多少数据 因此,我可以使用MPI\u Alltoallv,其中许多或大部分消息长度为零。 然而,我听说由于性能原因,使用多个MPI\u send和MPI\u recv通信比使用全球MPI\u allv更好。 我不明白的是:如果一系列发送和接收呼叫比一个Alltoallv呼叫更有效,为什么All

我有许多进程(大约100到1000个),每个进程都必须向其他进程中的一些进程(比如说大约10个进程)发送一些数据。(通常,但并非总是必要的,如果A发送给B,B也发送给A。)每个进程都知道它必须从哪个进程接收多少数据

因此,我可以使用MPI\u Alltoallv,其中许多或大部分消息长度为零。 然而,我听说由于性能原因,使用多个
MPI\u send
MPI\u recv
通信比使用全球
MPI\u allv
更好。 我不明白的是:如果一系列发送和接收呼叫比一个Alltoallv呼叫更有效,为什么Alltoallv不是只是实现为一系列发送和接收?

对我(和其他人?)来说,只使用一个全球电话会方便得多。此外,我可能还需要担心的是,使用多个Send和Recv时不会出现死锁情况(可以通过一些奇偶策略或更复杂的策略进行修复?或者使用缓冲Send/Recv?)


您是否同意,
MPI_Alltoallv
比10
MPI_Send
MPI_Recv
慢一点是必要的;如果是的话,为什么以及多少?

通常与集体的默认建议相反:尽可能使用集体操作,而不是自己编写代码。MPI库关于通信模式的信息越多,就有越多的机会在内部进行优化

除非有特殊的硬件支持,否则集体呼叫实际上是在发送和接收方面在内部实现的。但实际的通信模式可能不仅仅是一系列的发送和接收。例如,使用一棵树来广播一段数据可能比让同一个等级的数据发送给一组接收器要快。在优化集体沟通方面做了大量工作,很难做得更好

话虽如此,
MPI\u Alltoallv
有些不同。在MPI级别,很难针对所有不规则的通信场景进行优化,因此可以想象一些自定义通信代码可以做得更好。例如,
MPI_Alltoallv
的一个实现可能正在同步:它可能要求所有进程“签入”,即使它们必须发送0长度的消息。我认为这样的实现是不可能的,但是


因此,真正的答案是“视情况而定”。如果
MPI\u Alltoallv
的库实现与任务不匹配,则自定义通信代码将获胜。但是,在走这条路之前,请检查MPI-3邻居集合是否适合解决您的问题。

同步
MPI\u ALLTOALLV
实现比您想象的要普遍得多。Open MPI在1.6.1中将其默认算法切换为synchornising成对实现。@hristoilev有趣。同步Alltoallv的好处是什么?我实际上正在从事一个相关的项目,所以了解更多信息会很有趣。有没有其他阅读指南?我相信在大多数现实生活中,如果进程的数量不足以划分问题的大小,那么
MPI\u ALLTOALLV
将被用作
MPI\u ALLTOALL
的替代品。然后,您不需要处理空消息,正确安排的同步通信可以更好地利用网络设备(例如,在胖树IB网络上),尤其是在进程数量巨大的情况下。您的问题的答案将取决于alltoallv的实现,您为指导集体而提供的任何调整参数,以及您的通信模式的规模和稀疏性。与许多优化类型的问题一样,在您的特定情况下,唯一可能知道哪种方法更好的方法是尝试两种方法。但首先我要让它和alltoallv一起工作,看看这是否真的是代码中的一个重要瓶颈。