C++ 无法通过MPI\u发送发送整个向量

C++ 无法通过MPI\u发送发送整个向量,c++,mpi,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)ran

我一直在努力学习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;
    }
}
谁能告诉我为什么会这样? 我运行了大约一百次相同的代码,仍然得到相同的输出(当然是不同的值),但最后三次总是0

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

我还有一个疑问。
有时输出(节点0和1的值)会重叠。有谁能告诉我如何阻止这种情况,或者至少解释一下为什么会发生这种情况。我的意思是,即使send和recv是阻塞函数。如何在节点0的输出之前打印节点1的输出

您对2D数据
n
的定义为
向量
使其在内存中不连续。因此,您不能简单地使用MPI来传输它(有很多方法可以做到这一点,但您最好只是让内存连续)

要使内存连续,可以这样声明
n
(未测试):

矢量数据(4*4)//实际数据的连续存储
载体n(4)//访问实际数据的指针向量

对于(int i=1;ithanks,我得到了,我只是在试验它。你能告诉我我问的另一件事吗(这就是为什么两个节点的输出在屏幕上重叠。)。有没有办法阻止它。我知道这两个节点可能在不同的时间处于代码的不同部分,但因为send和recv命令都被阻塞。接收后写入的内容怎么可能比发送前打印的内容早。如果你能回答这个问题,我可以安心了。谢谢。用于交错printings,这只是不同进程之间的竞争条件以及操作系统对输出的缓冲。有关更多详细信息,请参阅我阅读的链接。我知道这一部分。但正如所说的,我需要某种互斥或屏障来控制,对吗?这就是这里发生的情况。我在发送数据之前打印,然后再次打印因此,只有在节点0打印之后,我才会发送数据(在此期间,节点1保持阻塞状态),并且在节点1接收数据之后,它可以打印发送的数据。但有时我会在节点0打印之前打印发送的数据。您无法强制并行打印顺序。即使存在一些同步进程的障碍,OS/fs/任何东西也可以对其重新排序…因此,除非您打印到文件中并使用MPI-IO来确保来自不同线程的美国贡献被放置在正确的位置,您无法强制执行打印顺序。。。
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
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];