使用MPI发送二维数组

时间:2019-03-21 10:41:59

标签: c++ arrays 2d mpi

我一直在努力尝试使用MPI和C ++并行化Burger方程的离散域的计算。

我一直在关注此页面中提出的其他问题,但未获得期望的结果。目前,我通过使用2个处理器简化了问题,而我只发送​​和接收左右两侧的行。

为了初始化2d数组,我使用了以下功能:

double **alloc_2d_int(int rows, int cols) {
    double *data = (double *)malloc(rows*cols*sizeof(double));
    double **array= (double **)malloc(rows*sizeof(double*));
    for (int i=0; i<rows; i++)
        array[i] = &(data[cols*i]);

    return array;
}

在这里,时间矢量初始化为零。将大小增加2倍,以获得鬼壳,我可以在其中放置从其他等级接收的列和行,并使用它们来计算位于边缘的值的中心差。

temp = alloc_2d_int(Ny_P+2,Nx_P+2);
           for (unsigned i=0; i < Ny_P+2; i++)
        {
            for (unsigned j=0; j < Nx_P+2; j++)
            {
               temp[i][j]=0;               
            }
        } 

我简化了仅用1填充域的问题。

 for (unsigned i=1; i < Ny_P+1; i++)
        {
            for (unsigned j=1; j < Nx_P+1; j++)
            {
               temp[i][j]=1;
            }
        }

然后在每个时间步骤,我都会接收和发送。我现在只通过左右发送和接收来工作。

            MPI_Issend(&(temp[Ny_P][1]), Nx_P, MPI_DOUBLE, rankright, 2, MPI_COMM_WORLD, &request5);
            MPI_Irecv(&(temp[0][1]), Nx_P, MPI_DOUBLE, rankleft, 2, MPI_COMM_WORLD, &request6);
            MPI_Issend(&(temp[1][1]), Nx_P, MPI_DOUBLE, rankleft, 3, MPI_COMM_WORLD, &request7);
            MPI_Irecv(&(temp[Ny_P+1][1]), Nx_P, MPI_DOUBLE, rankright, 3, MPI_COMM_WORLD, &request8);

从理论上讲,在这种情况下,我想水平发送列,但是要放置一行,而我得到的结果是:enter image description here

我知道问题出在内存布局的结构中,但是我尝试了几种方法来指向数据,但我无法获得结果。

非常感谢您的帮助。

干杯!:)

1 个答案:

答案 0 :(得分:0)

这里的简单建议。如果您正在执行MPI,则通常意味着HPC,因此您想改用一维数组,并使用2D函数/宏对其进行访问。

这还将导致一次MPI调用,而不是每行或每列一次,因此完全没有理由使用指向数组的指针数组。