序列化mpi线程
Serialize mpi threads
是否有办法序列化您的MPI代码的某个部分?例如,当将信息打印到屏幕上时。如下所示:
MPI_SERIALIZE();
cerr << "THIS WILL BE PRINTED ";
cerr << "IN ORDER" << endl;
MPI_END_SERILIZE();
如果有两个MPI线程,将没有case:
THIS WILL BE PRINTED THIS WILL BE PRINTED IN ORDER
IN ORDER
谢谢
我在演示程序中这样做的方式(注意-由于同步成本高,您只会在小型演示程序中这样做;如果您试图控制数据文件的输出,您将使用MPI-IO,如果您试图协调输出到终端,最简单的将数据发送到任务0并让它完成所有输出)是循环越过障碍,如下所示:
#include <iostream>
#include <mpi.h>
using namespace std;
int main(int argc, char **argv) {
int rank, size;
int ierr;
ierr = MPI_Init(&argc, &argv);
ierr = MPI_Comm_size(MPI_COMM_WORLD, &size);
ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
for (int i=0; i<size; i++)
{
if (i == rank) {
cout << "Hello from task " << rank << " of "
<< size << " world!" << endl;
}
MPI_Barrier(MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
(作为一个较小的东西,MPI没有线程,它有进程。这似乎是一个小细节,但是如果您开始将MPI与OpenMP结合使用,例如,线程和进程之间的区别就变得很重要了。
这些都不能用MPI显式指定。然而,你可以使用MPI_Gather
在一个进程中收集你想要的东西/值,并在那里按顺序打印它们。
我不建议在主节点以外的其他节点上输出任何内容,因为从属节点可能无法处理输出,这取决于您正在使用的平台。因此,尽管这很麻烦,但您必须收集所有要打印到主节点的信息。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- 混合开放MP/MPI代码中的多线程发送/接收时出错
- 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 Op
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 为什么我所有的 mpi 线程都是大师
- 线程与共享内存和MPI之间的主要区别
- 如何在MPI + openmp中启动多线程
- 序列化mpi线程
- 线程安全MPI通信
- 使用使用 std::async 创建的线程发送的 MPI 发送的线程安全性
- 将 MPI 与线程一起使用的正确方法是什么