无法通过MPI_send发送整个矢量

时间:2016-03-01 18:52:26

标签: c++ mpi

我一直在努力学习MPI。当我尝试运行以下代码时,输​​出错误。

if (world_rank == 0){

    vector<vector<double> > n(4,vector<double>(4));

    srand(time(NULL));

    for(int i=0; i<4 ;i++){
        for(int j=0;j<4;j++){
            n[i][j] = (double)rand()/RAND_MAX;
            cout << n[i][j] << " ";
        }
        cout << endl;
    }
    MPI_Send((void*)&n[0][0],16*sizeof(double),MPI_BYTE,1,0,MPI_COMM_WORLD);
}else{
    MPI_Status status;

    vector<vector<double> > n(4,vector<double>(4));

    MPI_Probe(0,0,MPI_COMM_WORLD,&status);

    int size;

    MPI_Get_count(&status,MPI_BYTE,&size);

    cout << endl << size << endl;

    MPI_Recv((void*)&n[0][0],16*sizeof(n[0][0]),MPI_BYTE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);

    cout.flush();
    cout << endl;

    for(int i=0; i<4 ;i++){
        for(int j=0;j<4;j++){
            cout << n[i][j] << " ";
        }
        cout << endl;
    }
}

除了最后3个,我得到所有的双倍值。 像这样。

0.824468 0.752417 0.757125 0.470763 
0.251683 0.703306 0.157991 0.764423 
0.815327 0.0402807 0.897109 0.313816 
0.997203 0.796665 0.0522305 0.797733 

128

0.824468 0.752417 0.757125 0.470763 
0.251683 0.703306 0.157991 0.764423 
0.815327 0.0402807 0.897109 0.313816 
0.997203 0 0 0

谁能告诉我为什么会这样? 我运行相同的代码大约一百次,仍然得到相同的输出(当然有不同的值),但最后三个总是0。

但是当我将大小从16改为19时,我得到所有的值。

我还有另一个疑问。 有时输出(来自节点0和1的值)重叠。任何人都可以告诉我如何制止或至少解释为什么会发生这种情况。我的意思是即使send和recv是阻塞功能。如何在节点0的

之前打印节点1的输出

1 个答案:

答案 0 :(得分:3)

您将2D数据n定义为vector<vector<double> >会使其在内存中不连续。因此,你不能简单地使用MPI传输它(有很多方法可以实现它,但你最好只是让内存连续)。

为了让你的记忆连续,你可以声明你的n这样(未经测试):

vector<double> ndata(4*4); //contiguous storage of the actual data
vector<double*> n(4);      //vector of pointers to access the actual data
for (int i=1; i<4; i++)    //initialisation of the pointers to the data
    n[i] = &ndata[4*i];

当然,有更好的方法可以在C ++中为多维数组定义连续存储,但这只是对您当前问题的快速解决方案。例如,请参阅this answer以获得更好的结构。

而且顺便说一句,您的MPI_Send()MPI_Recv()来电应该使用4*4 MPI_DOUBLE代替4*4*sizeof(double) MPI_BYTE