Sun Studio 12 Update 1: Fortran ユーザーズガイド

付録 D Fortran 指令の要約

この付録では、f95 Fortran コンパイラで認識可能な指令について示します。

D.1 一般的な Fortran 指令

f95 で受け入れられる一般的な指令ては、「2.3 指令」で説明します。

表 D–1 一般的な Fortran 指令の要約

書式

C$PRAGMA keyword ( a [ , a ] … ) [ , keyword ( a [ , a ] … ) ] ,…

C$PRAGMA SUN keyword ( a [ , a ] … ) [ , keyword ( a [ , a ] … ) ] ,…

C$PRAGMA SPARC keyword ( a [ , a ] … ) [ , keyword ( a [ , a ] … ) ] ,…

1 桁目に指定する注釈指示子は、cC!、または * です。これらの例では注釈指示子として C を使用していますが、f95 の自由形式では ! を使用する必要があります。

C 指令

C$PRAGMA C(list)

外部関数の名前リストを C 言語のルーチンとして宣言します。 

IGNORE_TKR Directive

C$PRAGMA IGNORE_TKR {name {, name} ...}

コンパイラは、特定の呼び出しを解釈するとき、一般的な手続きのインタフェースで表示される仮引数名の型、種類、ランクを無視します。 

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 SUN_PREFETCH_READ_ONCE (name)

C$PRAGMA SUN_PREFETCH_READ_MANY (name)

C$PRAGMA SUN_PREFETCH_WRITE_ONCE (name)

C$PRAGMA SUN_PREFETCH_WRITE_MANY (name)

名前の参照のために、先読み命令を生成するようにコンパイラに要求します。(-xprefetch オプションを指定する必要があります。このオプションはデフォルトで有効になっています。PREFETCH 指令は、—xprefetch=no でコンパイルし無効にします。ターゲットアーキテクチャーも PREFETCH 指令をサポートしている必要があり、コンパイラ最適化レベルは -xO2 より上に設定されている必要があります)

ASSUME Directives

C$PRAGMA [BEGIN} ASSUME (expression [,probability])

C$PRAGMA END ASSUME

プログラム内の特定の個所において、コンパイラが真であると想定できる条件について表明を行います。 

D.2 特殊な Fortran 指令

次の指令は、f95 でのみ使用できます。詳細は、「4.8.2 FIXED 指令と FREE 指令」を参照してください。

表 D–2 特殊な Fortran 指令

書式

!DIR$ directive : 最初の行

!DIR$& ... : 継続行

固定形式の場合、C は CDIR$ directive... のように指令指示子としても

CDIR$ directive...

行は第 1 行から始める必要があります。自由形式の場合は、行の前に空白がある場合があります。 

FIXED/FREE 指令

!DIR$ FREE!DIR$ FIXED

指令のあとに続くソース行の書式を指定します。これらは、次に FREE 指令または FIXED 指令が出現するまで、残りのソースファイルに適用されます。

D.3 Fortran の OpenMP 指令

Sun Studio Fortran のコンパイラでは、OpenMP 3.0 の Fortran API がサポートされています。-openmp コンパイラフラグは、これらの指令を有効にします (「3.4.149 –xopenmp[={ parallel|noopt|none}]」を参照)。

詳細は、『OpenMP API ユーザーズガイド』を参照してください。

D.4 Sun の並列化指令


注 –

従来の Sun および Cray の並列化指令は非推奨になり、無視されます。Solaris SPARC および x86 プラットフォームでの並列化には、OpenMP API の使用が推奨されます。従来のアプリケーションを OpenMP に移行する方法については、『OpenMP API ユーザーズガイド』を参照してください。


Fortran で推奨する並列化モデルは、OpenMP による並列化です。Sun 形式の並列化指令は、従来のアプリケーション用にここで説明します。

表 D–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 [qualifiers]

それ以降の 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*

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

D.5 Cray の並列化指令


注 –

従来の Sun および Cray の並列化指令は非推奨になり、無視されます。Solaris SPARC および x86 プラットフォームでの並列化には、OpenMP API の使用が推奨されます。従来のアプリケーションを OpenMP に移行する方法については、『OpenMP API ユーザーズガイド』を参照してください。


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

表 D–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 Directive

CMIC$ TASKCOMMON block_name

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

DOSERIAL 指令

CMIC$ DOSERIAL

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

DOSERIAL* 指令

CMIC$ DOSERIAL*

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