インテル®コンパイラー OpenMP*入門
デュアルコア・マルチコア対応アプリケーション開発@
<< 15 >>
Fork-Join モデルでのプログラム実行フロー
このプログラミング・モデルでは、逐次実行部分 (シングルスレッドの実行) と並列実行 (マルチプロセッサーやマ
ルチコア・プロセッサー上でのマルチスレッドの実行) が 交互に切り替わって実行されます。
1 OpenMP*の処理では、最初にマスタースレッドが起動されてプログラムの実行を開始します。このマスタースレッ
ドは、 逐次的にプログラムの処理を行います。
2 プログラムが OpenMP* での並列化宣言子 #pragma omp parallel (C/C++) の部分に
到達すると、スレーブスレッドと呼ばれるスレッドを生成 (スレッドを Fork する) し、 分割されたプログラムのタスク
を並列に処理します。
3 このマスタースレッドとスレーブスレッドの処理は、プログラム中での並列実行領域の終了を示す宣言子
#pragma omp end parallel (C/C++) に到達すると終了します。この終了時には、 全
スレッドが各自の処理を終了するまで、 先に終了したスレッドも待つことになり、 同期処理を必要とします。
4 全スレッドが完了した時点 (スレッドを join する) で、プログラムの実行処理は再びマスタースレッドだけが行うこ
とになります。
このような処理を繰り返して、プログラムの実行を行うので、Fork-Joinモデルと呼ばれています。
先ほどの自動並列化で示した、簡単な p の計算を例に、OpenMP*プログラムを示します。このプログラムに
OpenMP* 宣言子を挿入し並列化した例は次のようになります。
【Fork】複数のスレーブスレッドを生成し、並列実行
を開始します。
【Join】他のスレッドの処理の完了を待つための同
期処理を行います。全てのスレッドの動作が完了す
るとスレーブスレッドは終了し、マスタースレッドの
みが実行を継続します。
このForkとJoin操作により、逐次実行と
並列実行を繰り返します。
スレーブスレッド
マスタースレッド