インテル®コンパイラー 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】他のスレッドの処理の完了を待つための同 期処理を行います。全てのスレッドの動作が完了す るとスレーブスレッドは終了し、マスタースレッドの みが実行を継続します。 このForkJoin操作により、逐次実行と 並列実行を繰り返します。 スレーブスレッド マスタースレッド