Iは、ネストされたループを有する:(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プラグマ内で宣言する必要がありますループ、:// stackoverflowの.com/a/8991640/893693 – inf