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