我一直在测试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个内核来运行代码。但输出在某些方面令人惊讶,有两个方面,
a[i]
的正确值,这是否意味着我可以在调用MPI_Init()之前初始化变量或数组,并且所有进程将共享该变量的相同值?顺便说一句,我正在使用mpicc来编译代码。
答案 0 :(得分:5)
在MPI_Init
之前和MPI_Finalize
之后执行代码是完全有效的。当然,你不允许在该代码中使用MPI,否则它只是普通的C ++。
MPI_Init
和MPI_Finalize
只是库调用,它们不应该更改控制流或删除在init之前分配的值(以及如何才能实现?)。
MPI_Init
不会取消变量的初始化。
您所指的问题只是说过程0中的初始化不会初始化其他进程中的值。在那个问题中,数据是从文件中读取的,这可能只存在于进程0。
请注意MPI_Init
不会创建新进程。它不像fork
。所有流程都是在程序启动之前创建的(最有可能是mpirun
)。在您的情况下,每个进程都会初始化其数组。
MPI_Finalize
不会终止此过程。它只关闭MPI库。在此之后,进程仍然继续运行,尽管它们不能再进行交互。