C++ 有没有办法不使用MPI_Wait编写非阻塞MPI代码?

C++ 有没有办法不使用MPI_Wait编写非阻塞MPI代码?,c++,mpi,wait,blocking,nonblocking,C++,Mpi,Wait,Blocking,Nonblocking,我有一个很好用的代码。我的问题是,有没有可能在没有MPI_Wait的情况下使用非阻塞代码?我在想,是否通过这种方式,我的代码在无意中表现为阻塞模式。另外,为了确认这是一个非阻塞代码,我应该测量执行时间吗?如果速度更快,我可以断定这是无阻塞的。然而,在这里,由于在MPI_Wait和数据计算之间不涉及任何工作;我认为这是行不通的。那么,我怎样才能确保这是一种非阻塞模式呢 #include <iostream> #include <mpi.h> using namespace

我有一个很好用的代码。我的问题是,有没有可能在没有MPI_Wait的情况下使用非阻塞代码?我在想,是否通过这种方式,我的代码在无意中表现为阻塞模式。另外,为了确认这是一个非阻塞代码,我应该测量执行时间吗?如果速度更快,我可以断定这是无阻塞的。然而,在这里,由于在
MPI_Wait
和数据计算之间不涉及任何工作;我认为这是行不通的。那么,我怎样才能确保这是一种非阻塞模式呢

#include <iostream>
#include <mpi.h>
using namespace std;

int main() {
    MPI_Init(NULL, NULL);
    MPI_Request request;
    MPI_Status status;
    int rank, size, data;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);



    if (rank > 0) {

        MPI_Irecv(&data, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &request);
        MPI_Wait(&request, &status);
        cout << "Rank " << rank << " has received message with data " << data << " from rank " << rank - 1 << endl;

    }
    cout << "Hello from rank " << rank << " out of " << size << "   "  << endl;
  

    data = rank;

    MPI_Isend(&data, 1, MPI_INT, (rank + 1) % size, 0, MPI_COMM_WORLD, &request);


    if (rank == 0) {
        MPI_Irecv(&data, 1, MPI_INT, size - 1, 0, MPI_COMM_WORLD, &request);
        MPI_Wait(&request, &status);
        cout << "Rank " << rank << " has received message with data " << data << " from rank " << size - 1 << endl;
    }


    MPI_Finalize();
    return 0;
}
#包括
#包括
使用名称空间std;
int main(){
MPI_Init(NULL,NULL);
MPI_请求;
MPI_状态;
int秩、大小、数据;
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
如果(排名>0){
MPI_Irecv(数据、1、MPI_INT、排名-1、0、MPI_通信世界和请求);
MPI_等待(&请求,&状态);
库特
我的问题是,有没有可能有一个无阻塞代码
等等

是的,在没有MPI_Wait的情况下,可以使用非阻塞代码;但是,问题是非阻塞通信例程上使用的数据可能会进入不一致的状态。换句话说,无法确定该数据是否可以安全使用(或不使用)

在当前上下文中,非阻塞只是指不阻塞等待数据复制到缓冲区或从缓冲区中复制并接收/发送。调用非阻塞例程后,可以立即恢复计算

我在想,通过这种方式,我的代码是否表现为阻塞 模式。另外,为了确认这是一个非阻塞代码, 我可以测量执行时间吗?如果执行时间更快,我可以得出结论 这是不可能的

可以始终进行测试,但也可以信任规范(和/或实现)是否给定例程是非阻塞的

但是,在这里,由于MPI_Wait和 计算数据;我认为这不起作用

事实上,使用此类例程的要点之一是,只要计算不在通信上使用的数据上工作,就将计算与通信重叠