<<  7  >> インテル® C/C++ コンパイラー OpenMP* 活用ガイド デュアルコア・マルチコア対応アプリケーション開発A 簡単な p の計算で OpenMP* プログラムを示します。このプログラムに宣言子を挿入し、並列化した例 は次のようになります。(Linux* でのコンパイル例と出力) 図.6 OpenMP* プログラムのコンパイルと実行例 OpenMP* を利用した並列プログラミングは、プログラムに対して OpenMP* で規定された宣言子を挿入し、コンパ イル時にコンパイル・オプションとして /Qopenmp スイッチ(Windows*)、-openmp スイッチ(Linux*)を指定することで 可能となります。OpenMP* 宣言子は、コンパイラーに対して並列化のためのヒントを与えるのでなく、明示的に並列 化を指示するものです。したがって、間違った宣言子を指定してもコンパイラーはその指示に従って並列化を行いま す。また、データの依存性などがあっても、コンパイラーは警告メッセージやエラーメッセージを出し、その指示を無 視することなく忠実に並列化を行いますので、依存性があるループなどを OpenMP* で並列化した場合には計算結果 が不正になります。一方、OpenMP* を使用した場合、スレッドの生成や各スレッドの同期コントロールといった制御 をユーザーが気にする必要はありません。コンパイラーは OpenMP* の指示によって並列化を行ったことをメッセージ として出力します。 cat -n pi_omp.c      1  #include <omp.h>      2  static int num_steps = 100000; double step;      3  void main ()      4  {      5     int i; double x, pi, sum = 0.0;      6     int nthreads;      7     step = 1.0/(double) num_steps;      8      9  #pragma omp parallel     10     nthreads = omp_get_num_threads();     11  #pragma omp parallel for reduction (+:sum) private(x)     12     for (i=1;i<= num_steps; i++){     13            x = (i-0.5)*step;     14            sum = sum + 4.0/(1.0+x*x);     15     }     16     pi = step * sum;     17     printf("%d Threads  PI = %f \n",nthreads,pi);     18  } $ icc -O3 -openmp _openmp-report2 pi_omp.c pi_omp.c(9) : (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED. pi_omp.c(11) : (col. 1) remark: OpenMP DEFINED LOOP WAS PARALLELIZED. $ setenv OMP_NUM_THREADS 2 $ time ./a.out 2 Threads  PI = 3.141593 0.021u 0.001s 0:00.10 20.0%     0+0k 0+0io 122pf+0w OpenMP*宣言子 OpenMP*実行時関数 コンパイルとメッセージ 環境変数の設定