MPI_Irecv是否在MPI_SSend上完成,或者是MPI_Wait(或仍需要其他变体)



我知道对MPI_Irecv的调用需要与MPI_Wait(或MPI_Test等(配对。请参阅此处以完成。但是,对于下面的代码,MPI_Send似乎正在迫使Irecv完成。

#include <iostream>
#include "mpi.h"
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
int rank = 0;
int size = 0;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size != 2)
MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
int send_buffer_0 = 0;
int send_buffer_1 = 1;
int recv_buffer_0 = -1;
int recv_buffer_1 = -1;
MPI_Request request;
if (rank == 0) {
MPI_Irecv(&recv_buffer_0, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &request);
MPI_Ssend(&send_buffer_0, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
} else {
MPI_Irecv(&recv_buffer_1, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &request);
MPI_Ssend(&send_buffer_1, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
// MPI_Wait(&request, MPI_STATUS_IGNORE);
if (rank == 1)
std::cout << "Rank " << rank << " recv'd " << recv_buffer_1 << std::endl;
MPI_Finalize();
return 0;
}

如果我将发送更改为MPI_Send,则需要MPI_Wait才能接收消息,因为我怀疑MPI实现正在缓冲发送。

MPI_Send调用是否强制Irecv完成,从而不需要等待或测试?该实施是具体的还是标准中预期的?

以下是同步模式:

无论是否发布了匹配的接收,都可以启动使用同步模式的发送。但是,只有发布了匹配的接收,并且接收操作已开始接收同步发送发送的消息,发送才会成功完成。因此,同步发送的完成不仅指示发送缓冲区可以被重用,而且还指示接收器已经到达其执行中的某个点,即它已经开始执行匹配的接收。如果发送和接收都是阻塞操作,那么同步模式的使用提供了同步通信语义:在两个进程在通信处会合之前,通信不会在任何一端完成。

这里没有任何内容表明您不需要等待您提供的代码。

最新更新