【问题标题】:Is there any way to write non blocking MPI code without using MPI_Wait?有没有办法在不使用 MPI_Wait 的情况下编写非阻塞 MPI 代码?
【发布时间】:2021-02-25 16:37:17
【问题描述】:

我的代码运行良好。我的问题是,没有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;
}

【问题讨论】:

    标签: c++ mpi wait blocking nonblocking


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多