我在使用MPI_Bcast时遇到问题。一个处理器初始化该类,然后将其发送给其他处理器。这是我的课:
class A{
private:
unsigned rows, cols;
std::vector<int> elem;
public:
//default costructor
A(): rows(1), cols(1), elem(1,0){
}
//costructor
A(unsigned r, unsigned c):
rows(r), cols(c){
elem.resize(rows*cols);
for(unsigned i=0; i<rows*cols; i++)
elem[i]=i+1;
}
//return the address of an element
int* give_address(unsigned i){
return &elem[i];
}
//destructor
~A(){}
};
这是我主要要做的:
int main(int argc, char **argv){
MPI_Init(&argc, &argv);
int rank, np;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&np);
A a;
if(np==1){
std::cout<< "Only one!" << std::endl;
}else{
if(rank==0){
a=A(3,3);
}
MPI_Bcast(a.give_address(0),3*3,MPI_INT,0,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
但是,Bcast无法正常工作,并且给出了分段错误!我不知道问题出在哪里...
最佳答案
如果处理器等级不为0,则矩阵a的大小为1x1。处理器1,2,3 ...的缓冲区无法容纳处理器0广播的所有数据。您还必须在其他处理器上将a初始化为适当的大小。
编辑:更清楚地说,在接收处理器上由a.give_address(0)指向的数组必须为最小大小计数(在您的情况下为3 * 3)。
关于c++ - c++ MPI_Bcast类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24541293/