与 printf() 相比,MPI 函数似乎乱序执行

MPI functions appear to execute out of order compared to printf()

我有一个使用 MPI 的非常奇怪的代码,其中的语句似乎以错误的顺序执行。具体来说,MPI 语句似乎在 printf 之前执行,即使它在代码中出现在它之后。

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    int numProcs, rank, data;
    MPI_Status status;
    
    // Initialize the MPI library
    MPI_Init(&argc, &argv);

    // Get entity identification
    MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    // Do something different in each a rank
    if (rank == 0) {
        // Get the data from rank   1
    // with tag                    0
    printf("rank = %d\tGet the data from rank 1 with tag 0\n", rank);
    MPI_Recv(&data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
    } else if (rank == 1) {
        // Send the data to rank    0
    // with tag                    0
    printf("rank = %d\tSend the data to rank 0 with tag 0\n", rank);
        MPI_Send(&data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }

    printf("rank %d finishing\n", rank);

    // Clean up the MPI library
    MPI_Finalize();

    return 0;
}

这是正在生成的输出:

$ mpirun -n 2 ./a.out
rank = 0    Get the data from rank 1 with tag 0
rank 0 finishing
rank = 1    Send the data to rank 0 with tag 0
rank 1 finishing

好像是 rank 0 做了 printf,然后它从 rank 1 获取数据,然后它完成了……然后 rank 1 做了 printf?但是因为rank 1在真正把数据发给rank 0之前还要做printf,怎么可能rank 0已经拿到数据完成了呢?

屏幕输出由 OS 缓冲,然后必须通过 ssh 隧道到达启动 MPI 运行 的进程。结果,屏幕输出可以按各种顺序到达。基本上没有办法获得整齐有序的屏幕输出,除了将所有文本发送到进程零并以正确的顺序从那里打印。