MPI:使用阻塞发送和接收有什么好处?

ele*_*ena 2 mpi

由于 MPI 也实现了 iRecv 和 iSend,那么使用 Send 和 Recv 有什么好处,它们会阻止程序的执行从而导致性能降低?

有问题:mpi:阻塞与非阻塞

他们写

"阻塞通信在足够的时候使用,因为它更容易使用。非阻塞通信在必要时使用,例如,您可以调用 MPI_Isend(),做一些计算,然后执行 MPI_Wait()。这允许计算和通信重叠,这通常会提高性能。”

但是“足够了”和“有必要”是什么意思?

Gil*_*det 5

首先,您需要记住,正确的 MPI 应用程序MPI_Send()在发布匹配的接收之前不应期望阻塞发送(例如)返回。例如,如果两个任务需要交换数据,则不正确

MPI_Send(...);
MPI_Recv(...);
Run Code Online (Sandbox Code Playgroud)

因为它可能会陷入僵局。一个选项是手动订购通信

if (peer < me) {
    MPI_Send(...);
    MPI_Recv(...);
} else {
    MPI_Recv(...);
    MPI_Send(...);
}
Run Code Online (Sandbox Code Playgroud)

恕我直言,这使得应用程序更难编写和维护。

另一种选择是使用非阻塞通信,这样您就不必再担心死锁。

MPI_Isend(...);
MPI_Irecv(...);
MPI_Waitall(...);
Run Code Online (Sandbox Code Playgroud)

请注意,这里有一个简单的例子,它说明了一个更普遍的问题,MPI_Sendrecv()这里应该是首选。

一些 MPI 库通过一些互连实现了一个进度线程。(请记住,大多数人不会,但希望会改变)。在这种情况下,可以使用非阻塞通信来重叠计算和通信,从而使应用程序更加高效。

MPI_Irecv(...);
// perform some computation that do no require the data to be received
MPI_Wait(...);
Run Code Online (Sandbox Code Playgroud)

如果您的 MPI 库没有实现进度线程,则在MPI_Wait()调用之前不会开始接收消息。

并非所有应用程序都可以(简单地)从重叠计算和通信中受益。在这种情况下

MPI_Recv(...);
Run Code Online (Sandbox Code Playgroud)

不仅更紧凑,而且可能比非阻塞对应物更有效,因为与 MPI 库相比,它为 MPI 库的优化留下了额外的空间

MPI_Irecv(...);
MPI_Wait(...);
Run Code Online (Sandbox Code Playgroud)

最重要的是,阻塞并不比非阻塞好,反之亦然。话虽如此,根据具体情况,一个通常比另一个更合适。