繁体   English   中英

cout 的排序很奇怪:MPI_Recv 在 MPI_Send 之前?

[英]Ordering of cout weird: MPI_Recv before MPI_Send?

我有类似的东西:

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

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

这是两个不同的进程同时进行输出。 MPI 实现通常为所有进程执行标准输出重定向,但它通常被缓冲以提高性能并最小化网络利用率。 然后将所有进程的输出发送到mpiexec (或mpirun ,或用于启动 MPI 作业的任何其他命令)并合并到其标准输出中。 来自不同进程的不同块/行在输出中的最终顺序大多是随机的,因此除非采用某种进程同步,否则您不能期望来自某个级别的消息会首先出现。

另请注意,MPI 标准不保证所有等级都可以写入标准输出。 该标准提供了MPI_IO预定义属性键,可以在MPI_COMM_WORLD上查询,以获得允许执行标准输出的进程的等级。 现在,大多数 MPI 实现对 MPI 作业中的所有进程执行输出重定向,从而为此类属性查询返回MPI_ANY_SOURCE ,但不能保证始终如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM