OpenMP* THREADPRIVATE 変数の誤用

並列領域内で最後に代入された THREADPRIVATE 変数が、その領域外で使用されています。

THREADPRIVATE 宣言子は、変数を複製して、それぞれのスレッドで独自のコピーを持つように指定します。OpenMP* は、予期できない方法でスレッドに処理を割り当てるため、特定のスレッドのプライベート・コピーの値がスケジューリング・ポイントの後に中間値となります。このエラー診断は、値が中間状態にあるときに THREADPRIVATE 変数が読み取られた場合にレポートされます。

THREADPRIVATE 変数の値は、主に 2 つの場合に中間状態となります。1 つ目は、変数が変更された並列領域を終了した時点です。ここでの問題は、どのスレッドがどの代入を実行するのか予測することが一般に不可能であることです。もう 1 つは、並列領域を開始する時点です。ここでの問題は、どのスレッドが領域を実行するチームに参加するのか予測することが一般に不可能であることです。並列領域に COPYIN 節がある場合、チームの各メンバーのプライベート・コピーは、エントリー時にマスタースレッドの変数の値で初期化されます。

このメッセージは、特に、ある並列領域で THREADPRIVATE 配列変数に値が代入され、その並列領域外でその値が読み取られた場合にレポートされます。

ID

問題箇所

説明

1

不正なメモリーアクセス

変数が使用された場所

2

メモリー書き込み

変数が最後に代入された場所


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

int a[1000];
#pragma omp THREADPRIVATE(a)

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

#pragma omp parallel for
    for (i = 0; i < 1000; i++) {
       a[i] = i;
    }
    
    for (i = 0; i < 1000; i++) {
        sum = sum + a[i];  // bad: used "a" after parallel
    }

    printf("%d\n", sum);
    
    return 0;
}
        

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