MPI_RECV MPI_SEND前:COUT怪异的排序?(Ordering of cout wei

2019-10-17 09:32发布

我有这样的:

if (rank == winner) {
    ballPos[0] = rand() % 128;
    ballPos[1] = rand() % 64;
    cout << "new ball pos: " << ballPos[0] << " " << ballPos[1] << endl;
    MPI_Send(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, MPI_COMM_WORLD);
} else if (rank == FIELD) {
    MPI_Recv(&ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    cout << "2 new ball pos: " << ballPos[0] << " " << ballPos[1] << endl;
}

但是,我看到控制台:

new ball pos: 28 59
2 new ball pos: 28 59

为什么ISIT的cout后一前发送之前接收打印?

Answer 1:

这些都是在同一时间做输出两个不同的过程。 MPI实现通常执行标准的输出重定向为所有进程,但它通常是在为了提高性能并最小化网络利用缓冲。 然后从所有进程的输出被发送到mpiexec (或到mpirun ,或到任何其它命令用于启动MPI作业)并组合成它的标准输出。 在不同的块/来自不同进程的线在输出端了起来,为了大多是随机的,所以你不能指望从某个等级的消息会拿出第一,除非使用某种过程synchronisatoin的。

还要注意的是,MPI标准不保证它是可能的各级写入标准输出。 该标准提供了MPI_IO ,人们可以在查询预定义的属性键MPI_COMM_WORLD为了获得被允许执行标准输出的过程的秩。 大多数MPI实现上的MPI作业中的所有进程时下执行输出重定向,从而返回MPI_ANY_SOURCE这样的属性查询,但这不能保证始终是这种情况。



文章来源: Ordering of cout weird: MPI_Recv before MPI_Send?
标签: c++ openmpi