OpenMP* REDUCTION 変数への領域外アクセス

OpenMP* REDUCTION 変数が領域外でアクセスされています。

OpenMP* では、REDUCTION 節により効率的に名前付き変数の参照をスレッド・プライベート・コピー (一時変数) の参照に置換できます。この一時変数は、REDUCTION 節を含む OpenMP* 構造範囲内でのみ有効です。プロシージャー呼び出しにより制御が構造外に移動され、そのプロシージャーで同じ名前の変数にアクセスした場合、 この一時変数ではなく、外部変数が参照されます。この問題は、REDUCTION 節の意図に反するものであり、これにより、プログラムが並列モードとシーケンシャル・モードで異なる動作をします。

また別の見方として、REDUCTION 節が OpenMP* 構造の静的スコープ内でのみ有効になっていますが、動的スコープ全体で有効にする必要があることを示しています。

構造から呼び出されたサブルーチンで REDUCTION 変数にアクセスすることは可能ですが、ポインターまたは参照パラメーターを介したアクセスに限定されます。この場合、参照パラメーターまたはポインターはスレッド・プライベートな一時変数を参照します。唯一の規則として、呼び出されたサブルーチンではこの一時変数に名前でアクセスすることはできません。

ID

問題箇所

説明

1

OpenMP* 宣言

REDUCTION 節の場所

2

メモリー書き込み

REDUCTION 変数が代入された場所


#include <stdio.h>
#include <omp.h>

int a[1000];
int k = 0;

// subroutine accesses k as global variable
// can't call this from a region where k is
// marked as a reduction variable
void mysub()
{
    k++;
}

int main(int argc, char **argv)
{
    int i;
    #pragma omp parallel for reduction(+:k)
    for (i = 0; i < 1000; i++) {
        mysub();
        k++;
    }
    return 0;
}
        

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