C++ 序列化mpi线程

C++ 序列化mpi线程,c++,serialization,parallel-processing,mpi,mpich,C++,Serialization,Parallel Processing,Mpi,Mpich,是否仍然需要序列化MPI代码的特定部分?例如,将信息打印到屏幕上时。如下所示: MPI_SERIALIZE(); cerr << "THIS WILL BE PRINTED "; cerr << "IN ORDER" << endl; MPI_END_SERILIZE(); 谢谢MPI不能明确指定类似的内容。但是,您可以使用MPI\u-Gather在一个进程中收集所需的内容/值,并在其中按顺序打印。MPI不能明确指定任何类似的内容。但是,您可以使用MPI

是否仍然需要序列化MPI代码的特定部分?例如,将信息打印到屏幕上时。如下所示:

MPI_SERIALIZE();

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

MPI_END_SERILIZE();

谢谢

MPI不能明确指定类似的内容。但是,您可以使用
MPI\u-Gather
在一个进程中收集所需的内容/值,并在其中按顺序打印。

MPI不能明确指定任何类似的内容。但是,您可以使用
MPI\u-Gather
在一个过程中收集所需的内容/值,并在其中按顺序打印它们。

我在演示程序中这样做的方式(请注意,由于同步成本高,您只能在小型演示程序中执行此操作;如果您试图控制数据文件的输出,您将使用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;
}
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
int等级、大小;
内特里尔;
ierr=MPI_Init(&argc,&argv);
ierr=MPI通信大小(MPI通信世界和大小);
ierr=MPI通信等级(MPI通信世界和等级);

对于(int i=0;i我在演示程序中的方式(请注意,由于同步成本高,您只能在小型演示程序中执行此操作;如果您试图控制数据文件的输出,您将使用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;
}
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
int等级、大小;
内特里尔;
ierr=MPI_Init(&argc,&argv);
ierr=MPI通信大小(MPI通信世界和大小);
ierr=MPI通信等级(MPI通信世界和等级);

对于(int i=0;i我不建议在主节点以外的其他节点上输出任何内容,因为-取决于您使用的平台-从节点可能无法处理输出。因此,尽管这很糟糕,但您必须收集所有信息以打印到主节点。

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