PRIVATE 変数の使用方法によっては、シーケンシャル・モードと並列モードで異なる動作をすることがあります。
この診断は、変数が PRIVATE として指定された並列領域内で最後に代入された後に、その並列領域外で使用された場合に出力されます。PRIVATE 変数は、並列領域から出る時点で中間値が格納されます。そのため、この使用法は、初期化されていない変数からの読み取りと同じになります。
並列モードでは、PRIVATE 変数は、その領域内でスレッドごとの一時変数に置き換えられます。外部変数の値は、スレッドごとの一時変数にコピーされず、スレッドごとのプライベート変数に代入された値は、外部変数にコピーされません。外部変数の値をコピーインする場合は、PRIVATE ではなく、FIRSTPRIVATE を使用します。プライベート変数の値をコピーアウトする場合は、PRIVATE ではなく、LASTPRIVATE を使用します。LASTPRIVATE は、並列ループの最後の反復または SECTIONS 構造で字句的に最後の SECTION を実行するスレッドからの値で外部変数を更新します。
ID |
問題箇所 |
説明 |
---|---|---|
1 |
OpenMP* の使用方法に関するエラー |
PRIVATE が指定された場所 |
#include <stdio.h> #include <omp.h> int b; void do_work() { int i; #pragma omp parallel private (b) { #pragma omp for ordered for (i = 0; i < 6; i++) { b = i; #pragma omp ordered printf("itt = %d thr = %d b=%d\n", i, omp_get_thread_num (), b); } } printf("b=%d\n", b); // error: use value assigned in region } int main(int argc, char **argv) { b = 100; omp_set_num_threads(3); do_work(); return 0; }
© 2010 Intel Corporation. 無断での引用、転載を禁じます。