使用MPI,在发送消息之前,似乎已收到消息

在我的测试程序中,我正在从一个进程向另一个进程发送消息。 跟踪printfs似乎表明在发送之前收到的消息是什么,为什么会这样?

#include  #include  #include  /* Run with two processes */ void main(int argc, char *argv[]) { int rank, i, count; float data[100],value[200]; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); printf("before if:%d\n",rank); if(rank==1) { printf("in if:%d\n",rank); for(i=0;i<100;++i) data[i]=i; MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD); } else { printf("else:%d\n",rank); MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status); printf("P:%d Got data from processor %d \n",rank, status.MPI_SOURCE); MPI_Get_count(&status,MPI_FLOAT,&count); printf("P:%d Got %d elements \n",rank,count); printf("P:%d value[5]=%f \n",rank,value[5]); } MPI_Finalize(); } 

/ 为了运行8个进程的程序,我得到了以下结果。 在进程1发送 / 之前如何处理进程0

 - RESULT: -before if:4\n -before if:8\n -else:8\n -before if:0\n -else:0\n -P:0 Got data from processor 1\n -P:0 Got 100 elements \n -P:0 value[5]=5.000000 \n -before if:1\n -in if:1\n -before if:2\n -else:2\n -before if:5\n -else:5\n -before if:6\n -else:6\n -before if:7\n -else:7\n -before if:9\n -else:9\n -else:4\n -before if:3\n -else:3\n */ 

这里的问题并不是你已经打破了时间的因果关系,只是MPI不能保证将消息打印到屏幕的顺序(参见MPI – 按顺序打印以获取更多细节)。

MPI将所有stdoutstderr转发回调用mpiexec / mpirun的进程,然后将其打印到屏幕上(因为那是用户连接的地方。来自所有不同进程的那些消息可以按任何顺序到达,所以你可能会在你得到另一条消息已经发送之前,看到一行说收到了一条消息。这些消息仍然以正确的顺序发生,他们只是在通信渠道中被延迟了。

如何确保进程0在发送之前收到消息,我认为它更有可能是printf被缓冲或延迟。

Printf不保证是即时的,以使其更具响应性。 在代码的开头运行此命令以防止使用printf进行输出缓冲:

 setbuf(stdout, NULL);