[英]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' 退出)的事實,我找到了解決方法。
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD)
是錯誤的,因為N
是size_t
變量,而不是int
。 Sending size_t type data with MPI的一個很好的答案是通過編寫一個宏來解決這個問題。 那么正確的行是MPI_Bcast(&N, 1, my_MPI_SIZE_T, 0, MPI_COMM_WORLD)
。 這樣,'std:bad_alloc' 問題就解決了。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.