インテル®コンパイラー OpenMP*入門
デュアルコア・マルチコア対応アプリケーション開発@
<< 12 >>
ここでは、自動並列化に関するレポートを出力させているので、どのループで並列化されたかが出力されています。
最初に示したように、自動並列化解析とは、コンパイラーによる並列実行可能なタスクの認識とそのタスク内での
データの利用に関する解析です。コンパイラーは、プログラム内のループの構造をチェックし、その並列実行の 可能
性をチェックします。そのループを複数のタスクに分割できると判断した後で、並列処理が可能であるかどうかはそ
れらのループ内でのデータの依存性の判断になります。例えば、次のような例では、各ループの実行は、その前の
ループの反復計算の結果を必要としますので、依存性があることになります。従って、このようなループの自動並列
化はできません。コンパイラーは、依存性解析を行った結果をメッセージとしても出力しますので、そのメッセージな
どを参考に並列化のためのプログラム変更などの検討ができます。
$ cat -n sample.c
1 #define N 1000
2 main ()
3 { int i; double a[N], b[N], c[N];
4 for (i=1;i<= N; i++){
5 a[i] = a[i-1] + b[i] * c[i];
6 }
7 }
$ icc -parallel -par-report3 -par-threshold0 sample.c
procedure: main
serial loop: line 5
flow data dependence from line 5 to line 5 flow data dependence from
stmt 2 to stmt 2, due to "a"
コンパイラーが生成するコードは、ハイレベルのマルチスレッド・ライブラリーを参照します。このマルチスレッド・ラ
イブラリーは、この後で説明する OpenMP* でも共通に利用されます。これによって、自動並列化と OpenMP* の混在
が 可能となり、またオペレーティング・システムに関係なく、自動並列化の適用が 可能になります。