OpenMP - распараллелить цикл - PullRequest
       22

OpenMP - распараллелить цикл

1 голос
/ 11 января 2020

Я пытался распараллелить с этим l oop с OpenMP

#define AX(i,j,k) (Ax[((k)*n+(j))*n+(i)])
for (int k = k1; k < k2; ++k) {
    for (int j = j1; j < j2; ++j) {
        for (int i = i1; i < i2; ++i) {
            double xx = AX(i,j,k);
            double xn = (i > 0)   ? AX(i-1,j,k) : 0;
            double xe = (j > 0)   ? AX(i,j-1,k) : 0;
            double xu = (k > 0)   ? AX(i,j,k-1) : 0;
            AX(i,j,k) = (xx+xn+xe+xu)/6*w;
        }
    }
}
#undef AX

Я поместил это в верхней части этого кода:

#pragma omp parallel for private (k,j,i) shared(Ax)

Я заметил, однако, что #pragma не работает, так как моя функция одновременно быстрее, но генерирует более противоречивые результаты (возможно, из-за зависимостей данных).

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

РЕДАКТИРОВАТЬ:

Хорошо, спасибо, я понимаю, почему это не работает, но я попробовал, почему вы сказали, и, к сожалению, он все еще не работает , Тем не менее, я знаю проблему, но я не знаю, как ее решить.

void ssor_forward_sweep(int n, int i1, int i2, int j1, int j2, int k1, int k2, 
                    double* restrict Ax, double w)
{

int k,j,i;

double* AxL=malloc(n*sizeof(double));
for (int a=0; a < n;a++){
AxL[a]=Ax[a];
}
#define AX(i,j,k) (Ax[((k)*n+(j))*n+(i)])
#define AXL(i,j,k) (AxL[((k)*n+(j))*n+(i)])

#pragma omp parallel for private (k,j,i) shared(Ax)
for (k = k1; k < k2; ++k) {
    for (j = j1; j < j2; ++j) {     
        for (i = i1; i < i2; ++i) {

            double xx = AXL(i,j,k);
            double xn = (i > 0)   ? AXL(i-1,j,k) : 0;
            double xe = (j > 0)   ? AXL(i,j-1,k) : 0;
            double xu = (k > 0)   ? AXL(i,j,k-1) : 0;
            AX(i,j,k) = (xx+xn+xe+xu)/6*w;
            //AXL(i,j,k) = (xx+xn+xe+xu)/6*w;
        }
    }
}
#undef AX
#undef AXL

Я знаю, что все еще существует проблема с зависимостями данных, но я не знаю, как ее решить; действительно, измененные значения не учитывают новые. Это также может иметь проблемы при копировании данных. Когда я говорю, что это не работает, у меня нет никакого вывода (без ошибок и без вывода), оно просто напрямую падает.

Надеюсь, кто-то может мне помочь!

Спасибо много за помощь! С уважением,

...