У меня есть вложенный цикл: (L и А полностью определены входы)Последовательные и параллельные версии дают разные результаты - Почему?
#pragma omp parallel for schedule(guided) shared(L,A) \
reduction(+:dummy)
for (i=k+1;i<row;i++){
for (n=0;n<k;n++){
#pragma omp atomic
dummy += L[i][n]*L[k][n];
L[i][k] = (A[i][k] - dummy)/L[k][k];
}
dummy = 0;
}
И его последовательная версия:
for (i=k+1;i<row;i++){
for (n=0;n<k;n++){
dummy += L[i][n]*L[k][n];
L[i][k] = (A[i][k] - dummy)/L[k][k];
}
dummy = 0;
}
Они оба дают разные результаты. Параллельная версия намного медленнее, чем последовательная версия.
Что может вызвать проблему?
Edit:
Чтобы избавиться от проблем, вызванных атомной директивой, я изменил код следующим образом:
#pragma omp parallel for schedule(guided) shared(L,A) \
private(i)
for (i=k+1;i<row;i++){
double dummyy = 0;
for (n=0;n<k;n++){
dummyy += L[i][n]*L[k][n];
L[i][k] = (A[i][k] - dummyy)/L[k][k];
}
}
Но это также не сработало проблему. Результаты по-прежнему различны.
Если вы работаете над числами с плавающей точкой, читать эту Http: // StackOverflow .com/a/8991640/893693 – inf