【问题标题】:MPI - broadcast to all processes to printf somethingMPI - 向所有进程广播以打印某些东西
【发布时间】:2011-07-05 04:21:49
【问题描述】:

我在 main 中声明了 int 值,并且所有进程都初始化了这个值。它们都是存储值,我想在计算完成后写在屏幕上。广播是解决方案吗?例如。如何实现?

int i;
int value;
  MPI_Status status;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
  MPI_Comm_rank(MPI_COMM_WORLD;&myrank);

  left =  (myrank - 1); if (left < 0) left = numtasks-1;
  right = (myrank + 1); if (right >= numtasks) right = 0;

if(myrank==0){
     value=value+myrank;
      MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
      MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);

  }
  else if(myrank==(numtasks-1)){

      MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
      value=value+myrank;
      MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);


  }
  else{
      MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
      value=value+myrank;
      MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
  }

这些应该做逻辑循环。我进行一次计算(所有等级的总和),在过程 0 中我得到结果。这个结果(对于 4 个进程,它将是 6 个)我想在这个计算之后由每个进程打印。但我不知道如何准确使用屏障以及在何处使用。

还有一件事,在所有 N-1 次发送(其中 N 是进程数)之后,我应该有每个进程中所有等级的总和。在我的代码中,我只在进程 0 中得到这个总和......这可能是一个不好的方法:-(

【问题讨论】:

    标签: mpi broadcast


    【解决方案1】:

    更多关于代码结构的细节会有所帮助,但听起来你可以只使用MPI_Barrier。您的流程不需要交换任何数据,它们只需要等到每个人都到达代码中您希望进行打印的点,这正是 Barrier 所做的。


    编辑:在您发布的代码中,障碍将在最后(if 语句之后),然后是printf(value)

    但是,您的代码不会计算所有节点中所有等级的总和,因为进程 i 只接收第一个 i-1 进程的总等级。如果希望每个进程最后都有总和,那么将 Barrier 替换为 Broadcast 确实是最好的选择。 (事实上​​,整个if 语句和广播可以被单个MPI_Reduce() 调用替换,但这并不能真正帮助你学习MPI。:))

    【讨论】:

    • 添加到主要问题的详细信息
    • 谢谢,你能写信告诉我如何为我的代码使用广播吗?从 root=0 我发送到所有其他进程,在 if 语句之后,我放了某种 for 循环?
    • 已解决,在 if 循环后添加了这些行:来自根和 printf 的 MPI_Bcast。谢谢
    • 障碍对同步输出没有帮助:输出取决于很多操作系统的东西。您无法从程序内部控制它。事实上,屏障几乎没有必要:MPI 调用通过阻塞行为来同步自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2021-05-18
    相关资源
    最近更新 更多