MPI - 向所有进程广播以打印某些内容

时间:2011-02-27 09:29:59

标签: mpi broadcast

我已在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);
  }

Theese应该做出逻辑循环。我做一个计算(所有等级的总和),在过程0我得到结果。这个结果(对于4个进程,它将是6)我希望在计算之后由每个进程打印。但是我没有看到如何准确地使用障碍和在哪里。

还有一件事,在所有N-1发送(其中N是进程数)之后,我应该在每个进程中拥有所有等级的总和。在我的代码中,我只将此总和纳入流程0 ......这可能是一个糟糕的方法: - (

1 个答案:

答案 0 :(得分:1)

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


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

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