表 E-1 一般的な Fortran 指令の要約
Format
|
|
C$PRAGMA キーワード ( a [ , a ] ... ) [ , keyword ( a [ , a ] ... ) ] ,...
C$PRAGMA SUN キーワード ( a [ , a ] ... ) [ , keyword ( a [ , a ] ... ) ] ,...
C$PRAGMA SPARC キーワード ( a [ , a ] ... ) [ , keyword ( a [ , a ] ... ) ] ,...
1 桁目のコメント指示子には、c 、C 、! 、または * を使用できます (上記の例では、C を使用しています。f95 自由書式では ! を使用しなければなりません)。
|
C 指令
|
C$PRAGMA C( list)
外部関数の名前リストを C 言語のルーチンとして宣言します。
|
UNROLL 指令
|
C$PRAGMA SUN UNROLL= n
コンパイラに、次のループは長さ n に展開できることを伝えます。
|
WEAK 指令
|
C$PRAGMA WEAK( name[= name2])
name を弱い記号 (weak symbol) または name2 のエイリアスとして宣言します。
|
OPT 指令
|
C$PRAGMA SUN OPT= n
サブプログラムの最適化レベルを n に設定します。
|
PIPELOOP 指令
|
C$PRAGMA SUN PIPELOOP= n
反復 n 間のループの依存性を別に宣言します。
|
PREFETCH 指令
|
C$PRAGMA SPARC_PREFETCH_READ_ONCE ( name) C$PRAGMA SPARC_PREFETCH_READ_MANY ( name) C$PRAGMA SPARC_PREFETCH_WRITE_ONCE ( name) C$PRAGMA SPARC_PREFETCH_WRITE_MANY ( name)
コンパイラに name へ参照したときに先読み命令を生成するように要求します (-xprefetch オプションを指定する必要があります)。
|
表 E-5 Fortran 95 における OpenMP 指令の要約
指令の形式 (固定)
|
C$OMP directive optional_clauses...
!$OMP directive optional_clauses...
*$OMP directive optional_clauses...
1桁目から始まらなければなりません。継続行については、6 桁メニュー空白以外の文字化ゼロ以外の文字が指定されていなければなりません。
|
|
|
|
指令の形式 (自由)
|
!$OMP directive optional_clauses...
任意の場所で指定でき、その前に空白があってもかまいません。継続行は、アンパーサンドにより識別されます (!$OMP& )。
|
|
条件付きコンパイル
|
1 桁目と 2 桁目が !$ 、C$ 、*$ のいずれかで始まるソース行 (固定書式)、または前に空白が指定されたソース行 (自由書式) は、コンパイラオプション -openmp または -mp=openmp が指定されている場合にのみコンパイルされます。
|
PARALLEL 指令
|
!$OMP PARALLEL [clause[[,] clause]...] ブロックに対する転送のない Fortran 文のブロック
!$OMP END PARALLEL
並列化の範囲を定義します。この範囲は、複数のスレッドにより並列で実行されるコードのブロックです。clause には PRIVATE (list), SHARED (list), DEFAULT (option), FIRSTPRIVATE (list), REDUCTION (list), IF (expression), COPYIN (list) のいずれかを指定できます。
|
DO 指令
|
!$OMP DO [clause[[,] clause]...] do_loop 文のブロック [!$OMP END DO [NOWAIT ]]
DO 指令は、直後の DO ループの反復を並列で実行するように指定します。この指令は、並列化範囲内に指定しなければなりません。clause には PRIVATE (list)、 FIRSTPRIVATE (list)、 LASTPRIVATE (list)、 REDUCTION (list)、 SCHEDULE (type)、 ORDERED のいずれかを指定できます。
|
SECTIONS 指令
|
!$OMP SECTIONS [clause[[,] clause]...] [!$OMP SECTION ] 転送のない文のブロック [!$OMP SECTION
文のオプションブロック ] ...
!$OMP END SECTIONS [NOWAIT ]
チーム内のスレッド間で分割されるコードの非反復セクションを囲みます。各セクションは、チーム内のスレッドにより 1 度実行されます。clause には PRIVATE (list)、FIRSTPRIVATE (list)、LASTPRIVATE (list)、REDUCTION (list) のいずれかを指定できます。
各セクションの前には SECTION 指令があり、これは最初のセクションで選択できます。
|
SINGLE 指令
|
!$OMP SINGLE [clause[[,] clause]...] 転送のない文のブロック
!$OMP END SINGLE [NOWAIT ]
SINGLE 指令により囲まれた文はチーム内の 1 スレッドによってのみ実行されます。文の SINGLE ブロックを実行しないチームのスレッドは、NOWAIT が指定されない限り、END SINGLE 指令で待機しています。clause には、PRIVATE (list) または FIRSTPRIVATE (list) のいずれかを指定できます。
|
PARALLEL DO 指令
|
!$OMP PARALLEL DO [clause[[,] clause]...] do_loop 文のブロック [!$OMP END PARALLEL DO [NOWAIT ]]
1 つの DO ループに含まれている並列領域を指定する簡単な方法です。PARALLEL 指令のすぐ後に DO 指令を指定します。clause には、PARALLEL 指令や DO 指令で指定可能な clause のいずれかを使用できます。
|
PARALLEL SECTIONS 指令
|
!$OMP PARALLEL SECTIONS [clause[[,] clause]...] [!$OMP SECTION ] ブロックに対する転送のない文のブロック [!$OMP SECTION
文のオプションブロック ] ...
!$OMP END PARALLEL SECTIONS [NOWAIT ]
1 つの SECTIONS 指令に含まれている並列領域を指定する簡単な方法です。PARALLEL 指令のすぐ後に SECTIONS 指令を指定します。clause は、PARALLEL 指令や SECTIONS 指令で指定可能な句のいずれかを使用できます。
|
同期指令
|
MASTER 指令
|
!$OMP MASTER
ブロックに対する転送のない文のブロック
!$OMP END MASTER
これらの指令で囲まれている文のブロックは、チームのマスタースレッドだけが実行します。その他のスレッドは、このブロックをスキップして、処理を継続します。マスターセクションの開始または終了では、暗黙的な境界はありません。
|
CRITICAL 指令
|
!$OMP CRITICAL [(name)] ブロックに対する転送のない文のブロック
!$OMP END CRITICAL [(name)]
これらの指令で囲まれている文のブロックへのアクセスを、一度に 1 スレッドだけに制限します。オプション name の引数には識別のための領域名を指定します。指定のない CRITICAL 指令では、すべて同じ名前にマッピングされます。クリティカルなセクション名とは、プログラムの大域要素を指します。名前がほかの要素と競合する場合は、プログラムの動作が定まらなくなります。CRITICAL 指令で名前を指定した場合は、END CRITICAL 指令にもその名前を指定しなければなりません。
|
BARRIER 指令
|
!$OMP BARRIER
チーム内のすべてのスレッドの同期をとります。各スレッドは、チーム内のその他すべてのスレッドがこの点に到達するまで待機します。
|
ATOMIC 指令
|
!$OMP ATOMIC
特定のメモリ位置を自動的に更新するようにし、複数の同時書き込みスレッドが生じないようにします。
指令は、そのすぐ後の文にのみ適用されます。その文は、次の形式のいずれかでなければなりません。 x = x operator expression x = expression operator x x = intrinsic(x, expression) x = intrinsic(expression, x) ただし、 ・ x は、intrinsic 型のスカラーです。 ・ expression は、x を参照しないスカラー式です。 ・ intrinsic は、MAX 、MIN 、IAND 、IOR 、IEOR のいずれかです。 ・ operator は、 +、-、*、/、.AND.、.OR.、.EQV.、.NEQV. のいずれかです。
|
FLUSH 指令
|
!$OMP FLUSH [(list)]
スレッド可視変数は、この指令が出現したところでメモリに書き戻されます。これには、大域変数(共通ブロックとモジュール)、(SAVE 属性を指定しないで) 副プログラムに渡されるかまたは副プログラムの並列領域で SHARED として宣言された局所的変数、仮引数、そしてすべてのポインタ非参照が含まれます。オプションのリストには、フラッシュしなければならない変数をコンマで区切って指定します。
|
ORDERED 指令
|
!$OMP ORDERED ブロックに対する転送のない文のブロック
!$OMP END ORDERED
この指令により囲まれた文のブロックは、反復がループの実行順に実行されるときの順序で実行されます。これは、DO 指令または PARALLEL DO 指令の動的拡張機能でのみ指定できます。ORDERED 句は、ブロックを囲んでいる一番近い DO 指令で指定しなければなりません。
|
データ環境指令
|
THREADPRIVATE 指令
|
!$OMP THREADPRIVATE ( /cb/[,/cb/]...)
指定した共通ブロックをスレッドに対して非公開としますが、そのスレッド内では大域となります。cb は共通ブロックの名前です。共通ブロックを THREADPRIVATE にするには、そのブロックのすべての COMMON 宣言の後でこの指令を指定しなければなりません。
|
データスコープ (有効範囲) 句
|
上記のいくつかの指令は、指令により閉じた変数のスコープ属性を制御するための句を受け取ります。データスコープ句が指令に指定されていない場合は、その指令に関係のある変数のデフォルトスコープは SHARED となります。list には、スコープ単位でアクセス可能な指定された変数や共通ブロックのリストをコンマで区切って指定します。共通ブロック名は、スラッシュで囲まなければなりません (/ABLOCK/ など)。
|
PRIVATE 句
|
PRIVATE (list)
チーム内の各スレッドに対して非公開となるように、変数のリストをコンマで区切って宣言します。
|
SHARED 句
|
SHARED (list)
チーム内のすべてのスレッドは、list に指定された変数を共有し、同じ記憶領域にアクセスします。
|
DEFAULT 句
|
DEFAULT(PRIVATE | SHARED | NONE)
並列領域内のすべての変数にスコーピング属性を指定します。THREADPRIVATE 変数は、この句の影響を受けません。この句を指定しない場合は、DEFAULT(SHARED) であるとみなされます。
|
FIRSTPRIVATE 句
|
FIRSTPRIVATE (list)
list の変数は、PRIVATE です。また、変数の非公開コピーは、構成前から存在している元のオブジェクトから初期化されます。
|
LASTPRIVATE 句
|
LASTPRIVATE (list)
list の変数は、PRIVATE です。また、DO 指令で LASTPRIVATE 句が指定されていると、順序が最後の反復を実行するスレッドにより変数のバージョンが構成前に更新されます。SECTIONS 指令では、意味的に最後の SECTION を実行するスレッドにより、それが持っているオブジェクトのバージョンが構成前に更新されます。
|
REDUCTION 句
|
REDUCTION ({operator|intrinsic}: list)
operator は、 +、*、-、.AND.、.OR.、.EQV.、.NEQV. のいずれかです。
intrinsic は、 MAX、MIN、IAND、IOR、IEOR のいずれかです。
list の変数は、intrinsic タイプの名前付きスカラー変数でなければなりません。
REDUCTION 句は、前述の ATOMIC 指令で示したフォームの縮約文でのみ縮約変数が使用される領域で使用することを目的としています。list の変数は、囲んだコンテキストの中で SHARED でなければなりません。各変数の非公開コピーは、それが PRIVATE の場合、スレッドごとに作成されます。縮約の終わりに、各非公開コピーの最終値を元の値と組み合わせて、共有変数が更新されます。
|
COPYIN 句
|
COPYIN (list)
COPYIN 句は、THREADPRIVATE として宣言された共通ブロックに対してのみ適用されます。並列領域で、COPYIN 句はチームのマスタースレッドのデータが並列領域の先頭で共有ブロックのスレッド非公開コピーにコピーされるように指定します。
|
DO 指令と PARALLEL DO 指令のスケジューリング句
|
SCHEDULE 句
|
SCHEDULE (type [,chunk])
DO ループの反復がチームのスレッド間でどのように分割されるかを指定します。type には、次のいずれかを指定します。SCHEDULE 句を指定しなければ、STATIC スケジューリングが使用されます。
|
STATIC スケジューリング
|
SCHEDULE(STATIC, chunk)
反復は、チャンクにより指定されたサイズに分割されます。分割された反復は、スレッド番号の順序で総当り形式でチームのスレッドに割り当てられます。chunk は、スカラー整数式でなければなりません。
|
DYNAMIC スケジューリング
|
SCHEDULE(DYNAMIC, chunk)
反復は、チャンクにより指定されたサイズに分割されます。各スレッドは、反復空間を終了すると、次の反復セットを動的に取得します。
|
GUIDED スケジューリング
|
SCHEDULE(GUIDED, chunk)
GUIDED を指定すると、チャンクサイズは実行された各反復セットによりべき乗的に縮約されます。chunk は、その都度実行する反復の最小数を指定します。
|
RUNTIME スケジューリング
|
SCHEDULE(RUNTIME)
スケジューリングが、実行時まで遅延されます。スケジュール型やチャンクサイズは、OMP_SCHEDULE 環境変数の設定値をもとに決定されます。
|
表 E-6 Fortran 95 OpenMP ライブラリルーチンの要約
実行環境ルーチン
|
OMP_SET_NUM_THREADS サブルーチン
|
|
SUBROUTINE OMP_SET_NUM_THREADS (int_expr) 次の並列領域で使用するためにスレッド数を設定します。
|
OMP_GET_NUM_THREADS 関数
|
|
INTEGER FUNCTION OMP_GET_NUM_THREADS()
呼び出し元の並列領域を実行しているチーム内に現在あるスレッドの数を返します。
|
OMP_GET_MAX_THREADS 関数
|
|
INTEGER FUNCTION OMP_GET_NUM_THREADS( ) OMP_GET_NUM_THREADS 関数への呼び出しで返すことが可能な最大値を返します。
|
OMP_GET_THREAD_NUM 関数
|
|
INTEGER FUNCTION OMP_GET_THREAD_NUM()
チーム内のスレッド番号を返します。これは、0 から OMP_GET_NUM_THREADS()-1 までの数値です。マスタースレッドはスレッド 0 です。
|
OMP_GET_NUM_PROCS 関数
|
|
INTEGER FUNCTION OMP_GET_NUM_PROCS()
プログラムで使用可能なプロセッサの数を返します。
|
OMP_IN_PARALLEL 関数
|
|
LOGICAL FUNCTION OMP_IN_PARALLEL()
並列で実行している領域の動的拡張内から呼び出された場合、.TRUE. を返します。それ以外の場合は、.FALSE. を返します。
|
OMP_SET_DYNAMIC サブルーチン
|
|
SUBROUTINE OMP_SET_DYNAMIC (logical_expr) プログラムの並列実行で使用可能なスレッド数の動的調整を有効または無効にします。
|
OMP_GET_DYNAMIC 関数
|
|
LOGICAL FUNCTION OMP_GET_DYNAMIC()
動的スレッド調整が有効な場合、.TRUE. を返します。それ以外の場合は、.FALSE. を返します。
|
OMP_SET_NESTED サブルーチン
|
|
SUBROUTINE OMP_SET_NESTED (logical_expr) ネストされた並列化機能を有効または無効にします。
|
OMP_GET_NESTED 関数
|
|
FUNCTION OMP_GET_NESTED()
ネストされた並列化機能が有効な場合、.TRUE. を返します。それ以外の場合は、.FALSE. を返します。
|
ロックルーチン
ロック変数 var は、次のルーチンからしかアクセスできません。var は、integer 型で、またアドレスを保持できる大きさの KIND でなければなりません。たとえば、64 ビットシステムで var は INTEGER (KIND=8) として宣言できます。
|
OMP_INIT_LOCK サブルーチン
|
|
SUBROUTINE OMP_INIT_LOCK( var)
以降の呼び出しで使用するために、ロック変数 var に関連付けられているロックを初期化します。初期の状態でロックは解除されています。
|
OMP_DESTROY_LOCK サブルーチン
|
|
SUBROUTINE OMP_DESTROY_LOCK( var)
指定したロック変数 var が関連付けられているロックがあれば、それから var との関連付けを解除します。
|
OMP_SET_LOCK サブルーチン
|
|
SUBROUTINE OMP_SET_LOCK( var)
指定したロックが使用可能な状態になるまで、実行スレッドを待機させます。ロックが使用可能になると、スレッドにロックの所有権が与えられます。
|
OMP_UNSET_LOCK サブルーチン
|
|
SUBROUTINE OMP_UNSET_LOCK( var)
実行スレッドから、ロックの所有権を解放します。スレッドがそのロックを所有していない場合は、動作は不確定となります。
|
OMP_TEST_LOCK 関数
|
|
LOGICAL FUNCTION OMP_TEST_LOCK( var)
ロック変数 var に関連付けられているロックを設定しようと試みます。ロックが正常に設定されると、.TRUE. が返されます。それ以外の場合は、.FALSE. が返されます。
|