インテル®コンパイラー OpenMP*入門
デュアルコア・マルチコア対応アプリケーション開発@
<< 11 >>
このプログラムは、コンパイラーによって、自動的に次のようにスレッド毎のタスクに分割されます。
// Thread 1
for (i=1; i<50; i++)
{
a[i] = a[i] + b[i] * c[i];
}
// Thread 2
for (i=50; i<100; i++)
{
a[i] = a[i] + b[i] * c[i];
}
プログラムの開発者は、この例で示したようなループの分割やその分割したループのマルチスレッドでの実行の制
御などについて意識する必要はありません。普通のループで必要な処理を記述すれば、コンパイラーが並列処理を
行います。またこの例では、ループ回数は明示的に記述しましたが、実際にはループ回数はプログラムの実行時に
初めて明らかになるケースがほとんどです。コンパイラーは、並列化したループの実行前に各スレッドが実行するルー
プの反復回数を決定して実行します。また反復回数が少ない場合には、並列化処理を行わず逐次処理を行うような
条件判断を設定することも可能です。
簡単な p の計算での自動並列化コンパイルを示します。p の値を計算するには、以下のようなプログラムが可能
です。
1 #define num_steps 1000000
2 double step;
3 main ()
4 { int i; double x, pi, sum = 0.0;
5
6 step = 1.0/(double) num_steps;
7
8 for (i=1;i<= num_steps; i++){
9 x = (i-0.5)*step;
10 sum = sum + 4.0/(1.0+x*x);
11 }
12 pi = step * sum;
13 }
このプログラムに対して、自動並列化コンパイルのためのコンパイル・オプションを指定してコンパイルすることで自
動並列化コンパイルが可能です。(Linux*でのコンパイル例)
$ icc -parallel par-report3 par-threshold0 -O3 sample.c
procedure: main
sample.c(9) : (col. 11) remark: LOOP WAS AUTO-PARALLELIZED.
parallel loop: line 9
shared : { }
private : {"i", "x"}
first priv.: {"step"}
reductions : {"sum"}