<<  21  >> インテル® C/C++ コンパイラー OpenMP* 活用ガイド デュアルコア・マルチコア対応アプリケーション開発A れる毎に作成されます。従って、これらの変数の値は並列実行領域の開始時点では、全て値が未定義になっています。 for ループ制御変数は、 OpenMP* で、全て private 属性の変数と定義されます。 shared (list) OpenMP* でのデータスコープは指定が無い場合には、プログラム内で一つの記憶域として管理される属 性となります。 default (shared | private | none) default 宣言句は、並列領域内にある全ての変数のデータ属性に対して、省略時(変数の定義がない場合)の取 り扱いを private 属性とするか、shared 属性とするかを指定します。 default (private)を指定した場合、threadprivate で指定されたグローバル変数を除き、並列領域にある全ての 変数をスレッドにプライベートなコピーを作成します。これは一つ一つの変数を private(list) に記載した場合と同じ になります。 default (shared) を指定した場合、並列実効領域にある全ての変数は全てのスレッドによって共有されます。明 示的に default の指定をしていない場合は、default (shared) となります。 default (none) を指定した場合、private 属性と shared 属性のスコーピングに関しては何ら規定値を持たないこ とを指示します。この場合、並列領域にある全ての変数について、private、shared、firstprivate、lastprivate、 あるいは reduction のスコーピング属性を与える必要があります。 変数は private、shared、firstprivate、lastprivate、あるいは reduction の指定によって、デフォルトの指定から 除外することも可能です。したがって、次のような指定方法も問題ありません。 #pragma omp default (private) #pragma firstprivate(i) shared(x) #pragma shared(s) lastprivate(i) firstprivate ( list ) firstprivate は private のスーパーセットです。 list に記述された変数は private の取り扱いと同じになりますが、そ の値は並列実行領域の開始時に逐次実行部分の変数の持つ値を各スレッドの private 変数に値がコピーされます。      b = 23.0;       . . . . . #pragma omp parallel firstprivate(b), private(i,myid)    {       myid = omp_get_thread_num();         for (i=0; i<n; i++){          b += c[myid][i];       }       c[myid][n] = b;    }