나는 중첩 루프가 : (L 및 A는 완전히 입력 정의)순차 및 병렬 버전의 결과가 다릅니다 - 이유가 무엇입니까?
#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;
}
. 그리고 병렬 버전은 순차 버전보다 훨씬 느립니다.
무엇이 문제입니까?
편집 : 다음과 같이
이 원자 지시에 의해 발생하는 문제를 제거하기 위해, 나는 코드를 수정 :
#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];
}
}
을 그러나 그것은 또한 문제를 해결하지 않았다. 결과는 여전히 다릅니다.
예를 들어,이 스레드 별해야하기 때문에 변수
n
에서, OMP 프라그 내에서 선언되어야 루프 : // 유래 .com/a/8991640/893693 – inf