在MPI中的一个/所有进程中初始化变量

问题描述

我是MPI的新手,对我来说有些不清楚。

比方说,在我的程序中,我有一个矩阵,而流程必须对其进行转换(每个流程负责多个列)。我必须初始化此矩阵,但是要这样做,我需要从用户那里获取它的大小。我希望所有输入/输出都发生在第0个进程中。我无法在if(rank==0)内部初始化矩阵,因为那样矩阵就不会在其外部存在。但是,如果我在if之外初始化矩阵,那么这种初始化不会在每个进程中发生吗?可以吗不会造成任何问题吗?我说的是这样的代码

struct Matrix{
    vector<vector<double>> mat;
    size_t m;
    size_t n;

    Matrix(size_t a,size_t b);
    Matrix(const vector<vector<double>> &mat);
    Matrix();
};

Matrix::Matrix(size_t a,size_t b)
{
    m=a;
    n=b;
    mat=vector<vector<double>>(m,vector<double>(n));
}

Matrix::Matrix(vector<vector<double>> const &arr)
{
    m=arr.size();
    n=arr[0].size();
    mat=arr;
}

Matrix::Matrix()
{
    m=0;
    n=0;
}

int main(int argc,char **argv)
{
    size_t N;
    int rank;

    if(MPI_Init(&argc,&argv)!=MPI_SUCCESS)
    {
        cout<<"Error 1";
        MPI_Finalize();
        return 0;
    }
    if(MPI_Comm_rank(MPI_COMM_WORLD,&rank)!=MPI_SUCCESS)
    {
        cout<<"Error 2";
        MPI_Finalize();
        return 0;
    }

    if(rank==0)
    {
        cout<<"Size of the matrix: "<<endl;
        cin>>N;
    }

    if(MPI_Bcast(&N,1,MPI_INT,MPI_COMM_WORLD)!=MPI_SUCCESS)
    {
        cout<<"Error 4";
        MPI_Finalize();
        return 0;
    }

    Matrix A(N,N); // happens in every process
    if(MPI_Bcast(&A,N*N,MPI_DOUBLE,MPI_COMM_WORLD)!=MPI_SUCCESS)
    {
        cout<<"Error 5";
        MPI_Finalize();
        return 0;
    }

    MPI_Finalize();
    return 0;
}

整个MPI系统似乎不如使用<pthread.h>更具逻辑性,因为如果我正确理解,现在int main()正在所有工作人员之间共享,我需要公平地使用MPI_Bcast(...)通常是为了让过程看到矩阵的现代外观。

谢谢。

解决方法

Gilles Gouaillardet对我的初始化困境发表了评论。关于我的代码未编译(以“ std:bad_alloc”退出)的事实,我找到了解决方法。

  1. MPI_Bcast(&N,1,MPI_INT,MPI_COMM_WORLD)是错误的,因为Nsize_t变量,而不是int。来自Sending size_t type data with MPI的一个漂亮答案通过编写宏来解决。 然后正确的行是MPI_Bcast(&N,my_MPI_SIZE_T,MPI_COMM_WORLD)。这样就解决了“ std:bad_alloc”问题。
  2. MPI_Bcast(&A,N*N,MPI_DOUBLE,MPI_COMM_WORLD给出了分段错误。也许是因为A并不是一个缓冲区。但是,A.mat是这样,因此正确的行是这样的:MPI_Bcast(&A.mat[0][0],MPI_COMM_WORLD)。现在一切正常。