MPI_Init()之前的初始化变量,MPI_Finanlize()之后的cout

All*_*nzi 2 c++ linux mpi

我一直在测试mpi如何与以下代码一起工作

    #include <iostream>
    #include <mpi.h>
    using namespace std;
    int main(int argc, char *argv[]){
    r = 3.0;
    int id; 
    int p;
    int a[100];
    for(int i=0;i<100;++i){a[i]=i+5; }
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &id);
    MPI_Comm_size(MPI_COMM_WORLD, &p);

    cout<<id<<"   "<<r<<"   "<<a[id]<<endl;

    MPI_Finalize();

    cout<< "Hello world " <<endl;

    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用30个内核来运行代码。但从两个方面来看,输出令人惊讶

  1. 这里的问题是,如果您在MPI_Init()之前初始化变量,则其他进程(但0除外)将忽略初始化值,但是在我的输出文件中,所有具有不同id的进程都会输出r = 3和的正确值a[i],那么这是否意味着我可以在调用MPI_Init()之前初始化变量或数组,并且所有进程将为该变量共享相同的值?
  2. 输出中有很多行“ Hello world”,这显然表明即使调用MPI_Finalize()之后,每个进程仍在打印“ Hello world”,这是为什么呢?

顺便说一句,我正在使用mpicc编译代码。

nul*_*ptr 5

在之前MPI_Init和之后执行代码是完全有效的MPI_Finalize。当然,不允许您在该代码中使用MPI,但否则,它只是普通的C ++。

MPI_InitMPI_Finalize刚刚库调用,他们不应该变更控制流程或init之前分配移除值(以及将如何,在所有可能吗?)。

MPI_Init 不会取消变量的初始化。

您所指的问题是,进程0中的初始化不会初始化其他进程中的值。在该问题中,从文件中读取了数据,该文件可能仅存在于进程0中。

请注意,MPI_Init这不会创建新流程。不是那样的fork。所有进程都是在程序启动之前创建的(很有可能是mpirun)。在您的情况下,每个进程都会初始化其数组。

MPI_Finalize不会终止该过程。它仅关闭MPI库。此后,进程仍然继续运行,尽管它们无法再进行交互了。