OpenMP 並列コンパイラ指示文:並列領域を定義します。
形式
c$OMP PARALLEL [clause[[,] clause] ... ]
c
次のいずれか:C (または c),!,* (「並列指示文の構文規則」を参照)
clause
以下のいずれか。
囲まれたコード・セクションを,scalar_logical_expression が .TRUE. に評価される場合にのみ並列実行することを指定します。それ以外の場合,並列領域は直列化されます。この節が使用されていなければ,領域は IF(.TRUE.) 節が指定されているかのように実行されます。
この節は,データ有効範囲属性が有効になる前に,マスタ・スレッドによって評価されます。
この指示文には IF 節は 1 つしか入れることができません。
block
文または構文の構造化ブロック (セクション)。このブロックに対して,またはこのブロックから飛び越すことはできません。
規則と振る舞い
PARALLEL および END PARALLEL 指示文の組は,コードの実行形式セクションの中の同じルーチン内になくてはなりません。
END PARALLEL 指示文は並列領域の終わりを指示します。このポイントには暗黙のバリアがあります。並列領域の終わりでは,チームのマスタ・スレッドだけが実行を続けます。
並列領域に遭遇したスレッドは,スレッドのチームを作成し,自らはチームのマスタになります。マスタ・スレッドはチームのメンバであり,チーム内でのスレッド番号はゼロとなります。チーム内のスレッドの数は,環境変数とライブラリー呼び出しで制御することができます。
いったん作成されると,チーム内のスレッドの数は,その並列領域の実行中は一定です。ただし,プログラムの直列な部分から実行時ライブラリー・ルーチン omp_set_num_threads を呼び出すことで,次の並列領域で使用されるスレッドの数を明示的に変更することができます。このルーチンは環境変数 OMP_NUM_THREADS を使って設定されていた値を無効にします。
並列領域の動的寸法に含まれるコードが個々のスレッド上で実行されます。コード・パスはスレッドごとに異なる可能性があります。
並列領域を実行しているスレッドが別の並列領域に遭遇した場合,そのスレッドは新しいチームを作成し,その新しいチームのマスタになります。基本設定では,入れ子にされた並列領域はつねに直列化され,1 つのスレッドのチームによって実行されます。
関連情報
Compaq Fortran 並列コンパイラ指示文,OpenMP Fortran API コンパイラ指示文,Tru64 UNIX システム用の並列指示文,並列ライブラリー・ルーチン
例
PARALLEL 指示文は疎な密度の並列プログラムで使用することができます。次の例では,並列領域中の個々のスレッドが,スレッド番号に基づいて,大域配列 X のどの部分を処理するかを決定します。
c$OMP PARALLEL DEFAULT(PRIVATE) SHARED(X,NPOINTS) IAM = OMP_GET_THREAD_NUM() NP = OMP_GET_NUM_THREADS() IPOINTS = NPOINTS/NP CALL SUBDOMAIN(X,IAM,IPOINTS) c$OMP END PARALLEL
以前に環境変数 OMP_NUM_THREADS を使って,スレッドの数を 6 に設定していたとします。並列領域と並列領域の間では,次のようにスレッドの数を変更することができます。
CALL OMP_SET_NUM_THREADS(3) !$OMP PARALLEL ... !$OMP END PARALLEL CALL OMP_SET_NUM_THREADS(4) !$OMP PARALLEL DO ... !$OMP END PARALLEL DO