gpt4 book ai didi

c++ - 在 MPI_Init() 之前初始化变量,在 MPI_Finanlize() 之后初始化变量

转载 作者:太空狗 更新时间:2023-10-29 11:37:31 24 4
gpt4 key购买 nike

我一直在用下面的代码测试 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 个方面令人惊讶,

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

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

最佳答案

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

MPI_InitMPI_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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com