无论如何要序列化您的 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 代码的某个部分?例如,将信息打印到屏幕上时。如下所示:
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
在一个过程中收集您想要的东西/值并在那里按顺序打印它们。
我不建议在主节点以外的其他节点上输出任何内容,因为 - 根据您使用的平台 - 从节点可能无法处理输出。因此,尽管它很讨厌,但您必须收集所有信息以打印到主节点。