使用MPI发送和接收3D矩阵(C)

时间:2018-11-16 06:50:54

标签: c mpi

我有两个线程(等级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。

0 个答案:

没有答案