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. 無断での引用、転載を禁じます。