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

时间:2014-08-13 15:01:52

标签: c multithreading parallel-processing mpi

在我的测试程序中,我正在从一个进程向另一个进程发送消息。跟踪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
*/

2 个答案:

答案 0 :(得分:2)

这里的问题不是您已经打破了时间的因果关系,只是MPI不保证将消息打印到屏幕的顺序(有关详细信息,请参阅MPI - Printing in an order)。

MPI会将所有stdoutstderr转发回调用mpiexec / mpirun的流程,然后再将其打印到屏幕上(因为那里用户已连接。来自所有不同进程的邮件可以按任何顺序到达,因此您可能会看到一行说明已收到邮件,然后再收到另一行说邮件已发送。邮件仍在正确的顺序,他们在整个过程中只是在沟通渠道中受到延迟。

答案 1 :(得分:0)

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

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

setbuf(stdout, NULL);