MPI_Bcast是否应该与MPI_IBcast一起使用?

问题描述

据我所知you can freely mix blocking and non-blocking MPI operations on both ends of the communication,这意味着MPI_Ircv(...)可以接收MPI_Send(...)。

也就是说,我不能将MPI_Bcast(...)与MPI_Ibcast(...)一起使用,如下例所示:

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  MPI_Init(NULL,NULL);  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD,&world_rank);
  MPI_Request req;
  int i;  
  if (world_rank == 0) {
    i = 126;
    MPI_Ibcast(&i,1,MPI_INT,MPI_COMM_WORLD,&req);
    // do other stuff

    MPI_Wait(&req,MPI_STATUS_IGnorE);

  } else { 
    MPI_Bcast(&i,MPI_COMM_WORLD);
  }
  
  MPI_Barrier(MPI_COMM_WORLD);
  return 0;
}

这应该起作用吗?我在MPI文档中找不到与此信息有关的任何信息。

我在GCC 10.2.1中使用MPICH 3.3.2。

解决方法

您问题的简单答案:,该代码不起作用。

长答案:我们无法匹配阻止和不阻止集体呼叫,因为

  1. 集体操作没有tag参数。将标签用于集体操作可能会阻止某些硬件优化。因此无法像点对点操作中那样进行消息匹配。

  2. 在阻塞/非阻塞情况下,实现可能会使用不同的通信算法进行优化。例如,可以对阻塞的集体操作进行优化,以最大程度地缩短完成时间。

这在MPI标准3.1中已明确定义:

与点对点操作不同,无阻塞集体操作可以 与阻止集体行动不符,集体 操作没有标签参数。所有进程都必须调用 集合操作(​​阻塞和非阻塞)的顺序相同 传播者。特别是,一旦流程召集了集体 操作,通信器中的所有其他过程最终必须 称为同一集体行动,没有其他集体行动 两者之间使用相同的沟通工具。这与 阻止线程中的集体操作的排序规则 环境。

理性。匹配阻塞和非阻塞集体操作是 不允许,因为实现可能使用不同的方法 两种情况下的通信算法。集体封锁 可以优化操作以最大程度地减少完成时间,而 畅通无阻的集体行动可能会平衡完成时间 CPU开销和异步进度。标签的使用 集体操作可能会阻止某些硬件优化。 (结束 的理由。)

希望这会有所帮助!