Я так старался добиться распараллеливания, используя 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);
Теоретически, в этом случае я хочу отправлять столбцы по горизонтали, но вместо этого я размещаю строку и получаюэти результаты: введите описание изображения здесь
Я знаю, что проблема в структуре памяти в том, как она структурирована, но я пробовал несколько способов указать на данные, и я не смогчтобы получить результаты.
Очень ценю вашу помощь.
Ура! :)