MPI_Barrier不能正常工作使用fflush(stdout)

时间:2015-10-08 10:53:19

标签: mpi

首先不打印“------------- Hello ------------”,“---------- -------结束------------------“最后???”

    if (rank == 0) {
            printf("-------------------------HELLO-----------------------\n");
            fflush(stdout);
    }

    MPI_Barrier(MPI_COMM_WORLD);
    printf("Process %i says hello\n", rank);
    fflush(stdout);

    MPI_Barrier(MPI_COMM_WORLD);

    if (rank==0)
            printf("--------------------END----------------------\n");

    MPI_Finalize();

1 个答案:

答案 0 :(得分:2)

MPI不对订单提供任何保证,其中显示来自不同等级的标准输出。事实上,MPI标准甚至不能保证所有排名都能够写入标准输出(可以使用MPI_IO密钥发出环境查询,以便找出哪些排名可以)。

许多MPI库通过网络流将其发送回mpirun / mpiexec或通过直接允许每个等级写入控制终端来实现标准输出的重定向:如果所有等级都在同一节点上运行)。在这两种情况下,尽管保留了来自每个等级中相同线程的输出行的顺序,但是来自不同等级或甚至来自相同等级的不同线程的文本的出现顺序是不确定的。

确保不同排名的文本输出将以特定顺序出现的唯一方法是通过以MPI消息的形式将文本显式发送到单个排名(例如排名为0),并结合某种形式的同步/流量控制,例如令牌传递。