0

我有的

我有一个使用 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);

问题

如果车辆使用 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 不一定按顺序打印。我还读到一些建议使用冲洗,但在某些情况下冲洗不起作用。

我不确定我应该怎么做。真的只是 printf 顺序的问题吗?

我也读过这个:在 MPI 中排序输出

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

4

1 回答 1

1

您不能依赖在进程之间对打印输出进行排序。您唯一可以依靠的是输出将按进程排序。因此,如果由于某种原因,您可以按顺序将内容打印到 STDOUT/STDERR 至关重要,则需要先将其聚合到一个进程中。

于 2013-09-30T14:19:21.610 回答