C 如何按MPI顺序打印日志

C 如何按MPI顺序打印日志,c,mpi,C,Mpi,我拥有的 我有一个使用MPI的C程序,它使用4个进程:1个车辆(taskid=0)和3个乘客。 车辆一次可容纳2名乘客。 3位顾客不断回来搭便车 就车辆而言,我有: int passengers[C] = {0}; while(1) MPI_Recv(&pid, 1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status); //put pid in passengers[totalNumberArrived]

我拥有的

我有一个使用MPI的C程序,它使用4个进程:1个车辆(taskid=0)和3个乘客。 车辆一次可容纳2名乘客。 3位顾客不断回来搭便车

就车辆而言,我有:

int passengers[C] = {0};
while(1)
    MPI_Recv(&pid, 1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status);
    //put pid in passengers[totalNumberArrived]
    if(totalNumberArrived == 2)    
        printf("vehicle left...");
        sleep(5);
        printf("vehicle came back...");
        for (i=0; i<2; i++)
            MPI_Send(&passengers[i], 1, MPI_INT, passengers[i], 1, MPI_COMM_WORLD);
        totalNumberArrived = 0;
    if(done)//omitting the details here
        break; 
问题

如果车辆使用taskid 1和3行驶,我希望看到这种输出:

vehicle left...
vehicle came back...
1 is sending a msg 
3 is sending a msg (this could be before 1's msg though)
但我有时会

vehicle left...
1 is sending a msg
3 is sending a msg
vehicle came back...
看起来在车辆返回之前乘客不会被阻挡

我认为MPI_Recv会阻止任务,直到它从车辆获得消息为止,因此我研究并阅读了MPI_Recv确实会阻止,但出现这种问题是因为printf不一定按顺序打印。我还读到一些人建议使用flush,但在某些情况下flush不起作用

我不确定我该怎么办。这真的只是printf订单的问题吗

我也读过:


我想知道我是否应该添加一个主线程,让它成为车辆和乘客的中央控制器???

您不能依靠在进程之间订购的打印输出。您唯一可以信赖的是,输出将按进程排序。因此,如果出于某种原因,您必须按顺序将内容打印到STDOUT/STDERR,那么您需要首先将其聚合到一个进程。

可能的重复项
vehicle left...
1 is sending a msg
3 is sending a msg
vehicle came back...