有没有办法在不使用 MPI_Wait 的情况下编写非阻塞 MPI 代码?

问题描述

我有这个运行良好的代码。我的问题是没有 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,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,(rank + 1) % size,&request);


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


    MPI_Finalize();
    return 0;
}

解决方法

我的问题是是否有可能有一个没有阻塞的代码 MPI_等待

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

在当前上下文中,非阻塞简单地意味着不阻塞等待数据被复制到/从缓冲区和接收/发送。调用非阻塞例程后,可以立即恢复计算。

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

人们总是可以测试,但也可以信任规范(和/或实现)给定的例程是否是非阻塞的。

然而,在这里,由于 MPI_Wait 和 数据计算;我认为这行不通。

确实,使用此类例程的要点之一是计算与通信重叠,只要该计算不适用于通信中使用的数据。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...