MPI_Sendrecv 与 MPI_Isend 和 MPI_Recv 的组合

MPI_Sendrecv vs combination of MPI_Isend and MPI_Recv

最近我在一本关于计算物理学的书中看到,下面这段代码被用来在一系列进程中转移数据:

MPI_Isend(data_send, length, datatype, lower_process, tag, comm, &request);
MPI_Recv(data_receive, length, datatype, upper_process, tag, comm, &status);
MPI_Wait(&request, &status);

我认为可以通过一次调用 MPI_Sendrecv 来实现同样的效果,我认为没有任何理由相信前者更快。有什么优点吗?

我相信您提供的片段与 MPI_sendrecv 调用之间没有真正的区别。 sendrecv 组合与常规发送和接收完全兼容:例如,当通过(非周期性!)链移动数据时,您可以在除端点以外的任何地方使用 sendrecv,并执行常规 send/isend/recv/irecv那里。

您可以在代码片段中考虑两种变体:使用 Isend/Recv 组合或使用 Isend/Irecv。在底层协议中如何处理这些可能存在细微差别,但我不会担心它们。

你的片段当然可以更容易地推广到其他模式而不是沿着链移动,但如果你确实有一个设置,其中每个进程最多发送到一个并从最多一个接收,那么我会使用MPI_Sendrecv 只是为了清洁。这只是让 reader 想知道:“这有什么深层原因吗”。