我有一個嵌套的循環:(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];
}
}
但它也沒有工作出了問題。結果仍然不同。
如果您在浮點數操作,請閱讀此http://計算器.com/a/8991640/893693 – inf 2012-04-07 08:21:46