我有两个线程(等级0和1),每个线程都包含一个3D矩阵(x0,y,z)和(x1,y,z),其x方向尺寸不同。我想从第一个线程向第二个线程发送特定平面(x0常数,y,z),并替换它的一个面(x1常数,y,z)。当两个矩阵具有相同的维度(即使在x中)时,我编写的以下代码似乎也可以很好地工作,但是当x0!= x1时,它们不能发送右面:
double ***alloc2(int x, int y,int z){
int i, j;
double ***array = (double ***) malloc(sizeof(double ***)*x);
for (i = 0; i<x; i++){
array[i] = (double **) malloc(sizeof(double*)*y);
for (j=0; j<y; j++){
array[i][j] = (double *) malloc(sizeof(double)*z);}}
return array;
}
int main(int argc, char *argv[]){
MPI_Status status;
MPI_Comm_size(MPI_COMM_WORLD, &nbr);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* Some long code I skiped */
/* ... */
MPI_Datatype sub;
MPI_Type_vector(nL+1, nL+1, nL_thread, MPI_DOUBLE, &sub);
MPI_Type_commit(&sub);
if(rank == 0){
MPI_Send(&c_new[3][0][0], 1, sub, rank+1,01, MPI_COMM_WORLD);
MPI_Recv(&c_new[4][0][0], 1, sub, rank+1,10, MPI_COMM_WORLD, &status);}
if(rank == 1){
MPI_Recv(&c_new[0][0][0], 1, sub, rank-1,01, MPI_COMM_WORLD, &status);
MPI_Send(&c_new[1][0][0], 1, sub, rank-1,10, MPI_COMM_WORLD);}
}
nL是y和z维度的长度,所有线程都相同,nL_thread是x维度(在这种特殊情况下,nL_thread = 3表示等级1,4表示等级0)。在这里我试图用等级0的(3,y,z)替换等级1的面(0,y,z),并用的(1,y,z)替换等级0的(4,y,z)排名1。