私は3D配列z
を持っています。すべての要素の値は1
です。OpenMPの崩壊が間違った結果をもたらす
今、私が行います
#pragma omp parallel for collapse(3) shared(z)
for (int i=0; i < SIZE; ++i) {
for (int j=0; j < SIZE; ++j) {
for (int k=0; k < SIZE; ++k) {
for (int n=0; n < ITERATIONS-1; ++n) {
z[i][j][k] += 1;
}
}
}
}
これは、各要素にITERATIONS
を追加する必要がありますし、それはありません。 collapse(3)
をcollapse(4)
に変更すると(for-loopsが4つあるため)、私は正しい結果を得られません。
4つのループをすべて折りたたむことはできませんか?
少なくとも1つのスレッドがライターである場合、複数のスレッドは同期なしで同じメモリ位置にアクセスできません。 'z [i] [j] [k]'を更新する前に、 '#pragma omp atomic update'を追加しようとするとよいでしょう。とにかく、メモリフェンスとキャッシュ競合のために遅くなるでしょう。 Gillesが示唆しているように、削減を使用するほうがはるかに優れています。 –
含まれている最も内側のループで折り畳まれることはほとんど意味を持ちませんが、 'schedule(static、16)'を追加するとパフォーマンスが向上します。 –