Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

3.2.4 縮約変数

ループの繰り返し間に実際の依存性が存在しており、依存性の原因となる変数をスレッド固有化するだけでは依存性を除去できない場合があります。たとえば、ある繰り返しから別の繰り返しへ値が累積される次のコードを見てみます。

使用例 3-11  並列化される可能性のあるループ
for (i=1; i < 1000; i++) {
    sum += a[i]*b[i]; /* S1 */
}

この例では、ループは 2 つの配列のベクトル積を計算して、sum と呼ばれる共通変数に入れます。このループを単純な方法で並列化することはできません。ここでは、文 S1 の計算式に結合の法則を適用し、各スレッドに対して psum[i]というスレッド固有変数を割り当てることができます。変数 psum[i] のコピーはそれぞれ 0 に初期化されます。各スレッドは、スレッド固有の変数 psum[i] に自分で計算した部分和を代入します。バリアに達したら、すべての部分和を合計してオリジナルの変数 sum に代入します。この例では、和の縮約をしているので、変数 sum を縮約変数といいます。しかし、スカラー変数を縮約変数にした場合には、丸め誤差が累積されて、sum の最終値に影響する可能性があることに注意してください。コンパイラは、ユーザーによる明確な指示がされた場合に、この操作を実行します。