Отправить 2d массив с использованием MPI - PullRequest
1 голос
/ 21 марта 2019

Я так старался добиться распараллеливания, используя MPI и C ++ вычисления для дискретизированной области для уравнения Бургера.

Я следил за другими вопросами, заданными на этой странице, но я не получил желаемых результатов.На данный момент я упростил задачу, работая с двумя процессорами, и я только отправляю и получаю ранг справа и слева.

Для инициализации 2d-массиваиспользовал эту функцию:

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;
}

Здесь временной вектор инициализируется нулями.Увеличьте размер на 2, чтобы иметь призрачную оболочку, в которой я могу расположить столбцы и строки, полученные из других рангов, и использовать их для вычисления центральной разности значений, расположенных по краям.

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);

Теоретически, в этом случае я хочу отправлять столбцы по горизонтали, но вместо этого я размещаю строку и получаюэти результаты: введите описание изображения здесь

Я знаю, что проблема в структуре памяти в том, как она структурирована, но я пробовал несколько способов указать на данные, и я не смогчтобы получить результаты.

Очень ценю вашу помощь.

Ура! :)

1 Ответ

0 голосов
/ 21 марта 2019

Простой совет здесь.Если вы используете MPI, это обычно означает HPC, поэтому вы хотите вместо этого использовать одномерный массив и обращаться к нему с помощью 2D-функции / макроса.

И это также приведет к одному вызову MPI вместо одногострока или столбец, так что нет никакой причины использовать массив указателей на массивы.

...