Я пытался распараллелить с этим 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
Я знаю, что все еще существует проблема с зависимостями данных, но я не знаю, как ее решить; действительно, измененные значения не учитывают новые. Это также может иметь проблемы при копировании данных. Когда я говорю, что это не работает, у меня нет никакого вывода (без ошибок и без вывода), оно просто напрямую падает.
Надеюсь, кто-то может мне помочь!
Спасибо много за помощь! С уважением,