MPI不正确的发送和接收顺序

时间:2018-11-17 11:50:42

标签: c mpi

我在此代码中使用MPI,即进程之间传递消息的环,进程n从n-1接收并发送到n + 1。

#include "mpi.h"
#include <stdio.h>

int main(argc,argv)
int argc;
char **argv;
{

  int MyProc, size,tag=1;
  char msg='A', msg_recpt;
  MPI_Status status;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &MyProc);
  MPI_Comm_size(MPI_COMM_WORLD, &size);

  printf("Process # %d started \n", MyProc);
  MPI_Barrier(MPI_COMM_WORLD);


  if(MyProc == 0){
      printf("Sending:  Proc #%d  to Proc #%d\n",MyProc,(MyProc +1 )%size);
      MPI_Send(&msg, 1, MPI_CHAR, (MyProc +1 )%size,tag, MPI_COMM_WORLD);
      MPI_Recv(&msg_recpt, 1, MPI_CHAR, (MyProc + size - 1)%size, tag, MPI_COMM_WORLD, &status);
      printf("Receving: Proc #%d from Proc #%d\n",MyProc,(MyProc + size - 1)%size);
  }else{
    printf("Receving: Proc #%d de Proc #%d\n",MyProc,(MyProc + size - 1)%size);
    MPI_Recv(&msg_recpt, 1, MPI_CHAR, (MyProc + size - 1)%size, tag, MPI_COMM_WORLD, &status);
    MPI_Send(&msg, 1, MPI_CHAR, (MyProc +1 )%size,tag, MPI_COMM_WORLD);
    printf("Sending:  Proc #%d  from Proc #%d\n",MyProc,(MyProc +1 )%size);
  }

  printf("Finishing proc %d\n", MyProc);

  MPI_Barrier(MPI_COMM_WORLD);
  MPI_Finalize();
}

我得到以下输出:

Process # 0 started 
Process # 1 started 
Process # 2 started 
Sending:  Proc #0  to Proc #1
Receving: Proc #0 from Proc #2
Finishing proc 0
Receving: Proc #1 de Proc #0
Sending:  Proc #1  from Proc #2
Finishing proc 1
Receving: Proc #2 de Proc #1
Sending:  Proc #2  from Proc #0
Finishing proc 2

有些错误是因为进程0的接收消息出现在进程2的发送消息之前,我认为进程0应该等到进程2发送,但是我不知道发生了什么。

1 个答案:

答案 0 :(得分:0)

您不能假设是因为stdout给了您订单,所以就是操作的顺序。

您唯一可以说的是,在每个等级上都遵守顺序,但其余顺序则不遵守。 MPI如何聚集各个级别的stdout取决于实现(我认为intel MPI有一个我找不到的标志,它将减慢执行速度。)

如果要确定操作顺序,则必须使用stdout以外的其他工具,看看MPE,吸血鬼...