我一直在努力实现使用 MPI 和 C++ 对 Burger 方程的离散域计算进行并行化。
我一直在关注此页面中提出的其他问题,但没有获得预期的结果。此刻,我通过使用 2 个处理器简化了问题,我只发送和接收到右侧和左侧的等级。
为了初始化二维数组,我使用了这个函数:
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;
}
此处时间 vector 被初始化为零。将大小增加 2 以获得 ghost shell,我可以在其中放置从其他等级接收的列和行,并使用它们来计算位于边缘的值的中心差异。
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
我知道问题出在内存布局的结构上,但我尝试了几种指向数据的方法,但无法获得结果。
非常感谢您的帮助。
干杯!:)
最佳答案
这里有简单的建议。如果您正在执行 MPI,这通常意味着 HPC,因此您想改用一维数组并使用二维函数/宏访问它。
这也会导致一次 MPI 调用,而不是每行或每列一次调用,因此根本没有理由使用指向数组的指针数组。
关于c++ - 使用 MPI 发送二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55278607/