インテル®コンパイラー 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"}