【问题标题】:How to overlap nonblocking communication如何重叠非阻塞通信
【发布时间】:2021-06-08 01:22:49
【问题描述】:

我知道Nonblocking通信不会阻塞代码,比如MPI_Isend会立即发送数据。但是当我们有一些 all-to-all 通信并且我们需要读取这些数据时,我们需要先使用 MPI_Wait 来获取数据。

对于全对全通信,我首先想到的是:(它是一个真实的代码)

1- initialise the MPI, getting the rank and size... 
2- creating the data or read the first data from file
3- in a for loop, we need to send the data from all ranks to the other, by MPI_Isend or Evan MPI_Bcast
4- finalise the MPI

为了编写 for 循环,我们需要使用 MPI_Wait 来进行发送和接收。 我的问题是我们如何在非阻塞中使用重叠。

我想在每个迭代循环中使用两次 MPI_Isend 和 MPI_Irecv 来重叠从第一个接收数据开始的一些计算,同时进行另一次发送和接收,但是这种方法需要 4 个等待,是否有任何算法可以重叠非阻塞通信?

【问题讨论】:

    标签: c++ c performance parallel-processing mpi


    【解决方案1】:

    我知道无阻塞通信不会阻塞代码,例如 因为 MPI_Isend 会立即发送数据。

    这是不准确的数据没有立即发送。让我更详细地解释一下:

    MPI_IrecvMPI_Isend 是非阻塞通信程序,因此需要使用MPI_Wait(或使用MPI_Test 来测试请求是否完成)来确保消息完成,并且发送/接收缓冲区中的数据可以再次安全进行操作。

    这里的非阻塞是指不等待数据被读取和发送;而是立即使数据可供读取和发送。但这并不意味着数据会立即发送。如果是,就不需要调用 MPI_Wait。

    但是当我们有一些全方位的沟通时,我们需要阅读 这个数据我们需要先使用MPI_Wait来获取数据。

    您需要在呼叫通信类型 1 到 1、1 到 n 等中调用 MPI_Wait(或 MPI_Test),而不仅仅是 all-to-all。调用 MPI_Wait 不是先获取数据,而是在MPI_Isend 期间必须读取和发送缓冲区的内容(例如,整数数组);同时,可以将一些计算与正在进行的进程重叠,但是这种计算不能改变(或读取)发送/接收缓冲区的竞争。然后调用MPI_Wait以确保从那时起数据发送/接收可以安全地读取/修改而不会出现任何问题。

    我想在每个迭代循环中使用两次 MPI_Isend 和 MPI_Irecv 从第一个接收数据中重叠一些计算和 同时做另一个发送和接收,但这种方法需要 4 等待,是否有任何算法可以重叠非阻塞 通讯?

    只要有可能,就在构建通信例程中使用它们可能比一个能够优化的更优化。你所描述的完全符合 MPI 例程MPI_Ialltoall

    以非阻塞方式从所有进程向所有进程发送数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多