Отправить и получить 3D матрицу с MPI (C) - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть два потока (ранга 0 и 1), каждый из которых содержит трехмерную матрицу (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, y, z) ранга 1 на (3, y, z) ранга 0 и (4, y, z) ранга 0 на (1, y, z) из ранг 1.

...