OpenMP* REDUCTION 変数の一貫性のない使用

REDUCTION 変数が並列領域内で不適切に使用されています。

REDUCTION 節は、再帰的な数学的計算を並列で行う際に使用されます。それぞれのタスクでプライベートな一時変数が作成され、 領域の最後で、これらの一時変数が結合されて外部変数を更新します。例えば、すべての一時変数を加算して最終値を形成します。

並列領域の本体では、個々のスレッドへの作業配分が異なるため、REDUCTION 変数の値は予測不可能です。そのため、領域での REDUCTION の使用は、自身の更新に限定されます。さらに、REDUCTION 変数の更新は、それぞれの REDUCTION 節で指定されたものと同じ演算子で行われなければなりません。例えば、部分計算の乗算により最終結果が得られる場合は、REDUCTION 変数で値の加算を行っても意味がありません。

これらの規則により、REDUCTION 変数で行える操作には厳しい制約があります。次に、有効な使用法を示します。最後の 2 つは FORTRAN には適用されません。

ID

問題箇所

説明

1

無効な演算

REDUCTION 変数が誤用された場所


#include <omp.h>

int main(int argc, char **argv)
{
    int i, sum = 0;

    #pragma omp parallel for reduction(+:sum)
    for (i = 0; i < 1000; i++) {
        sum = 2 - sum; // wrong operator
    }
    return 0;
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。