作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在用下面的代码测试 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 个核心来运行代码。但输出在 2 个方面令人惊讶,
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 库。进程在此之后仍然继续运行,尽管它们不能再交互。
关于c++ - 在 MPI_Init() 之前初始化变量,在 MPI_Finanlize() 之后初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564305/
标签中获取换行符
我一直在用下面的代码测试 mpi 究竟是如何工作的 #include #include using namespace std; int main(int argc
我是一名优秀的程序员,十分优秀!