【问题标题】:Conditional Broadcasting in MPIMPI 中的条件广播
【发布时间】:2022-09-23 15:35:55
【问题描述】:

我想编写一个 MPI 程序,其中每个进程都有一个布尔值 initiate,最初设置为 false。然后,等级 0 检查大型 2D 布尔数组的值 (i,j) 是否为真,如果是,则等级 0 将其值 initiate 设置为真。如果 rank 0 的 initiate 值为真,那么我希望 rank 0 将 initiate 的新值广播给其他进程,间接告诉他们每个人启动另一个方法的执行。

我怎样才能有效地做到这一点?很高兴听到任何想法。

-谢谢

PS。我考虑将二维布尔数组发送到每个进程,但二维数组可以非常在某些情况下很大,我担心我的代码不能很好地扩展。

  • 简单的方法是在等级0 上计算initiate,广播它,然后其他等级知道该做什么。这种方法有什么问题吗?
  • 我希望仅在 0 级发现 initiate 为真时进行广播。我怎样才能做到这一点?否则,如果我每次广播 rank 0 计算 initiate 的值可能非常昂贵,因为 rank 0 计算 initiate 的值很多次通常是错误的
  • 您可以在非根等级上使用 MPI_Ibcast() 和轮询(例如 MPI_Test())

标签: c mpi broadcast


【解决方案1】:

我假设您想利用等待时间。详细阐述 Gilles Gouaillardet 的评论,您可以构建一种“中断”类型的结构。

bool initiate = false;

if (rank == 0)
  for(int k = 0; k < I * J; k++)
    if(!bool_arr[k]) {
      initiate = true;
      break;
    }

MPI_Request request;
MPI_Ibcast(&initiate, 1, MPI_C_BOOL, 0, MPI_COMM_WORLD, &request);

for (int iter = 0; iter < numiter; iter++) {

    ; // DO WHATEVER YOU WANT!

    // TEST IF THE BROADCAST COMPLETE ONCE IN A WHILE
    bool complete;
    MPI_Test(&request, &complete, MPI_STATUS_IGNORE);
    if (complete && initiate)
      function();
}
// DO NOT MOVE ON WITHOUT WAITING FOR BROADCAST
MPI_Wait(&request, MPI_STATUS_IGNORE);
if (initiate)
  function();

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多