インテル®コンパイラー OpenMP*入門 デュアルコア・マルチコア対応アプリケーション開発@ <<  14  >> OpenMP* API は、プログラムの並列化領域や、データ属性などの宣言子と並列処理を補助するための OpenMP* ライブラリー、そして並列処理を行う場合の実行環境を指定する環境変数から構成されます。これらは、デスクトッ プ PC からスーパーコンピューターまで、 統一された 1 つの API となっています。したがって、OpenMP* API でプログ ラムの並列化を行うことで、将来のシステムのスケールアップに合わせてプログラムを書き直す必要はありません。ま た .OpenMP* API をサポートしているプラットフォーム間であれば、 将来のシステム変更の際のプログラムの移行は非 常に容易になります。 OpenMP* によるプログラム構造 OpenMP* を利用した並列プログラミングは、プログラムに対して OpenMP* で規定された宣言子を挿入し、コンパ イル時にコンパイル・オプションとして Windows* の場合 /Qopenmp スイッチを、また Linux* の場合は -openmp スイッ チを指定することで可能になります。 OpenMP* 宣言子は、コンパイラーに対して並列化のためのヒントを与えるので なく、明示的に並列化を指示するという事に注意する必要があります。間違った宣言子を指定しても、コンパイラーは その指示に従って並列化を行います。また、データの依存性などがあっても、コンパイラーは警告メッセージやエラー メッセージを出し、その指示を無視することなく忠実に並列化を行いますので、 依存性があるループなどを OpenMP* で並列化した場合には、計算結果が不正になります。一方、OpenMP* を使用した場合、スレッドの生成や各スレッ ドの同期コントロールといった制御については、ユーザーが意識する必要はありません。 OpenMP* では、一般に Fork-Join モデルと呼ばれる並列実行処理を行います。 #pragma omp parallel if (n>limit) default (none)        shared (n,a,b,c,x,y,z) private(f,i,scale) {        f = 1.0; #pragma omp for nowait        for (i=0; i<n; i++)            z[i] = x[i] + y[i]; #pragma omp for nowait        for (i=0; i<n; i++)            a[i] = b[i] + c[i]; #pragma omp barrier          scale = sum(a, 0, n) + sum(z, 0, n) + f;                 } /** Enf of parallel region **/ すべてのスレッドが実行 並列ループ (ワークシェアリング) 並列ループ (ワークシェアリング) 同期処理 すべてのスレッドが実行 並列実行領域