簡體   English   中英

在 MPI 中的一個/所有進程中初始化變量

[英]Initializing variables in one/all processes in 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, 0, 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, 0, 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, 0, MPI_COMM_WORLD)是錯誤的,因為Nsize_t變量,而不是int Sending size_t type data with MPI的一個很好的答案是通過編寫一個宏來解決這個問題。 那么正確的行是MPI_Bcast(&N, 1, my_MPI_SIZE_T, 0, MPI_COMM_WORLD) 這樣,'std:bad_alloc' 問題就解決了。
  2. MPI_Bcast(&A, N*N, MPI_DOUBLE, 0, MPI_COMM_WORLD給出了分段錯誤。也許,因為A不是一個緩沖區。但是, A.mat是,所以正確的行是這樣的: MPI_Bcast(&A.mat[0][0], N*N, MPI_DOUBLE, 0, MPI_COMM_WORLD) . 現在一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM