gpt4 book ai didi

c++ - cout 奇怪的排序 : MPI_Recv before MPI_Send?

转载 作者:行者123 更新时间:2023-11-30 04:23:35 28 4
gpt4 key购买 nike

我有这样的东西:

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 作业的任何其他命令)并合并到其标准输出中。来自不同进程的不同 block /行最终出现在输出中的顺序大多是随机的,因此您不能期望来自特定级别的消息会首先出现,除非采用某种进程同步。

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

关于c++ - cout 奇怪的排序 : MPI_Recv before MPI_Send?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13307056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com