並列処理スレッドモデル

ここでは、並列化されたプログラム処理の説明と、並列プログラミングで使用される用語の定義を追加説明します。

実行フロー

OpenMP の Fortran API コンパイラ・ディレクティブを持つプログラムは、単一のプロセスとして実行を開始します。これは、マスタスレッドの実行と呼ばれます。最初の並列構造が検出されるまで、マスタスレッドは、シーケンシャルに実行します。

OpenMP Fortran API では、PARALLEL および END PARALLEL ディレクティブは、並列構造を定義します。マスタスレッドが並列構造を検出すると、そのマスタスレッドがチームのマスタとなるように、スレッドのチームを作成します。並列構造に囲まれたプログラム文は、チーム内の各スレッドごとに並列して実行されます。これらの文は、囲まれた文の中から呼び出されるルーチンを含みます。

構造内で字句的に囲まれた文は、構造の静的範囲を定義します。動的範囲は、構造内から呼び出されるルーチンと同様に静的範囲を含みます。END PARALLEL ディレクティブが検出されると、チーム内のスレッドはその時点で同期し、そのチームは消滅して、マスタスレッドのみが実行を続けます。チーム内の他のスレッドは、待機状態になります。

単一プログラム内で並列構造は何回でも指定できます。結果として、プログラム実行中に、スレッドのチームは何度も生成され消滅します。

孤立ディレクティブの使用

並列構造内で呼び出されたルーチンで、ディレクティブを使用することができます。並列構造の字句範囲ではなく、動的範囲のディレクティブは、孤立ディレクティブと呼ばれます。孤立ディレクティブは、プログラムのシーケンシャル・バージョンに最小限の変更を行うだけで、プログラムの主要部分を並列に実行できます。この機能を使用すると、プログラム・コール・ツリーの最上位レベルで並列構造をコーディングでき、ディレクティブを使用して呼び出されるすべてのルーチンの実行を制御することができます。次に例を示します。

subroutine F
...
!$OMP parallel...
...
call G
...
subroutine G
...
!$OMP DO...
...

!$OMP DO が実行される並列領域が G の記述範囲内にないため、!$OMP DO は孤立ディレクティブとなります。

データ環境ディレクティブ

データ環境ディレクティブは、並列構造の実行中にデータ環境を制御します。

並列およびワークシェアリング構造内でデータ環境を制御できます。ディレクティブとディレクティブのデータ環境節を使用して次のことが可能です:

データスコープ属性節:

複数のディレクティブ節を使用して、変数のデータスコープ属性を指定した構造の継続期間中にその属性を制御することができます。ディレクティブでデータスコープ属性節を指定しない場合、ディレクティブに影響を受ける変数のデフォルトは SHARED になります。

節の詳細は、「OpenMP Fortran バージョン 2.0 仕様」を参照してください。

並列処理モデルの疑似コード

一般的な OpenMP ディレクティブを使用したサンプル・プログラムを次に示します。この例ではまた、シリアル領域と並列領域の相違も示しています。

PROGRAM MAIN Begin Serial Execution

...                    !Only the master thread executes

!$OMP PARALLEL Begin a Parallel Construct, form a team

...                    !This is Replicated Code where each team !

                       !member executes the same code

!$OMP SECTIONS!Begin a Worksharing Construct

!$OMP SECTION!One unit of work

...                    !

!$OMP SECTION!Another unit of work

...                    !

!$OMP END SECTIONS!Wait until both units of work complete

...                    !More Replicated Code

  !$OMP DO!Begin a Worksharing Construct,

      DO!each iteration is a unit of work

      ...              !Work is distributed among the team

      END DO                !

!$OMP END DO NOWAIT!End of Worksharing Construct, NOWAIT

                       ! is specified (threads need not wait

                       ! until all work is completed before

                       ! proceeding)

...                    !More Replicated Code

!$OMP END PARALLEL!End of PARALLEL Construct, disband team !

                       !and continue with serial execution

...                    !Possibly more PARALLEL Constructs

END PROGRAM MAIN!End serial execution