初期化されていない OpenMP* THREADPRIVATE 変数

COPYIN 節によって適切に初期化されていない THREADPRIVATE 変数が並列領域で使用されています。

THREADPRIVATE 宣言子は、変数を複製して、それぞれのスレッドで独自のコピーを持つように指定します。並列領域のエントリーポイントでは、どのスレッドが領域を実行するチームに参加するのか予測できないため、THREADPRIVATE 変数の値は通常不定です。そのため、変数を使用する前に初期化する必要があります。並列領域外で発生した以前の代入から初期値を予測することは、ほとんど不可能です。

並列領域のエントリーポイントで THREADPRIVATE 変数を初期化する最も一般的な方法は、COPYIN 節を使用することです。これにより、THREADPRIVATE 変数のマスター・スレッド・コピーの値がチーム内のほかのスレッドのプライベート・コピーにコピーされます。

OpenMP* は、非初期スレッドの THREADPRIVATE 変数にあるデータの値が、ごく限られた状況下において 2 つの並列領域間で保持されることのみ保証します。特に、2 つの並列領域は同じ番号のスレッドによってシーケンシャルに実行され、どちらの領域も明示的な並列領域内に (動的に) 入れ子されていてはなりません。さらに、両方の並列領域で dyn-var 内部制御変数は偽でなければなりません。これらすべての条件が満たされた場合は、それぞれの領域の同じスレッド番号の THREADPRIVATE 変数がその変数の同じコピーにアクセスします。そうでない場合は、THREADPRIVATE 変数は並列領域のエントリーポイントで初期化されていないとみなす必要があります。

ID

問題箇所

説明

1

OpenMP* の使用方法に関するエラー

THREADPRIVATE 変数の使用

2

メモリー書き込み

最後の代入

3

OpenMP* 宣言

この使用法を含む領域


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

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

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

    for (i = 0; i < 1000; i++) {
        a[i] = i;
    }
#pragma omp parallel for reduction (+:sum) // copyin is needed
    for (i = 0; i < 1000; i++) {
        sum = sum + a[i];
    }
    printf("%d\n", sum);
    return 0;
}
        

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