在我的测试程序中,我正在从一个进程向另一个进程发送消息。跟踪printfs似乎表明在发送之前收到的消息是什么,为什么会这样?
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
/* 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
*/
答案 0 :(得分:2)
这里的问题不是您已经打破了时间的因果关系,只是MPI不保证将消息打印到屏幕的顺序(有关详细信息,请参阅MPI - Printing in an order)。
MPI会将所有stdout
和stderr
转发回调用mpiexec
/ mpirun
的流程,然后再将其打印到屏幕上(因为那里用户已连接。来自所有不同进程的邮件可以按任何顺序到达,因此您可能会看到一行说明已收到邮件,然后再收到另一行说邮件已发送。邮件仍在正确的顺序,他们在整个过程中只是在沟通渠道中受到延迟。
答案 1 :(得分:0)
如何确保进程0在发送之前收到消息,我认为它更有可能是printf被缓冲或延迟。
Printf不保证是即时的,以使其更具响应性。在代码的开头运行它以防止使用printf输出缓冲:
setbuf(stdout, NULL);