c ++ MPI_Bcast类

时间:2014-07-02 21:26:17

标签: c++ mpi

使用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不起作用,并且给出了分段错误!我不知道问题出在哪里......

1 个答案:

答案 0 :(得分:1)

如果处理器等级不为0,则矩阵a的大小为1x1。处理器1,2,3的缓冲区不能适合处理器0广播的所有数据。您必须在其他处理器上初始化a到适当的大小。

编辑:更清楚一点,接收处理器上a.give_address(0)指向的数组必须是至少大小计数(在你的情况下,计数是3 * 3)。