MPI-广播到所有进程以打印某物

MPI-广播到所有进程以打印某物,mpi,broadcast,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 =

我已经在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);
  }
inti;
int值;
MPI_状态;
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和numtasks);
MPI通信等级(MPI通信世界和myrank);
左=(myrank-1);如果(左<0)左=numtasks-1;
右=(myrank+1);如果(right>=numtasks)right=0;
如果(myrank==0){
value=value+myrank;
MPI_发送(值,MPI_INT,右,99,MPI_COMM_WORLD);
MPI_Recv(值、MPI_INT、左、99、MPI_COMM_WORLD和状态);
}
else if(myrank==(numtasks-1)){
MPI_Recv(值、MPI_INT、左、99、MPI_COMM_WORLD和状态);
value=value+myrank;
MPI_发送(值,MPI_INT,右,99,MPI_COMM_WORLD);
}
否则{
MPI_Recv(值、MPI_INT、左、99、MPI_COMM_WORLD和状态);
value=value+myrank;
MPI_发送(值,MPI_INT,右,99,MPI_COMM_WORLD);
}
Theese应该做一个逻辑循环。我做一次计算(所有等级之和),在过程0中我得到结果。这个结果(对于4个进程,它将是6个)我希望在计算之后由每个进程打印。但我不知道如何准确地使用屏障以及在哪里使用


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

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


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


但是,您的代码不会计算所有节点中所有列组的总和,因为进程
i
只接收第一个
i-1
进程的总列组。如果您希望每个进程的末尾都有总和,那么用广播代替屏障确实是最好的选择。(事实上,整个
if
语句和广播可以由单个
MPI\u Reduce()
调用代替,但这并不能真正帮助您学习MPI.)

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


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


但是,您的代码不会计算所有节点中所有列组的总和,因为进程
i
只接收第一个
i-1
进程的总列组。如果您希望每个进程的末尾都有总和,那么用广播代替屏障确实是最好的选择。(事实上,整个
if
语句和广播可以由单个
MPI\u Reduce()
调用代替,但这并不能真正帮助您学习MPI.)

添加到主要问题的详细信息谢谢,你能给我写信告诉我如何在我的代码中使用广播吗?从root=0我发送到所有其他进程,在if语句之后,我放入某种for循环?已解决,在if循环之后添加了这些行:MPI_Bcast From root and printf。谢谢详细信息添加到主要问题谢谢,你能回答吗se告诉我如何为我的代码使用广播?从root=0我发送到所有其他进程,在if语句之后,我放入某种形式的for循环?已解决,在if循环之后添加了这些行:来自root和printf的MPI_Bcast。谢谢