Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MPI发送二维数组 我一直在努力实现用MPI和C++并行计算Burg'方程的离散域。_C++_Arrays_2d_Mpi - Fatal编程技术网

使用MPI发送二维数组 我一直在努力实现用MPI和C++并行计算Burg'方程的离散域。

使用MPI发送二维数组 我一直在努力实现用MPI和C++并行计算Burg'方程的离散域。,c++,arrays,2d,mpi,C++,Arrays,2d,Mpi,我一直在关注本页中提出的其他问题,但我没有得到预期的结果。现在,我已经通过使用两个处理器简化了问题,我只发送和接收到右侧和左侧的列组 为了初始化2d数组,我使用了以下函数: double **alloc_2d_int(int rows, int cols) { double *data = (double *)malloc(rows*cols*sizeof(double)); double **array= (double **)malloc(rows*sizeof(double

我一直在关注本页中提出的其他问题,但我没有得到预期的结果。现在,我已经通过使用两个处理器简化了问题,我只发送和接收到右侧和左侧的列组

为了初始化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;
}
理论上,在本例中,我希望水平发送列,但它将放置一行,我将获得以下结果:

我知道问题在于内存布局的结构如何,但我尝试了几种方法指向数据,但我无法获得结果

非常感谢你的帮助


干杯!:)

这里有简单的建议。如果您正在进行MPI,这通常意味着HPC,因此您希望改用1D数组,并使用2D函数/宏访问它


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

这里有简单的建议。如果您正在进行MPI,这通常意味着HPC,因此您希望改用1D数组,并使用2D函数/宏访问它


这也将导致一个MPI调用,而不是每行或每列一个,因此根本没有理由使用指向数组的指针数组。

Hi Matthieu,我曾尝试使用[I*Nx+j]形状的1d数组,但我无法正确发送和接收,因此我切换到这种类型的数组进行排序。该形状可能不是[I*Nx+j]!你通常会发送到另一个级别的整行或整列,因此形状应该是Nx的倍数。嗨,Matthieu,我尝试使用形状[I*Nx+j]的1d数组,但我无法正确发送和接收,所以我切换到这种类型的数组进行排序。形状可能不是[I*Nx+j]!您通常会将整行或整列发送到另一个列组,因此形状应该是Nx的倍数。
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;               
            }
        } 
 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);