MPI:使用阻塞发送和接收的优点是什么?

MPI:使用阻塞发送和接收的优点是什么?,mpi,Mpi,既然MPI还实现了iRecv和iSend,那么使用Send和Recv的优势是什么?它们会阻止程序的执行,从而导致性能降低 有关问题: 他们写 阻塞通信在足够的情况下使用,因为它更容易使用。非阻塞通信在必要时使用,例如,您可以调用MPI_Isend(),进行一些计算,然后执行MPI_Wait()。这允许计算和通信重叠,这通常会提高性能 但是“它是足够的”和“它是必要的”是什么意思呢?有时,在发送或接收操作完成之前,您没有其他事情要做(在当前线程中),例如,您需要接收的结果来执行下一个操作 在这种情

既然MPI还实现了iRecv和iSend,那么使用Send和Recv的优势是什么?它们会阻止程序的执行,从而导致性能降低

有关问题:

他们写

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


但是“它是足够的”和“它是必要的”是什么意思呢?

有时,在发送或接收操作完成之前,您没有其他事情要做(在当前线程中),例如,您需要接收的结果来执行下一个操作

在这种情况下,使用阻塞Recv是最好的选择,比使用iRecv然后等待更好

如果您有事情要做-例如,您正在发送上一个结果,同时计算下一个结果,那么非阻塞操作会更快,因为您不必等待


基本上-如果在通信过程中除了通信之外还有其他事情要做,则阻塞只会降低性能,否则阻塞是等待的最高性能方式(由于共享缓冲区、等待代码内部可能的优化等)。

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

MPI_Send(...);
MPI_Recv(...);
因为它可能会死锁。 一个选项是手动订购通信设备

if (peer < me) {
    MPI_Send(...);
    MPI_Recv(...);
} else {
    MPI_Recv(...);
    MPI_Send(...);
}
请注意,在本例中,一个简单的示例说明了一个更一般的问题,
MPI\u Sendrecv()

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

MPI_Irecv(...);
// perform some computation that do no require the data to be received
MPI_Wait(...);
如果您的MPI库未实现进度线程,则在调用
MPI\u Wait()
之前不会开始接收任何消息

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

MPI_Recv(...);
它不仅更紧凑,而且可能比非阻塞对应项更高效,因为它为MPI库的优化留下了比其他库更多的空间

MPI_Irecv(...);
MPI_Wait(...);

总之,阻塞并不比不阻塞好,反之亦然。也就是说,根据具体情况,一个通常比另一个更适合。

可能的重复。这个例子涵盖了你的问题,尽管它不是一个完全重复的问题。我读过这个问题,但它并没有真正涵盖我的问题,因为它突出了两者之间的差异,但没有说明何时使用Send和Recv@ChielI更好。我认为缓冲区重用是解释中给出的主要论点。嗨,正如您所提到的,有些库实现了进度线程,但有些库没有。有没有办法检查一下?我使用的是OpenMPI3.1.3,请记住这也是依赖于互连的。因此,您最好编写一个小型测试程序,并在您的平台上进行尝试。在开放MPI的情况下,升级到4.0.2不会有什么坏处。我明白了,谢谢。我还发现--禁用进度线程和--启用进度线程--搜索时的配置,但我猜它们不是运行时参数,对吗?这些不是运行时参数。运行
ompi\u info--all
列出所有运行时参数。回答得好,请详细说明阻止调用的最高性能……共享缓冲区是什么意思?系统缓冲区还是接收器/发送器缓冲区?等待代码中有哪些优化?另外,如能提供参考,将不胜感激。非常感谢。
MPI_Irecv(...);
MPI_Wait(...);