<< 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*実行時関数
コンパイルとメッセージ
環境変数の設定