1 イントロダクション
nAG Fortranコンパイラ リリース 6.0は主要なバージョンアップです。
古いバージョン(5.x以前)のライセンスキーを本バージョンで利用する事はできません。
Kusariライセンス管理についての詳細は KLICENCE.txt をご参照下さい。
1.1 リリース 5.3.1, 5.3 及び 5.2 との互換性
nAG Fortranコンパイラ リリース 6.0 は “パラメタ化構造型”を利用していないプログラムについてはリリース 5.3.1 と完全互換です。またリリース5.3及び5.2とも以下の点を除き完全互換です。 (Windowsのモジュール名もしくは手続き名が$で始まるケースは再コンパイルが必要です。)新たに追加された “パラメタ化構造型” の機能を用いるプログラムにおいては プログラムのうちで動的型がパラメタ化構造型の多相変数を割付け、解放、初期化、 もしくは複製するすべての部分について、リリース 6.0で再コンパイルする事が強く推奨されます。
1.2 リリース 5.1との互換性
nAG Fortranコンパイラ リリース 6.0はnAGWare f95 リリース5.1と以下の点を除き互換性があります。- プログラムもしくライブラリのうちCLASSキーワードを使うもの及び拡張する型を持つものは再コンパイルが必要です。
- 64ビットプラットフォームのNPL6A51NAとNPMI651NAは-abi=64 オプションを指定した場合(デフォルト)バイナリ互換ではありません。再コンパイルが必要です。
1.3 それより前のリリースとの互換性
ここで示される以外の点について、nAG Fortranコンパイラ リリース 6.0とnAGWare f90 リリース2.1及び2.0、nAGWare f95 Releases 1.0 から 5.0は互換性があります。以下の非互換性はリリース 5.1より存在しています。:
- ALLOCATE もしくは DEALLOCATE の STAT= により返される値が5.1より前のバージョンと異なる場合があります。 より詳しい情報は F90_STAT モジュールのドキュメントをご参照下さい。
- 5.0で型拡張を使う(EXTENDS属性を用いる)プログラムは再コンパイルが必要です。
- IEEE無限大及び非数(NaN)の書式付き出力がFortran 2003に準拠する形に変更されています。
- 浮動小数点ゼロの並び出力がFortran 2003に準拠するようE書式ではなくF書式を用いるようになりました。
- NAMELISTの入力中に発生する入出力形式エラーは次のレコードまで読み飛ばされるようになりました。 この動きは他の(並び入力を含む)すべての書式付き入力操作と同様です。
2 新機能のまとめ
リリース 6.0はFortran 2003 と 2008 よりの新しい機能及び他の2つの拡張機能を含んでいます。
OpenMP 3.1 がサポートされました。
本リリースではこの他にマイナーなパフォーマンス向上とその他の機能改善が適用されています。
3 新しいFortran 2003の機能
-
拡張型が種別型パラメタによりパラメタ化できるようになりました。
これらの型パラメタは型の中の成分の種別、文字長、及び配列上下限を指定できます。
どのような宣言もしくは構造体構成子であっても種別型パラメタに与える値は定数式でなければなりません。
例)
TYPE quaternion(kind) INTEGER,KIND :: kind = KIND(0.0) REAL(kind) :: r,ir,jr,kr END TYPE TYPE(quaternion(KIND(0.0))) x x = quaternion(KIND(0.0))(1.0,0.0,1.0,1.0) ! 1+j+k. PRINT *,x - ALLOCATABLE属性もしくはPOINTER属性を持つ変数がNAMELIST文内でも使用できるようになりました。 この機能は限定的に利用して下さい。 このような変数は名前付き読み込みもしくは書き出しが行われる前に割付されるか、 もしくは結合されていなければならないからです。
4 新しいFortran 2008の機能
-
Fortran 2008では配列の最大次元数が7から15へ拡張されました。
例えば:
REAL array(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)
は15次元の配列を宣言します。 ノート:配列の最大サイズは変更されておらず従来と同様の1テラバイトである点に注意して下さい。 -
内部手続が実引数として渡せるようにと、手続きポインタへ代入できるようになりました。
内部手続が仮引数経由もしくは手続きポインタ経由で実行された場合に、
親手続きの局所変数へのアクセスが可能となりました。
手続きポインタの場合には、ポインタは親手続が復帰するまでの間のみ有効です。
(これは局所変数がそれ以降存在しなくなるからです)
例)
SUBROUTINE mysub(coeffs) REAL,INTENT(IN) :: coeffs(0:) ! Coefficients of polynomial. REAL integral integral = integrate(myfunc,0.0,1.0) ! Integrate from 0.0 to 1.0. PRINT *,'Integral =',integral CONTAINS REAL FUNCTION myfunc(x) RESULT(y) REAL,INTENT(IN) :: x INTEGER i y = coeffs(UBOUND(coeffs,1)) DO i=UBOUND(coeffs,1)-1,0,-1 y = y*x + coeffs(i) END DO END FUNCTION END SUBROUTINE同時に存在する活動状態の親分身の最大数には制限があります。デフォルトでこの制限はシングルスレッドの場合には30、 マルチスレッドの場合には160となっています。 この制限はそれぞれの内部手続毎に適用される制限です。 この制限は以下の-max_internal_proc_instances=Nオプションで設定可能です。
-
新しい要素別組込関数ERF、ERFC、及びERFC_SCALEDは誤差関数、相補誤差関数、及びスケーリング相補誤差関数をそれぞれ計算します。
一つの引数 X は実数型でなければならず、結果は引数と同じ型と種別となります。
例えば ERF(1.5) はおおよそ0.96611、 ERFC(1.5) はおおよそ0.03389であり、 ERFC_SCALED(1.5) はおおよそ0.32159となる。
-
新しい要素別組込関数GAMMAはガンマ関数を計算します。
一つの引数 X は実数型でなければならず、結果は引数と同じ型と種別となります。
Xの値はゼロもしくは負の整数であってはなりません。
整数に関してはこの関数は(X−1)!と同等です。(X-1の階乗)
そのためXがそんなに大きな値でなくてもオーバーフローが発生します。
例えばGAMMA(6.0)はおおよそ120.0ですがGAMMA(23.0)はおおよそ1.1240007E+21です。
-
新しい要素別組込関数LOG_GAMMAはカンマ関数の絶対値の自然対数を計算します。
一つの引数 X は実数型でなければならず、結果は引数と同じ型と種別となります。
Xの値はゼロもしくは負の整数であってはなりません。
例えばLOG_GAMMA(6.0)はおおよそ4.7874918で、 LOG_GAMMA(23.0)はおおよそ48.47118です。
- 要素別組込関数IS_CONTIGUOUSは一つの配列(型を問わず)を引数として取ります。 配列が連続領域に格納されている場合には.TRUE.を、そうでない場合には.FALSE.を返します。
-
ALLOCATE文で配列を割付ける際にSOURCE=もしくはMOLD=を指定した場合で且つその式が配列の場合、
形状をその配列から直接得る事ができます。
これにより多次元配列では特にSIZEもしくはUBOUNDを使うよりも簡潔な記述が可能となります。
例)
SUBROUTINE s(x,mask) REAL x(:,:,:) LOGICAL mask(:,:,:) REAL,ALLOCATABLE :: y(:,:,:) ALLOCATE(y,MOLD=x) WHERE (mask) y = 1/x ELSEWHERE y = HUGE(x) END WHERE ! ... END SUBROUTINE -
ERROR STOP文が追加されました。
この文はSTOPと似ていますが、プログラムを(正常終了ではなく)異常終了させます。
書式は最初に記述する‘ERROR’部分を除きSTOP文と同等です。
正常終了時のデフォルトのプロセス終了ステータスはゼロですが異常終了の場合は2となります。
例)
IF (x<=0) ERROR STOP 'x must be positive'
-
整数stop-codeを指定した場合、ERROR STOPとSTOPは双方とも整数stop-codeの下8ビットをプロセスの終了コードとします。
また標準エラー出力のエラーコードの出力形式が8進数から10進数へ変更されました。
例えば
STOP 1025
は ‘STOP: 1025’ を出力されます(‘STOP: 2001’ではなく) またこの際のプロセス終了コードは0ではなく1となります。 -
書式指定の反復数の指定で*を用いて無限に反復する事を指定できるようになりました。
例えば
SUBROUTINE s(x) LOGICAL x(:) PRINT 1,x 1 FORMAT('x =',*(:,' ',L1)) END SUBROUTINEは成分数がいくつであっても配列xの全てを一行に表示します。 -
G0編集記述子とG0.d編集記述子が追加されました。
これらの編集記述子は先頭と末尾のすべての空白を省略して一般化された編集を行います。
例えば
PRINT 1,1.25,.True.,"Hi!",123456789 1 FORMAT(*(G0,','))
は以下を出力します。1.250000,T,Hi!,123456789,
-
CONTIGUOUS属性が新たにサポートされました。
本属性は配列ポインタもしくは形状引継ぎ配列に対して利用可能で、その格納が連続である事を指定します。
連続性はコンパイラの最適化で利用される事があります。
形状引継ぎ配列の場合で実引数が連続でない場合には手続きの入り口において連続領域に格納される複製が作られます。 (INTENT(OUT)が指定されている場合はその限りではありません) また手続きの出口においてはこの複製からもとの配列へのデータコピーが行われます。 (INTENT(IN)が指定された場合はその限りではありません)
配列ポインタの場合、ポインタ代入における指示先は連続でなければなりません。 そうでないに -C=pointer オプションを指定すると実行時エラーとなります。 もし連続でない場合でチェックオプションを指定しなかった場合にはプログラムが(場合によっては別の部分で) 異常な動作をしたり異常終了したりすることがあり得ます。
-
組込みの型指定を括弧内に含めることにより簡単に TYPE キーワードを用いた組込型を宣言することが可能です。
例えば
TYPE(REAL) x TYPE(COMPLEX(KIND(0d0))) y TYPE(CHARACTER(LEN=80)) z
は(よりわかりにくい点を除き)以下と同等です。REAL x COMPLEX(KIND(0d0)) y CHARACTER(LEN=80) z
- この拡張によりDOUBLEPRECISIONという名前の拡張型を定義することが許されなくなりました。
- 構文名を持ったEXIT文は(DO構文だけではなく) FORALLとWHERE以外の名前付き構文全てから出る事が可能となりました。
- 遊離状態のポインタ及び割付られていない割付け変数は省略可能な非割付、非ポインタ仮引数に対しての実引数として渡す事ができるようになりました。 この場合実引数が存在していないかのように処理されます。
- TARGET属性を持つ変数はINTENT(IN)属性とPOINTER属性の両方を持つ仮引数に対応した実引数であっても良くなりました。 この場合引数結合ではなく仮引数が実引数への指示状態となります。
-
名前付き構文(PARAMETER)が配列の場合、その形状は定義式より与えられます。
(推定形状配列)
書式は配列上限をアスタリスクで指定します。
例えば
REAL,PARAMETER :: idmat3(*,*) = Reshape( [ 1,0,0,0,1,0,0,0,1 ], [ 3,3 ] ) REAL,PARAMETER :: yeardata(2000:*) = [ 1,2,3,4,5,6,7,8,9 ]
はidmat3の上下限が(1:3,1:3)であり、yeardataの上下限が(2000:2008)であることを示しています。 -
純粋手続きの引数がVALUE属性を持つ場合にはINTENT属性を必要としません。
例えば以下の手続き
PURE SUBROUTINE s(a,b) REAL,INTENT(OUT) :: a REAL,VALUE :: b a = b END SUBROUTINEは正しいFortran 2008のコードです。定義代入サブルーチンの第二番目の引数及び全ての定義演算関数は、 VALUE 属性があっても INTENT(IN) 属性を持たなければなりません。
5 Other Extensions
-
配列の最大次元数が31に引き上げられました。(Fortran 2008の標準では15が必須です)
例えば
REAL array(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)
は30次元の配列を宣言します。(約4GiBのメモリ領域を必要とします) -
MAX及びMIN組込関数は異なる種別のREAL引数もしくはINTEGER引数でも利用可能となりました。
一つの関数参照でINTEGER引数とREAL引数を混在させることは許されていません。
結果の種別は種別混合算術と同様となります。(INTEGERの場合は最も広い範囲を表現可能な種別、
REALの場合は最も精度の高い種別となります)
例えば
SUBROUTINE s(a,b,c) USE ISO_FORTRAN_ENV REAL(REAL32) a REAL(REAL64) b REAL(REAL128) c PRINT *,MAX(a,b,c) END SUBROUTINEにおいてはREAL(REAL128)への変換が行われたa, b,cのうちの最大値を出力します。
6 OpenMPのサポート
6.1 変更点の概要
OpenMP 3.0の機能のうち以下が新たにサポートされました。- REDUCTION変数が連続配列であっても良くなりました。
- TASK指示句がサポートされました。
- TASKWAIT指示句がサポートされました。
- TASKYIELD指示句がサポートされました。
- WORKSHARE及びPARALLEL WORKSHARE指示句がサポートされました。
OpenMP 3.1の機能のうち以下が新たにサポートされました。
- ポインタのFIRSTPRIVATE、LASTPRIVATE、PRIVATEデータ共有句がサポートされました。
- ATOMIC READ、ATOMIC WRITE、ATOMIC CAPTURE指示句がサポートされました。 ATOMIC UPDATE指示句がサポートされました。 (OpenMP 3.0のATOMICと同じ意味を持ちますが書式が異なります)
- TASKYIELD指示句がサポートされました。
OMP_LIBモジュールのOpenMPライブラリルーチンが組込モジュール手続になりました。 これにより他のFortranコンパイラのOpenMPの機能との組み合わせが可能となりました。
非OpenMPスレッドが存在していてもOpenMP並列が動作するようになりました。
いくつかのシステムにおいてOpenMPバリアのオーバヘッドが軽減されました。
6.2 OpenMP機能のサポート状況
以下のテーブルはOpenMP 3.0のサポート状況を示します。
| 実行指示文 | サポート状況 |
| PARALLEL | 全てサポート |
| DO | 全てサポート |
| SECTIONS | 全てサポート |
| SINGLE | 全てサポート |
| MASTER | 全てサポート |
| WORKSHARE | 全てサポート |
| PARALLEL DO | 全てサポート |
| PARALLEL SECTIONS | 全てサポート |
| PARALLEL WORKSHARE | 全てサポート |
| TASK | 全てサポート |
| CRITICAL | 全てサポート |
| BARRIER | 全てサポート |
| TASKWAIT | 全てサポート |
| ATOMIC | 全てサポート |
| FLUSH | 全てサポート |
| ORDERED | 全てサポート |
| データ指示文/句 | サポート状況 |
| THREADPRIVATE | 変数をサポート |
| DEFAULT | 全てサポート |
| SHARED | 全てサポート |
| PRIVATE | 全てサポート |
| FIRSTPRIVATE | 全てサポート |
| LASTPRIVATE | 全てサポート |
| REDUCTION | 全てサポート |
| COPYIN | 全てサポート |
| COPYPRIVATE | 変数をサポート |
以下にOpenMP 3.1の機能のサポート状況を示します。
| 機能 | サポート状況 |
| ATOMIC拡張 | 全てサポート |
| FINAL指示句 | 全てサポート |
| INTENT(IN)のFIRSTPRIVATE | 全てサポート |
| ポインタのFIRSTPRIVATE | 全てサポート |
| ポインタのLASTPRIVATE | 全てサポート |
| MERGEABLE指示句 | 全てサポート |
| OMP_IN_FINALライブラリルーチン | 全てサポート |
| OMP_NUM_THREADS拡張 | 全てサポート |
| OMP_PROC_BIND環境変数 | 一部サポート |
| ポインタのPRIVATE | 全てサポート |
| TASKYIELD指示句 | 全てサポート |
OMP_PROC_BIND環境変数は書式チェックだけ行われ受け入れられますがスレッドの配置に影響を与えません。
OpenMP 3.1の標準のセクション3.1の手続きは全てサポートされます。(以下) omp_set_num_threads, omp_get_num_threads, omp_get_max_threads, omp_get_thread_num, omp_get_num_procs, omp_in_parallel, omp_set_dynamic, omp_get_dynamic, omp_set_nested, omp_get_nested, omp_set_schedule, omp_get_schedule, omp_get_thread_limit, omp_set_max_active_levels, omp_get_max_active_levels, get_level, omp_get_ancestor_thread_num, omp_get_team_size, omp_get_active_level, omp_in_final
OpenMP標準のセクション3.3のロック手続きはサポートされます。(以下) omp_destroy_lock, omp_destroy_nest_lock, omp_init_lock, omp_init_nest_lock, omp_set_lock, omp_set_nest_lock, omp_try_set_lock, omp_try_set_nest_lock, omp_unset_lock, omp_unset_nest_lock
OpenMP標準のセクション3.4の時間計測ルーチンはサポートされます。(以下) omp_get_wtime 及び omp_get_wtick 全てのOpenMP環境変数はサポートされます。
IEEE算術サポート算術モジュールを使う場合、IEEEモード(rounding, halting, underflow)は PARALLEL構文の最初で起動されるOpenMPスレッドへ伝搬され、PARALLEL構文の最後で親スレッドへ戻されます。
7 追加のエラー診断機能
- 書式無し直接探査ファイルのWRITEでバッファオーバーフローが検出されるようになりました。
- CLASS(*)引数を持つ実手続きを渡す場合で仮引数がCLASS(T)引数である場合 (及びその逆の場合)にコンパイル時に検出されるようになりました。
- CLASS(*)引数を持つ手続きのポインタ代入を CLASS(T)引数を持つ手続きポインタに対して行う場合(及びその逆の場合)、 コンパイル時に検出されるようになりました。
- 結果が引継ぎ文字長の要素別処理関数(CHARACTER(*)) の場合、コンパイル時に検出されるようになりました。
- 文字列書式内の空のネストされた書式項目並びが実行時にエラーとして検出されるようになりました。
- 互換性のない二つの属性を言語要素に与えた場合に今まで以上に検出されるようになりました。 (例:ALLOCATABLE と EXTERNAL)
- 手続きポインタへの無効な参照が今まで以上に検出されるようになりました。
- 同じ名前を持つ名前付き構文(例:DO、IF-THEN)で一方が BLOCK構文の内側にあり、他方が外側にある場合にエラーとして検出されるようになりました。
- MVBITS組込みサブルーチンで定義可能ではない仮引数 (対応する実引数が式もしくはDOインデックスなどの値の変更が許されてないものである場合) にエラーとして検出されるようになりました。(-C=callsオプションを指定した場合)
8 その他の機能向上
- 引用仕様生成ツールが新たに追加されました。 このツールは手続き引用仕様をFortranソースファイルより抽出し、 それらの引用仕様をINCLUDEファイルかモジュールを含んだソースファイルとして出力します。 この機能は“nagfor =interfaces”として利用する事ができます。
- 書式付き順番探査ファイルのデフォルトの最大レコード長が1024から65536に変更されました。
- 環境変数OMP_NUM_THREADSのデフォルト値がマシン上のプロセッサ数(コア数)となりました。
- 多相変数(CLASS)と未定義変数検出(-C=undefinedオプション)のいくつかの非互換性が取り除かれました。
-
-i8オプションが追加されました。
基本REAL、基本COMPLEX、基本DOUBLE PRECISIONの大きさを変えずに、
基本INTEGER及び基本LOGICALの大きさを32ビットから64ビットへ変更します。
ノート:このオプションを指定するとEQUIVALENCE と COMMON の振る舞いがFortran標準に準拠しないようになります。 しかしながらこのオプションにより引数の仕様を変更することなく32ビット整数引数を用いるライブラリから64ビット整数を用いるライブラリへの変更が簡単に行えます。 - -mtrace=allオプションを指定して領域が解放された場所(行番号)を今まで以上に得る事ができるようになりました。
- Fortranソース整形ツール(“nagfor =polish”)に新しいオプション -name_scopes=Keywordsが追加されました。 このオプションの指定によりEND文に(名前を含まず)キーワード(FUNCTION, MODULE, PROGRAM, SUBROUTINE)のみを追加する事ができるようになりました。 そしてこのオプションがデフォルトとなりました。
- Fortranソース整形ツール(“nagfor =polish”)に新しいオプション -array_constructor_brackets=Xが追加されました。Xに指定可能な値は Asis (入力ファイルと同じ)、 ParenSlash (括弧とスラッシュ。例 ‘(/ ... /)’)、 Square (中括弧。例 ‘[ ... ]’) デフォルトは-array_constructor_brackets=Asis で従来と同様の振る舞いをします。
- -openmpオプション無しでコンパイルされているプログラムにOpenMPの指示文等が含まれる場合には 最初に出現する指示文等に警告が発せられます。
- 新しいオプション-u=sharingはOpenMPのPARALLEL構文及びTASK構文でDEFAULT指示節が指定されていないものについてのデフォルトデータ共有属性を指定します。 またこのオプションは結合並列指示構文PARALLELDO、 PARALLELSECTIONS、PARALLELWORKSHAREにも適用されます。
- SYSTEM_CLOCK組込みサブルーチンの呼び出しに64ビット整数引数が渡された場合には より精度の高いクロックが利用されます。これによりmaximum countが今まで以上に大きくなり、 オーバーフローの発生を心配をせずに時間計測が行えます。(Windows上で従来は32ビット整数を引数とした場合に10〜20分ほどでオーバーフローが発生していました)
- 四倍精度実数引数を渡して呼び出すSINHの精度が(SQRT(epsilon)から1の範囲において) 改善されました。
