【问题标题】:Could MPI_Bcast lead to the issue of data uncertainty?MPI_Bcast 会不会导致数据不确定性的问题?
【发布时间】:2016-04-27 14:37:14
【问题描述】:

如果不同的进程向某个通信器组中的其他进程广播不同的值,会发生什么?

以下面两个进程运行的程序为例,

int rank, size;
int x;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{
    x = 0;
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD);
}
else if (rank==1)
{
    x = 1;
    MPI_Bcast(&x, 1, MPI_INT, 1, MPI_COMM_WORLD);
}
cout << "Process " << rank << "'s value is:" << x << endl;
MPI_Finalize();

我认为程序结束时打印结果可能有不同的可能性。如果进程 0 比进程 1 运行得快,它会比进程 1 更早地广播它的值,所以进程 1 在开始广播它的值时将与进程 0 具有相同的值,因此使 x 的打印值都为 0。但是如果进程 0 的运行速度比进程 1 慢,进程 0 的值与进程 1 的值相同,最后为 1。我描述的事情真的发生了吗?

【问题讨论】:

  • 严格来说,此代码不符合标准,因为并非所有通信器进程都使用相同的根参数调用MPI_Bcast()(这是 MPI 标准明确要求的)。因此,行为是未定义的:任何事情都可能发生。

标签: mpi


【解决方案1】:

我认为您对 MPI_Bcast 函数不太了解。实际上MPI_Bcast是一种MPI集体通信方式,属于某个通信者的每个进程都需要参与其中。所以对于MPI_Bcast这个函数,不仅是发送要广播的数据的进程,而且接收广播数据的进程都需要同步调用该函数,以达到在所有参与进程之间进行数据广播的目的。

在你给定的程序中,尤其是这部分:

if (rank == 0)
{
   x = 0;
   MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD);
}
else if (rank==1)
{
  x = 1;
  MPI_Bcast(&x, 1, MPI_INT, 1, MPI_COMM_WORLD);
}

我认为您的意思是让等级为 0 的进程(进程 0)将其 x 值广播给其他进程,但在您的代码中,当您使用 if-else 段时,只有进程 0 调用 MPI_Bcast 函数。那么其他进程是做什么的呢?对于等级为 1 的进程(进程 1),它不会调用与进程 0 相同的 MPI_Bcast 函数,尽管它确实调用了另一个 MPI_Bcast 函数来广播其 x 的值(root 的参数在这两个 MPI_Bcast 函数之间是不同的). 因此,如果只有进程 0 调用 MPI_Bcast 函数,它实际上只是将 x 的值广播给自己,而存储在其他进程中的 x 的值根本不会受到影响。流程 1 的条件也相同。因此在您的程序中,每个流程的打印值 x 应该与最初分配时相同,并且不会出现您担心的数据不确定性问题。

【讨论】:

    【解决方案2】:

    MPI_Bcast 主要用于使 rank 0 [root] 可以计算值并广播它们,因此每个人都从相同的值开始。

    这是一个有效的用法:

    int x;
    
    // not all ranks may get the same time value ...
    srand(time(NULL));
    
    // so we must get the value once ...
    if (rank == 0)
        x = rand();
    
    // and broadcast it here ...
    MPI_Bcast(&x,1,MPI_INT,0,MPI_COMM_WORLD);
    

    请注意与您的用法不同。 same MPI_Bcast 调用 all 等级。 root 会发送,其他人会做 recv。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-10
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2013-07-09
      • 2018-10-29
      相关资源
      最近更新 更多