c++ MPI_Bcast class

c++ MPI_Bcast class

本文关键字:class Bcast MPI c++      更新时间:2023-10-16

我有一个问题使用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(){}
};

这是我在main中所做的:

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)在接收处理器上指向的数组必须至少是大小count(其中count在您的情况下是3*3)。