序列化mpi线程

时间:2011-07-05 08:03:48

标签: c++ serialization parallel-processing mpi mpich

无论如何序列化你的MPI代码的某个部分?例如,将信息打印到屏幕时。如下所示:

MPI_SERIALIZE();

cerr << "THIS WILL BE PRINTED ";
cerr << "IN ORDER" << endl;

MPI_END_SERILIZE();

如果有两个MPI线程,则不会出现这种情况:

THIS WILL BE PRINTED THIS WILL BE PRINTED IN ORDER 
IN ORDER

由于

3 个答案:

答案 0 :(得分:2)

我在演示程序中执行此操作的方式(并注意 - 由于同步成本高,您只能 在小型演示程序中执行此操作;如果您尝试将输出控制为数据文件,你要使用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结合起来,那么线程和进程之间的区别就变得很重要了。 )

答案 1 :(得分:1)

使用MPI可以明确指定类似的内容。但是,您可以使用MPI_Gather在一个过程中收集所需的内容/值,然后按顺序打印它们。

答案 2 :(得分:0)

我不建议在主节点以外的其他节点上输出任何内容,因为 - 根据您使用的平台 - 从节点可能无法处理输出。因此,尽管它很糟糕,但您必须收集要打印到主节点的所有信息。