如何在MPI中按顺序打印日志

时间:2013-09-28 21:56:07

标签: 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]
    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; 

而且,对于每位乘客,我都有:

for (i to NumOfRound)
    sleep(X);
    printf("%d is sending a msg", tasked)
    MPI_Send(&taskid, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
    MPI_Recv(&pid, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &pstatus);
    printf("%d received from %d\n", tasked, pid, pstatus.MPI_SOURCE);

问题

如果车辆在任务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会阻止任务,直到它从车辆获得一个msg,所以我研究并读到MPI_Recv确实阻塞但是出现这种问题是因为printf不一定按顺序打印。我还读到有人建议使用flush,但在某些情况下,flush不起作用。

我不确定在我的情况下应该做些什么。这真的只是printf命令的问题吗?

我也读过这个:Ordering Output in MPI

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

1 个答案:

答案 0 :(得分:1)

您不能依赖打印输出在进程之间进行排序。您唯一可以依赖的是每个进程将按顺序输出。因此,如果由于某种原因,您可以按顺序将事物打印到STDOUT / STDERR,那么您需要先将它聚合到一个进程。