Fortran ユーザーズガイド ホーム目次前ページへ次ページへ索引


付録 E

Fortran 指令の要約

この付録では、f77f95 の Fortran コンパイラで認識されている指令について要約します。

一般的な Fortran 指令

f77 でも f95 でも適用される一般的な指令については、第 2 章で説明しています。

表 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 桁目のコメント指示子には、cC、! 、または * を使用できます (上記の例では、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 オプションを指定する必要があります)。


特殊な Fortran 95 指令

次の指令は、f95 でのみ使用できます。詳細については、付録 C を参照してください。-

表 E-2   特殊な Fortran 95 指令
書式 !DIR$ directive              : 最初の行
!DIR$& ...                         : 継続行

固定書式の場合、C は CDIR$ 指令... のように指令指示子としても受け取られます。その行は、1 桁目から始まる必要があります。
自由書式ソースの場合、その行の前でも空白を使用できます。
FIXED/FREE 指令 !DIR$ FREE
!DIR$ FIXED

これらの指令では、それ以降の行のソースフォーマットを指定します。これらは、次に FREE 指令または FIXED 指令が出現するまで、残りのソースファイルに適用されます。


Sun の並列化指令

Sun 形式の並列化指令は、デフォルト (-mp=sun コンパイラオプション)であり、「Fortran プログラミングガイド」の並列化に関する章で詳しく説明しています。

表 E-3   Sun 形式の並列化指令の要約
書式 C$PAR directive [optional_qualifiers]  : 最初の行
C$PAR& [more_qualifiers]                     : 継続行

固定書式。指令指示子には、C (上記の例)、c、*、または ! を使用できます。 修飾子が複数ある場合は、コンマで区切ります。72 桁目を越える文字は、-e コンパイラオプションを指定していない限り無視されます。
TASKCOMMON
指令

C$PAR TASKCOMMON block_name

共通ブロック block_name の変数をスレッド非公開として宣言します。これは、スレッドに対しては非公開ですが、スレッド内ではグローバルとなります。共通ブロック TASKCOMMON を宣言するには、そのブロックの全共通宣言の後にこの指令を指定する必要があります。
DOALL 指令 C$PAR DOALL [修飾子]

それ以降の DO ループを並列化します。修飾子は、次のとおりです。
  PRIVATE(list)       リストの名前を PRIVATE として宣言します。
  SHARED(list)         リストの名前を SHARED として宣言します。
  MAXCPUS(n)          多くても使用するスレッドは n 個です。
  READONLY(list)     リストの変数は、ループ内で変更されません。
  SAVELAST              すべての非公開変数の最終的な値を保存します。
  STOREBACK(list)   リストの変数の最終的な値を保存します。
  REDUCTION(list)   リストの変数は、縮約変数です。
  SCHEDTYPE(type)  スケジューリング型を使用します (デフォルト は STATIC です)。
                                          STATIC
                                          SELF(nchunk)
                                          FACTORING[(m)]
                                          GSS[(m)]
DOSERIAL 指令 C$PAR DOSERIAL

以降のループの並列化を無効にします。
DOSERIAL* 指令 C$PAR DOSERIAL*

以降のループのネストの並列化を無効にします。


Cray の並列化指令

Cray 形式の並列化指令については、『Fortran プログラミングガイド』の並列化に関する章で詳しく説明しています。
-mp=cray コンパイラオプションを指定する必要があります。

表 E-4   Cray の並列化指令の要約 
書式 CMIC$ directive qualifiers              : 最初の行
CMIC$& [more_qualifiers]               : 継続行

固定書式。指令指示子には、C (上記の例)、c、*、または ! を使用できます。f95 自由書式の場合、!MIC$ より前に空白を指定できます。
DOALL 指令 CMIC$ DOALL SHARED(list), PRIVATE(list) [, more_qualifiers]

以降のループの並列化を無効にします。修飾子は、次のとおりです。

スコーピング修飾子が必要です (list が空でない場合)―ループ内の変数はすべて PRIVATE 句または SHARED 句で宣言されていなければなりません。
PRIVATE(list)     リストの名前を PRIVATE として宣言します。
   SHARED(list)   リストの名前を SHARED として宣言します。
  AUTOSCOPE       変数の範囲を自動的に判別します。

次にオプションを示します。
   MAXCPUS(n)      多くても使用するスレッドは n 個です。
  SAVELAST          すべての非公開変数の最終的な値を保存します。

スケジューリング修飾子は 1 つだけ指定できます。
   GUIDED Sun 形式の GSS(64) と等価です。
   SINGLE Sun 形式の SELF(1) と等価です。
   CHUNKSIZE(n) Sun 形式の SELF(n) と等価です。
   NUMCHUNKS(m) Sun 形式の SELF(n/m) と等価です。
デフォルトのスケジューリング型は、Sun 形式の STATIC です。これと等価の Cray 形式のスケジューリング型はありません。これらのスケジューリング型の解釈方法は、Sun 形式と Cray 形式で異なります。詳細については、『Fortran プログラミングガイド』を参照してください。
TASKCOMMON
指令
CMIC$ TASKCOMMON block_name

指定した共通ブロックの変数をスレッド非公開として宣言します。これは、スレッドに対しては非公開ですが、スレッド内ではグローバルとなります。共通ブロック TASKCOMMON を宣言するには、そのブロックの全共通宣言の直前または直後にこの指令を指定する必要があります。
DOSERIAL 指令 CMIC$ DOSERIAL

以降のループの並列化を無効にします。
DOSERIAL* 指令 CMIC$ DOSERIAL*

以降のループのネストの並列化を無効にします。


Fortran 95 の OpenMP 指令

Sun の Fortran 95 コンパイラでは、OpenMP バージョン 1.1 の Fortran API がサポートされています。 f95 コンパイラフラグの -mp=openmp および -openmpを使用すれば、これらの指令を使用できるようになります。

ここでは、f95 でサポートされている OpenMP 指令、ライブラリルーチン、環境変数を示します。OpenMP の詳細については、http://www.openmp.org/ の OpenMP Fortran 仕様を参照してください。

次の表に、f95 でサポートされている OpenMP 指令を要約します。角括弧 ([...]) で囲まれている項目は、オプションです。

表 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 は、MAXMINIANDIORIEOR のいずれかです。
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 環境変数の設定値をもとに決定されます。


OpenMP ライブラリルーチン

OpenMP Fortran API ライブラリルーチンは、外部手続きです。次の要約で、int_expr はデフォルトでスカラー整数式であり、logical_expr はデフォルトのスカラー論理式です。これらのルーチンの戻り値は、デフォルトのようなものです。詳細については、OpenMP 仕様を参照してください。

表 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 ビットシステムで varINTEGER (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. が返されます。


OpenMP 環境変数

次の表は、OpenMP プログラムの実行を制御する OpenMP Fortran API 環境変数を要約したものです。

表 E-7   OpenMP Fortran 環境変数の要約
OMP_SCHEDULE
スケジュール型が RUNTIME として指定された DO 指令や PARALLEL DO 指令のスケジュール型を設定します。たとえば、setenv OMP_SCHEDULE "GUIDED,4" とします。指定しない場合、STATIC のデフォルト値が使用されます。
OMP_NUM_THREADS
OMP_SET_NUM_THREADS()
サブルーチンの呼び出しにより設定されていない場合に、実行時に使用するスレッド数を設定します。たとえば、setenv OMP_NUM_THREADS 16 とします。設定しない場合、デフォルト値 1 が使用されます。
OMP_DYNAMIC
並列領域の実行で使用可能なスレッド数の動的調整機能を有効または無効にします。たとえば、setenv OMP_DYNAMIC FALSE とします。 設定しない場合、デフォルト値 TRUE が使用されます。
OMP_NESTED
ネストされた並列機能を有効または無効にします。たとえば、setenv OMP_NESTED TRUE とします。



サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引