序列化mpi线程

Serialize mpi threads

本文关键字:线程 mpi 序列化      更新时间:2023-10-16

是否有办法序列化您的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在一个进程中收集你想要的东西/值,并在那里按顺序打印它们。

我不建议在主节点以外的其他节点上输出任何内容,因为从属节点可能无法处理输出,这取决于您正在使用的平台。因此,尽管这很麻烦,但您必须收集所有要打印到主节点的信息。