MPI Alltoallv 还是更好的个人发送和接收? (表现)

Posted

技术标签:

【中文标题】MPI Alltoallv 还是更好的个人发送和接收? (表现)【英文标题】:MPI Alltoallv or better individual Send and Recv? (Performance) 【发布时间】:2012-11-10 10:39:43 【问题描述】:

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

所以我可以只使用MPI_Alltoallv,许多或大部分消息长度为零。 但是,我听说出于性能的原因,使用几个MPI_sendMPI_recv通信更好 /strong> 全局 MPI_Alltoallv。 我不明白的是:如果一系列发送和接收调用比一个 Alltoallv 调用更有效,为什么 Alltoallv 不只是实现为 一系列发送和接收?

我(和其他人?)只使用一个全局调用会更方便。此外,我可能不得不担心不会遇到多个 Send 和 Recv 的死锁情况(可以通过一些奇偶策略或更复杂的策略来修复?或者通过使用缓冲的发送/接收?)。

您是否同意MPI_Alltoallv 比 10 MPI_SendMPI_Recv 是必要的;如果是,为什么和多少?

【问题讨论】:

您的问题的答案将取决于 alltoallv 实施、您为指导集体提供的任何调整参数,以及您的通信模式的规模和稀疏性。与许多优化类型的问题一样,在您的特定情况下,唯一可能知道哪个更好的方法是尝试两种方式。但首先我只是让它与 alltoallv 一起工作,看看这是否真的是你代码中的一个重要瓶颈。 【参考方案1】:

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

除非有特殊的硬件支持,否则集合调用实际上是在内部根据发送和接收实现的。但实际的通信模式可能不仅仅是一系列的发送和接收。例如,使用树来广播一段数据可能比让相同等级的数据发送到一堆接收器更快。优化集体沟通需要做很多工作,而且很难做得更好。

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

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

【讨论】:

同步MPI_ALLTOALLV 实现比您想象的要普遍得多。 Open MPI 在 1.6.1 中将其默认算法切换为同步成对实现。 @HristoIliev 有趣。同步 Alltoallv 有什么好处?我实际上正在从事一个相关项目,因此了解更多信息会很有趣。任何指向额外阅读的指针? 我相信在大多数实际情况下,MPI_ALLTOALLV 被用作MPI_ALLTOALL 的替代品,以防进程数不划分问题大小。这样你就不用处理空消息了,正确安排的同步通信可以更好地利用网络设备(例如在胖树 IB 网络上),尤其是在进程数量很大的情况下。

以上是关于MPI Alltoallv 还是更好的个人发送和接收? (表现)的主要内容,如果未能解决你的问题,请参考以下文章

MPI_Recv:接收的大小与发送的大小不同

MPI 发送带有字节数组和整数的结构

共享内存的 MPI 与 openMP

消息中间件之JMS实践(ActiveMQ)

探测 MPI_Bcast 或 MPI_Send

如何获得 ActiveMQ - 单个发送方和接收方的 FIFO 要求?