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

时间:2014-07-03 22:39:49

标签: 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;
    }

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

  1. 这里question说如果你在MPI_Init()之前初始化一个变量,那么另一个过程但是0会对初始化值失明,但是在我的输出文件中,所有不同id的过程输出r = 3和a[i]的正确值,这是否意味着我可以在调用MPI_Init()之前初始化变量或数组,并且所有进程将共享该变量的相同值?
  2. 输出有很多行“Hello world”,显然表示即使在调用MPI_Finalize()之后每个进程都在打印“Hello world”,为什么会这样?
  3. 顺便说一句,我正在使用mpicc来编译代码。

1 个答案:

答案 0 :(得分:5)

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

MPI_InitMPI_Finalize只是库调用,它们不应该更改控制流或删除在init之前分配的值(以及如何才能实现?)。

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

您所指的问题只是说过程0中的初始化不会初始化其他进程中的值。在那个问题中,数据是从文件中读取的,这可能只存在于进程0。

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

MPI_Finalize不会终止此过程。它只关闭MPI库。在此之后,进程仍然继续运行,尽管它们不能再进行交互。