5

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

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

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

你同意这MPI_Alltoallv比10和;慢吗?如果是,为什么和多少?MPI_SendMPI_Recv

4

1 回答 1

7

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

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

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

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

于 2012-11-22T05:43:58.807 回答