ネストされた for ループの並列化に問題があります。コードは次のようになります
for( k = 0; k < m; k++ ) {
for( i = 0; i < k; i++ ) {
s = 0.0;
#pragma omp parallel for default(none) shared(i, k, q, m, n) private(j) reduction(+:s)
for( j = 0; j < n; j++ ) {
s += q[ i ][ j ] * q[ k ][ j ];
}
}
}
このコードは機能しますが、'k' および 'i' ループの下でスレッドを何度も作成および破棄するときのオーバーヘッドが原因で、実行速度が非常に遅くなります。
理想的には、私はこのようなものが欲しい
#pragma omp parallel default(none) shared(i, k, q, m, n, s) private(j)
for( k = 0; k < m; k++ ) {
for( i = 0; i < k; i++ ) {
s = 0.0;
#pragma omp for reduction(+:s)
for( j = 0; j < n; j++ ) {
s += q[ i ][ j ] * q[ k ][ j ];
}
}
}
並列領域が一度だけ作成される場所。しかし、私は間違った結果を得ています。これは、変数「s」が共有されているためだと思います。
「s」を共有して削減を実行する方法はありますか?
ありがとう!
PS 'k' または 'i' ループは以前の反復に依存しているため、並列化できません。