我有以下标准方法来创建连续的2D数组(双精度)
double** array2D (int r, int c)
{
/*Creates a 2D array*/
double* B = (double *)malloc(r*c* sizeof(double));
assert(NULL != B);
double** A = (double **)malloc(sizeof(double *)*r);
assert(A);
A[0] = B;
for (int i=1; i<=r; i++) A[i] = A[i-1] + c;
return A;
}
使用此函数,我将为MPI中的不同等级进程创建不同长度的数组。这是代码(numtasks
是进程总数,taskid
是进程等级,MASTER
被定义为0
):
if (taskid==numtasks-1)
{
u_old = array2D(rend+1,c);
u_new = array2D(rend+1,c);
MPI_Recv(&u_old[0][0], (rend+1)*c, MPI_DOUBLE, MASTER, 75, MPI_COMM_WORLD, &status);
}
else if(taskid!=0 && taskid!=numtasks-1)
{
u_old = array2D(rend+2,c);
u_new = array2D(rend+2,c);
MPI_Recv(&u_old[0][0], (rend+2)*c, MPI_DOUBLE, MASTER, 75, MPI_COMM_WORLD, &status);
}
说,当我用4个进程运行这部分代码时,else if
块由进程1和2运行。在使用Arm DDT调试器时,我看到u_old
和{ {1}}的进程1和2具有相同的内存地址(我没想到!),而进程3的u_new
和{{1}具有不同的地址}。如何使进程1和2分别为各自的u_old
和u_new
具有不同的存储位置?