如何解决在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”退出)的事实,我找到了解决方法。
-
MPI_Bcast(&N,1,MPI_INT,MPI_COMM_WORLD)
是错误的,因为N
是size_t
变量,而不是int
。来自Sending size_t type data with MPI的一个漂亮答案通过编写宏来解决。 然后正确的行是MPI_Bcast(&N,my_MPI_SIZE_T,MPI_COMM_WORLD)
。这样就解决了“ std:bad_alloc”问题。 -
MPI_Bcast(&A,N*N,MPI_DOUBLE,MPI_COMM_WORLD
给出了分段错误。也许是因为A
并不是一个缓冲区。但是,A.mat
是这样,因此正确的行是这样的:MPI_Bcast(&A.mat[0][0],MPI_COMM_WORLD)
。现在一切正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。