订购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
为什么ISIT在发送前接收打印后的cout
?
这是同时进行输出的两个不同过程。MPI实现通常为所有过程执行标准输出重定向,但是通常会进行缓冲,以提高性能并最大程度地减少网络利用率。然后将所有进程的输出发送到mpiexec
(或mpirun
或用于启动MPI作业的其他命令),并将其合并到其标准输出中。来自不同过程的不同块/行结束的顺序大多是随机的,因此,除非采用某种类型的同步synchronisatoin,否则您一定不要期望某个等级的消息会首先出现。
还要注意,MPI标准不能保证所有等级都可以写入标准输出。该标准提供了MPI_IO
预定属性密钥,可以在MPI_COMM_WORLD
上查询,以获取允许执行标准输出的过程的等级。如今,大多数MPI实现都在MPI作业中的所有进程上执行输出重定向,因此对于此类属性查询返回MPI_ANY_SOURCE
,但这不能始终是这种情况。
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- MPI突然停止了对多个核心的操作
- 设置 Visual Studio for MPI: 找不到标识符错误
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 重载 MPI 中的运算符 ()
- Linux 服务器中的 Recv 缓冲区大小
- 在 for 循环中处理复杂的发送 recv 消息
- MPI:检查是否有任何进程已终止
- 使用 pybind11 共享 MPI 通信器
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- 在具有 MPI 的超立方体中广播
- 通过 mpi 发送 c++ 标准::矢量<bool>
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 使用 MPI 的 C++ 中的并行 for 循环
- MPI发送/recv的向量
- MPI发送RECV输入参数
- Boost.MPI recv 到现有矢量的切片中
- MPI中向多个进程发送Recv的最佳方式