概要
nAG Fortranコンパイラ リリース 7.0 はメジャーアップデートです。
nAG Fortranコンパイラの以前のリリースからアップグレードするお客様は、 このリリースの新しいライセンスキーが必要になります。
Kusariライセンス管理の詳細については KLICENCE.txt を参照してください。
2 リリースの概要
このリリースには、いくつかの主要な新機能が含まれています。
- 共有メモリマシンでの共配列プログラムの並列実行
- IEEE算術標準に準拠した半精度浮動小数点(すべての例外と丸めモードの完全サポートを含みます)
- サブモジュール(大きなモジュールを個別にコンパイル可能なファイルに分割できるFortran 2008の機能)
- チーム(Fortran 2018の共配列の機能で並列実行を構造化するためのもの)
- イベント(Fortran 2018の共配列の機能で軽量な片側同期を行うもの)
- 不可分操作(Fortran 2018の共配列の機能で同期せずに不可分変数を更新するためのもの)
このリリースには、以下を含む多数のマイナーな機能強化も含まれています。
- Fortran 2008およびFortran 2018標準のその他の(マイナーな)機能
- エラー検出のその他の改善、およびエラーメッセージの改善
- 追加の非標準Fortran拡張機能の受け入れ
- オプショナルで変数群入力(NAMELIST)の自動スキップ機能
3 互換性
3.1 リリース6.2との互換性
MacOSでは、-abi=32 で利用可能であった32ビットABIモードは削除されました。 その結果、64ビットコンパイルのみがサポートされ、-abi=オプションは完全に削除されました。これ以外については共配列が使用される場合を除きリリース7.0とリリース6.2は完全に互換性があります。 共配列を使用するプログラムはすべて再コンパイルする必要があります。
3.2 リリース6.1との互換性
ILEN組み込み関数やHPF_LIBRARYモジュールなど、 HPF(High Performance Fortran)の機能を使用するプログラムはサポートされなくなりました。Linux x86-64で以前廃止予定機能であった-abi=64オプションは廃止されました。 このオプションは、64ビットポインターを持つが32ビットのオブジェクトサイズと添え字演算を備えるABIを提供していましたが、 これはリリース5.1以前との互換性のためにのみ存在していました。
HPFサポートと非推奨のオプションの削除を除き、nAG Fortranコンパイラのリリース7.0はリリース6.1と完全に互換性があります。
3.3 リリース6.0との互換性
HPFサポートと非推奨オプションの削除を除き、nAG Fortranコンパイラのリリース7.0はリリース6.0と互換性があります。 ただし、“パラメタ化構造型”の割付け配列を使用するプログラムは再コンパイルする必要があります (これはモジュール変数及び仮引数にのみ影響します)。3.4 リリース5.3.1、5.3および5.2との互換性
HPFサポートと非推奨のオプションの削除を除き、nAG Fortranコンパイラのリリース7.0はリリース5.3.1と完全に互換性があります。 またWindowsでは、名前がドル記号($)で始まるモジュールまたはプロシージャを再コンパイルする必要があることを除いて、 リリース5.3および5.2と完全に互換性があります。新しい“パラメタ化構造型”機能を使用するプログラムの場合、 動的型がパラメーター化された派生型である可能性のある多相性変数を割り当て、 割り当て解除、初期化、またはコピーするプログラムのすべての部分を リリース7.0でコンパイルすることが強く推奨されています。
3.5 リリース5.1との互換性
nAG Fortranコンパイラのリリース7.0は、次の点を除き、nAGWare f95 リリース5.1と互換性があります。- HPFの機能を使用するプログラムはサポートされていません。
- CLASSキーワードを使用する、または拡張される型を含むプログラムまたはライブラリは、 再コンパイルする必要があります。
- Linux x86-64(製品NPL6A51NA)上でリリース5.1でコンパイルされた64ビットプログラム、 およびライブラリはバイナリ互換ではないため、再コンパイルする必要があります。
3.6 以前のリリースとの互換性
特に明記されている場合を除き、nAG Fortranコンパイラリリース7.0は、 nAGWare f90リリース2.1および2.2と互換性があり、1.0~5.0のすべてのnAGWare f95リリースと互換性があります。リリース5.1で、以下の非互換性が導入されました。
- ALLOCATEまたはDEALLOCATEステートメントでSTAT=によって返される値は、 場合によっては5.1以前の値と異なる場合があります。 詳細については、F90_STATモジュールのドキュメントを参照してください。
- 5.0で型拡張子(EXTENDS属性)を使用したプログラムは、再コンパイルする必要があります。
- IEEE無限大とNaNの書式付き出力は異なり、現在はFortran 2003に準拠したものとなっています。
- 浮動小数点ゼロの並び出力では、Fortran 2003で定められている、E形式ではなくF形式が使用されるようになりました。
- NAMELISTの入力中にI/Oまたはフォーマットエラーが発生した場合、エラーのあるレコードがスキップされるようになりました。 この動作は、並び入力を含む他のすべての書式付き入力操作と同じです。
4 Fortran 2003サポートのアップデート
-
IEEE_ARITHMETICおよびIEEE_EXCEPTIONSのIEEE_SUPPORT関数が、定数式で利用可能です。
例)LOGICAL,PARAMETER :: minexp = & MERGE(MIN_EXPONENT(X)-DIGITS(X),MIN_EXPONENT(X),IEEE_SUPPORT_DENORMAL(X))
5 Fortran 2008の新機能
-
演算が宣言関数によって提供される場合、宣言式にユーザー定義の演算が利用できるようになりました。
(宣言関数は、文関数または内部関数ではなく、
仮手続き引数を持たない純粋な関数でなければなりません。)
例えば以下の引用仕様宣言が与えられた場合
INTERFACE OPERATOR(.user.) PURE INTEGER FUNCTION userfun(x) REAL,INTENT(IN) :: x END FUNCTION END INTERFACE
ユーザー定義演算子.user.は、次のように宣言式で使用できます。LOGICAL mask(.user.(3.145))
これは、オーバーロードされた組込み演算子とユーザー定義演算子の両方に適用されることに注意してください。
-
宣言式でISO_C_BINDINGモジュールのC_LOCおよびC_FUNLOC関数が使用できるようになりました。
例えばTYPE(C_PTR)変数Xと、TARGET属性を持つ別の相互運用可能な変数Yが与えられた場合、
INTEGER workspace(MERGE(10,20,C_ASSOCIATED(X,C_LOC(Y))))
と記述することができ、CポインターXがYに関連付けられている場合はworkspaceに10要素、 それ以外の場合は20要素を与えます。 -
内部手続きが総称引用仕様内の個別手続きでも良くなりました。
例)SUBROUTINE example INTERFACE gen PROCEDURE internal END INTERFACE CALL gen CONTAINS SUBROUTINE internal PRINT *,'Hello example' END SUBROUTINE END SUBROUTINE
genが親有効域の総称名、または参照結合によってインポートされた総称名である場合、 総称genは他の手続き参照できます。 ただし、genは、サブルーチンexample内から呼び出された場合にのみ、 手続きinternalを参照できます。
-
FINDLOC組込み関数が利用可能になりました。
MAXLOCおよびMINLOCに似ていますが、
配列の最大値または最小値の位置を見つける代わりに、
指定された値と等しい値を持つ配列の位置を見つけます。
したがってCOMPLEXやLOGICALを含むすべての組込み型で利用できます。
次の2つの形式のいずれかが用いられます。
FINDLOC (ARRAY, VALUE, DIM, MASK, KIND, BACK ) FINDLOC (ARRAY, VALUE, MASK, KIND, BACK )
ここでARRAY 組込み型の配列で、次元数はN VALUE 同じ型のスカラー(LOGICALの場合)、または組込み演算子==で比較可能 (または.EQ.)を使用してARRAYと比較可能 DIM 1からNの範囲のスカラーINTEGER MASK (省略可能) ARRAYと同じ形状のLOGICAL型の配列 KIND (省略可能) 有効な整数の種別番号を示すスカラーINTEGER定数式 BACK (省略可能) LOGICALスカラー値 関数の結果はINTEGER型、またはKINDが存在する場合はINTEGER(KIND)となります。
DIMのない形式では、結果は長さNのベクトルであり、ARRAY内のVALUEと等しい要素の位置です。 MASKが存在する場合、MASKの対応する要素が.TRUE.である要素のみが対象となります。 MAXLOCおよびMINLOCと同様に、位置は各次元の最初の要素を1とした場合の値で報告されます。 VALUEに等しい要素が見つからない場合、結果はゼロになります。 BACKが存在し且つその値が.TRUE.の場合、見つかった要素は最も後ろの要素です(配列要素順序で)。それ以外の場合は最も前のものとなります。
DIMのある形式では、結果の次元数はN−1(ARRAYがベクトルの場合はスカラー)です。 そしてその形状はARRAYから次元DIMが削除されたものとなります。 結果の各要素は、VALUEと等しい次元DIMベクトル内の(マスクされた)要素の位置を示します。
たとえば、ARRAYが値[10,20,30,40,50]の整数ベクトルの場合、 FINDLOC(ARRAY,30)はベクトル[3]およびFINDLOC(ARRAY,7)は、ベクトル[0]を返します。
-
サブモジュールは、単独のモジュール手続と共に、Fortranプログラムを構築する追加の方法を提供します。
“単独のモジュール手続”は、引用仕様がモジュール宣言部で宣言され、その定義がモジュール自体もしくはそのモジュールのサブモジュールのいずれかで提供される手続きです。 単独のモジュール手続の引用仕様は、引用仕様本体の手続接頭句でMODULEキーワードを用いて宣言されます。
例)INTERFACE MODULE RECURSIVE SUBROUTINE sub(x,y) REAL,INTENT(INOUT) :: x,y END SUBROUTINE END INTERFACE
単独のモジュール手続の引用仕様の重要な側面は、他の引用仕様本体とは異なり、IMPORT文を必要とせずに親子結合によってモジュールへアクセスする点です。
例)INTEGER,PARAMETER :: wp = SELECTED_REAL_KIND(15) INTERFACE MODULE REAL(wp) FUNCTION f(a,b) REAL(wp) a,b END FUNCTION END INTERFACE
単独のモジュール手続の最終的な定義は、モジュール、サブモジュールに関わらず、引用仕様の宣言とまったく同じ特性、同じ仮引数名、同じ名前結果変数名(関数の場合)、 同じbinding-name(BIND(C)を使用する場合)、そしてRECURSIVEの場合はRECURSIVEでなければなりません。 これを実現する方法は以下の2つがあります。-
通常の方法で手続きを定義し、すべての特性を正しく取得します。コンパイラによりチェックがなされます。
定義は手続接頭句にMODULEキーワードを含む必要があります。
例)... CONTAINS MODULE REAL(wp) FUNCTION f(a,b) REAL(wp)a,b f = a**2 - b**3 END FUNCTION
-
または、引用仕様全体を、MODULE PROCEDURE文を用いて、再宣言することなく、アクセスする事も可能です。
例)... CONTAINS MODULE PROCEDURE sub ! 引数AとBとそれらの特性、再帰サブルーチンであるという点は ! すべて引用仕様宣言から取得される。 IF (a>b) THEN CALL sub(b,-ABS(a)) ELSE a = b**2 - a END IF END PROCEDURE
submodule-stmt declaration-part [ CONTAINS module-subprogram-part ] END [ SUBMODULE [ submodule-name ] ]
初期のsubmodule-stmtの形式はSUBMODULE ( module-name [ : parent-submodule-name ] ) submodule-name
module-nameは、1つ以上の単独のモジュール手続を持つモジュールの名前です。 parent-submodule-name(存在する場合)はそのモジュールの別のサブモジュールの名前であり、 parent-submodule-name(存在する場合)はそのモジュールの別のサブモジュールの名前であり、submodule-nameは定義されているサブモジュールの名前です。 したがって、モジュールのサブモジュールはツリー構造を形成し、一連のサブモジュールは他のサブモジュールを拡張できます。 ただし、サブモジュールの名前はそのモジュール内で一意です。 この構造は、モジュール自体にすべての基礎情報(タイプ、定数、および手続き)を配置することなく、複数のサブモジュールで使用できる内部基礎情報の作成を容易にするためのものです。定義されているサブモジュールは、親子結合によって親モジュールまたはサブモジュールにアクセスします。 モジュールの要素の場合、これにはPRIVATE要素へのアクセスが含まれます。 したがって、declaration-partで宣言する局所要素は、同じ名前を持つホスト内の要素へのアクセスをブロックします。
サブモジュールによって宣言された要素(変数、型、手続き)は、そのサブモジュールに対して局所的です。 ただし、祖先モジュールで宣言され、サブモジュールで定義された単独のモジュール手続は例外です。 束縛名が引用仕様と同じである必要がある別のモジュール手続きの場合を除き、手続きは束縛名を持つことはできません。
例)
MODULE mymod INTERFACE MODULE INTEGER FUNCTION next_number() RESULT(r) END FUNCTION MODULE SUBROUTINE reset() END SUBROUTINE END INTERFACE END MODULE SUBMODULE (mymod) variables INTEGER :: next = 1 END SUBMODULE SUBMODULE (mymod:variables) functions CONTAINS MODULE PROCEDURE next_number r = next next = next + 1 END PROCEDURE END SUBMODULE SUBMODULE (mymod:variables) subroutines CONTAINS MODULE SUBROUTINE reset() PRINT *,'Resetting' next = 1 END SUBROUTINE END SUBMODULE PROGRAM demo USE mymod PRINT *,'Hello',next_number() PRINT *,'Hello again',next_number() CALL reset PRINT *,'Hello last',next_number() END PROGRAM
他のサブモジュールで使用するサブモジュール情報は、 nAG Fortranコンパイラーによってmodule.submodule.subという名前のファイルに、.modと同様の形式で保存されます。 .modファイルの作成を抑制する-nomodオプションは、.subファイルの作成も抑止します。
-
通常の方法で手続きを定義し、すべての特性を正しく取得します。コンパイラによりチェックがなされます。
定義は手続接頭句にMODULEキーワードを含む必要があります。
6 Fortran 2018の新機能
-
OPERATOR総称の一部である関数の仮引数にVALUE属性を持つものがある場合、
INTENT(IN)属性が必須ではなくなりました。
例)
INTERFACE OPERATOR(+) MODULE PROCEDURE logplus END INTERFACE ... PURE LOGICAL FUNCTION logplus(a,b) LOGICAL,VALUE :: a,b logplus = a.OR.b END FUNCTION
-
ASSIGNMENT総称の一部であるサブルーチンの2番目の引数にVALUE属性がある場合、
INTENT(IN)属性を持つ必要はなくなりました。
例)
INTERFACE ASSIGNMENT(=) MODULE PROCEDURE asgnli END INTERFACE ... PURE SUBROUTINE asgnli(a,b) LOGICAL,INTENT(OUT) :: a INTEGER,VALUE :: b DO WHILE (IAND(b,NOT(1))/=0) b = IEOR(IAND(b,1),SHIFTR(b,1)) END DO a = b/=0 ! Odd number of "1" bits. END SUBROUTINE
-
-recursiveまたは-f2018オプションを使用すると、
手続きがデフォルトで再帰的となります。
例えば
INTEGER FUNCTION factorial(n) RESULT(r) IF (n>1) THEN r = n*factorial(n-1) ELSE r = 1 END IF END FUNCTION
はRECURSIVEキーワードで明示的に宣言された場合と同様に有効です。これは引継ぎ文字長の文字関数(結果がCHARACTER(LEN=*)で宣言されている場合には適用されません。 これらは引き続きRECURSIVEの宣言が禁止されています。
デフォルトでRECURSIVEである手続きは、 RECURSIVEで明示的に宣言されているかのように、 -saveオプションの効果から除外されます。
-
明示的に宣言されたRECURSIVEであろうと、
デフォルトで再帰的な場合(-f2018または-recursiveオプションが指定されている)であろうと、
要素手続きは再帰的になります。
例)ELEMENTAL RECURSIVE INTEGER FUNCTION factorial(n) RESULT(r) INTEGER,INTENT(IN) :: n IF (n>1) THEN r = n*factorial(n-1) ELSE r = 1 END IF END FUNCTION
上記は下記のように呼び出すとPRINT *,factorial( [ 1,2,3,4,5 ] )
最初の5つの階乗を出力します。 -
NON_RECURSIVEキーワードは、手続きが再帰的に呼び出されないことを明示的に宣言します。
例)NON_RECURSIVE INTEGER FUNCTION factorial(n) RESULT(r) r = 1 DO i=2,n r = r*i END DO END FUNCTION
Fortran 2008以前の標準では、手続きはデフォルトで非再帰的であるため、 -recursiveまたは-f2018が使用されていない限り、 このキーワードは効果がありません。
-
組込みモジュールISO_C_BINDINGのC_FUNLOC関数は、
相互運用できない手続き引数を受け入れます。
生成されたC_FUNPTR値はC関数ポインターに変換されるべきではありませんが、
ISO_C_BINDINGのC_F_PROCPOINTERサブルーチンを使用して、
適切な(相互運用不可能な)Fortran手続きポインターに変換できます。
例)USE ISO_C_BINDING ABSTRACT INTERFACE SUBROUTINE my_callback_interface(arg) CLASS(*) arg END SUBROUTINE END INTERFACE TYPE,BIND(C) :: mycallback TYPE(C_FUNPTR) :: callback END TYPE ... TYPE(mycallback) cb PROCEDURE(my_callback_interface),EXTERNAL :: sub cb%callback = C_FUNLOC(sub) ... PROCEDURE(my_callback_interface),POINTER :: pp CALL C_F_PROCPOINTER(cb%callback,pp) CALL pp(...)
この機能は、C言語で操作されるデータ構造にC_FUNPTR値が格納されている場合の混合言語プログラムで役立つ場合があります。
-
組込みモジュールISO_C_BINDINGのC_LOC関数は相互運用不可能な型の配列を受け入れ、
C_F_POINTER関数は相互運用不可能な型の配列ポインタを受け入れます。
配列は非多相的で且つ連続である必要があります。
これにより、CとFortranの混合言語プログラミングの相互運用性が向上します。 プログラムがCルーチンまたはCデータ構造を介して、 相互運用できない配列で不明瞭な“ハンドル”を渡すことができ、後にFortran配列ポインターの再構築が行えます。 この種の使用法は、以前はスカラーに対してのみ可能でした。
- EQUIVALENCE文、COMMON文、およびBLOCKDATAプログラム単位は、 Fortran 2018では廃止予定であり、-f2018オプションが使用された場合(これはデフォルトではありません)、その旨のメッセージが出力されます。
- 接続されていない装置またはファイルに対するINQUIRE文のRECL=指定子は、 値−1を変数に割り当てるようになりました。 ACCESS='STREAM'で接続されたユニットまたはファイルの場合、値−2を変数に割り当てます。 以前のFortran標準では、変数は未定義になりました。
-
次に示す追加の組込み不可分サブルーチンは、複数のイメージが同期せずに不可分変数を更新する手段を提供します。
ATOMIC_ADD (ATOM,VALUE,STAT) ATOMIC_AND (ATOM,VALUE,STAT) ATOMIC_CAS (ATOM,OLD,COMPARE,NEW,STAT) ATOMIC_FETCH_ADD (ATOM,VALUE,OLD,STAT) ATOMIC_FETCH_AND (ATOM,VALUE,OLD,STAT) ATOMIC_FETCH_OR (ATOM,VALUE,OLD,STAT) ATOMIC_FETCH_XOR (ATOM,VALUE,OLD,STAT) ATOMIC_OR (ATOM,VALUE,STAT) ATOMIC_XOR (ATOM,VALUE,STAT) 引数ATOM、COMPARE、NEW、およびOLDはすべてINTEGER(ATOMIC_INT_KIND)です。 ATOM引数が更新されるものであり、共配列または並列添字付き変数でなければなりません。 OLD引数はINTENT(OUT)であり、操作の前にATOMの値を受け取ります。 STAT引数は省略可能であり、INTEGER型の少なくとも16ビットのサイズの並列添字無し変数でなければなりません。
VALUE引数はINTEGERでなければなりませんが、どんな種類でもかまいません。 ただし、VALUEと演算結果の両方がINTEGER(ATOMIC_INT_KIND)でなければなりません。
*_ADD演算は加算で、*_AND演算は(IANDと同様に)ビット毎の論理積、 *_OR演算は(IORと同様に)ビット毎の論理和、そして*_XOR演算は(IEORと同様に)ビット毎の排他的論理和です。
ATOMIC_CASは不可分な比較交換演算です。 ATOMがCOMPAREと等しい場合、値NEWが割り当てられます。それ以外の場合、変更されません。 いずれの場合でも、操作前の値はOLDに割り当てられます。 COMPAREもNEWもINTEGER(ATOMIC_INT_KIND)でなければならない点に注意して下さい。
ATOMが並列添字付き変数であり、失敗した像にこれがある場合、操作は失敗し、エラー状態が発生します。 OLD引数は未定義になり、STATが存在する場合、値STAT_FAILED_IMAGEが割り当てられます。 STATが存在しない場合、プログラムは終了します。 エラーが発生せず、STATが存在する場合、値0が割り当てられます。
-
組込み関数COSHAPEは共配列のco-extentsのベクトルを返します。
以下の形式を持ちます。
COSHAPE( COARRAY , KIND )
ここでCOARRAY 任意のタイプの共配列。ALLOCATABLEの場合割付ける必要がある 構造体成分の場合、右端の成分は共配列成分でなければならない KIND (省略可能)有効な整数の種別番号を示すINTEGERスカラー定数式 関数の結果はINTEGER型となります。KINDが存在する場合にはINTEGER(KIND)となります。
結果のサイズは、COARRAYの共次元数と等しくなります。 例えば共配列が以下のように宣言されている場合で
REAL x[5,*]
現在のチームに8つの像がある場合、COSHAPE(x)は[5,2]と等しくなります。 -
組込みの要素関数IMAGE_STATUSは、別の像が停止したか失敗したかを問い合わせます。
以下の形式を持ちます
IMAGE_STATUS( IMAGE , TEAM )
ここでIMAGE 有効な像番号を示す正の整数 TEAM (省略可能)現在のチームまたは祖先チームを識別するスカラーTEAM_TYPEの値 関数の結果はデフォルトのINTEGERで、像が失敗した場合はSTAT_FAILED_IMAGE、像が停止した場合はSTAT_STOPPED_IMAGE、それ以外の場合はゼロになります。 省略可能なTEAM引数は、像番号を適用するチームを指定します。 指定されていない場合は、現在のチームに適用されます。
-
組込み関数STOPPED_IMAGESは、
正常終了を開始した像(つまり“stopped”)のリスト(配列)を返します。
以下の形式を持ちます。
STOPPED_IMAGES( TEAM , KIND )
ここでTEAM (省略可能)現在のチームまたは先祖チームを識別するスカラーTEAM_TYPE値 KIND (省略可能)有効な整数の種別番号を示すスカラーINTEGER定数式 関数の結果は、INTEGER型のベクトル、またはKINDが存在する場合はINTEGER(KIND)です。 配列の要素は昇順です。
-
組込みモジュールISO_FORTRAN_ENVのEVENT_TYPE型は、
新しい文と組込み関数EVENT_QUERYとともに、軽量の片方向同期メカニズムであるイベントのサポートを提供します。
LOCK_TYPE型と同様に、EVENT_TYPE型の要素は変数また成分である必要があり、 EVENT_TYPE型の変数は共配列である必要があり、 変数はLOCK_TYPE型の共配列である必要があります。 そのような変数はイベント変数と呼ばれます。 イベント変数は、EVENT POST文及びEVENT WAIT文、もしくは実引数の仮引数がINTENT(INOUT)である場合を除いて、 変数定義で用いることはできません。
像のイベント変数には、像制御文EVENT POSTを使用して、イベントをポストすることができます。 以下の形式を持ちます。
EVENT POST ( event-variable , sync-stat-list )
ここで、オプションのsync-stat-listは、 単一のSTAT=stat-variable指定子および/または 単一のERRSMG=errmsg-variable指定子を含む可能性のあるコンマ区切りリストです。 ; オプションのsync-stat-listは、 単一のSTAT=stat-variable指定子 および/または単一のERRSMG=errmsg-variable指定子を含む可能性のあるコンマ区切りリストです。 stat-variableは、9999までの値を保持できるスカラー整数変数である必要があり、 errmsg-variableはスカラーの基本文字変数である必要があります。 イベントをポストすると、変数の“outstanding event count”が増加します(このカウントは最初ゼロです)。 この文のevent-variableは、通常、共添字付き変数になります。 像がイベントを自分自身に投稿することはほとんどありません。STAT=が指定され、投稿が成功すると、stat-variableにゼロが割り当てられます。 event-variableが配置されている像が停止している場合、 STAT_STOPPED_IMAGEがstat-variableに割り当てられます。 像が失敗した場合、STAT_FAILED_IMAGEが割り当てられ、 他のエラーが発生した場合、他の正の値が割り当てられます。 ERRMSG=が指定された場合、 エラーが発生すると説明メッセージがerrmsg-variableに割り当てられます。 STAT=が指定されずエラーが発生した場合、 プログラムはエラー終了するため、STAT=なしでERRMSG=を使用しても意味がない点に注意して下さい。
イベントは、次の形式の像制御文EVENT WAITによって受信されます。
EVENT WAIT ( event-variable , event-wait-spec-list )
ここで省略可能なevent-wait-spec-listは、単一のSTAT=stat-variable指定子、 単一のERRSMG=errmsg-variable指定子、 および/または単一のUNTIL=scalar-integer-expr指定子を含む可能性のあるコンマ区切りリストです。 イベントの待機は、“outstanding event count”がUNTIL=指定子の値以上になるまで、 またはUNTIL=が表示されない場合は0より大きくなるまで待機します。 UNTIL=で指定された値が1より小さい場合、1に等しいかのように扱われます。この文のevent-variableは、共添字を作成できません。 つまり、像は、自身のイベント変数にポストされたイベントのみを待機できます。 待機中の像と“outstanding event count”に寄与した像の間には部分的な同期があります。 EVENT WAIT文の実行に続くセグメントは、 EVENT POST文の実行前のセグメントに続きます。 同期は逆方向には動作しません。 つまり、ポストを行う像のセグメントの実行がそれを待機する像のセグメントの後に続く事はありません。
STAT=およびERRMSG=は、 STAT_FAILED_IMAGEおよびSTAT_STOPPED_IMAGEが不可能であることを除けば、 EVENT POST文と同様に動作します。
最後に、組込み関数EVENT_QUERYを使用して、 イベント変数を待つことなく問い合わせることができます。 以下の形式を持ちます。
EVENT_QUERY ( EVENT, COUNT, STAT )
ここで EVENTはイベント変数、COUNTは少なくとも基本整数と同じ大きさの整数変数、 省略可能なSTATは最大9999までの値を保持できる整数変数です。 EVENTは、共添字付き変数であってはなりません。 つまり、イベント変数が配置されている像のみがそのカウントを照会できます。 COUNTには、イベント変数の現在の“outstanding event count”が割り当てられます。 STATが存在する場合、正常に実行されると値0が割り当てられ、エラーが発生すると正の値が割り当てられます。 エラーが発生し、STATが存在しない場合、プログラムはエラー終了します。順序付けられていないセグメントのイベントのポストは、 countに割り当てられた値に含まれない場合があることに注意してください。 イベントポストが変数に到達するまでに(通信)時間を要する場合があり、 像が既に同期されている場合にのみ変数に到達したことが保証されます。 EVENT_QUERYの使用自体に同期は含まれません。
-
組込みモジュールISO_FORTRAN_ENVのTEAM_TYPE型は、
新しい文と組込み手続きとともに、共配列並列計算を構築する新しい方法であるチームをサポートします。
基本的な考え方は、チーム内で実行されている間は、
共配列環境はチーム内の像のみが存在するかのように動作するということです。
これにより、計算の特定の部分に関連する像のリストを含んだ配列を受け渡す手間をかけずに、
共配列計算を独立した部分に分割することが容易になります。
EVENT_TYPEやLOCK_TYPEとは異なり、TEAM_TYPEを返す関数は許可されています。 さらに、TEAM_TYPE型の変数はcoarrayであることは禁じられており、 さらに、TEAM_TYPE型の変数は共配列であることは禁じられており、 別の像からTEAM_TYPE値を割り当てる(たとえば、派生型割り付け要素として)と、 変数は未定義になります。 これは、TEAM_TYPEに特定の像に固有な情報(例えば他の像へのルーティング情報)が含まれている可能性があるためです。 TEAM_TYPE型の変数は、チーム変数と呼ばれます。
- チームの作成
- プログラム内のすべての像のセットは、初期チームと呼ばれます。
いかなる時でも、特定の像が特定のチーム(=現在のチーム)を実行します。
現在のチームのサブチームのセットは、次の形式のFORM TEAM文を使用していつでも作成できます。
FORM TEAM ( team-number , team-variable [ form-team-spec-list ] )
ここで、team-numberは正の値となるスカラー整数式、 team-variableはチーム変数、 省略可能なform-team-spec-listはSTAT=、ERRMSG=、 およびNEW_INDEX=index-value指定子を最大で1つ含むコンマ区切りリスト。 現在のチームのアクティブな像はすべて、同じFORM TEAM文を実行する必要があります。 NEW_INDEX=を指定する場合、index-valueは正のスカラー整数でなければなりません(以下を参照)。 STAT=およびERRMSG=指定子は、通常の形式とセマンティクスを持ちます。FORM TEAMの実行が生成するサブチームの数は、 その実行の一意のteam-number値の数に等しくなります。 それぞれの一意のteam-number値はセット内のサブチームを識別し、 各像は指定されたチーム番号を持つサブチームに属します。 NEW_INDEX=を指定する場合、像が新しいサブチーム内で持つ像番号を指定するものであるため、 1からNの範囲内である必要があり、かつ一意である必要があります。ここでNはそのサブチームの像の数です。 NEW_INDEX=が指定されない場合、新しいサブチームの像番号はプロセッサ依存です。
例)
TYPE(TEAM_TYPE) oddeven myteamnumber = 111*(MOD(THIS_IMAGE(),2) + 1) FORM TEAM ( myteamnumber, oddeven )
上記は2つのサブチームを作成します。1つはチーム番号111、もう1つはチーム番号222です。 チーム111には、現在のチームの像番号が偶数である像が含まれ、チーム222には、現在のチームの像番号が奇数である像が含まれます。 各像で、変数oddevenはその像が属するサブチームを識別します。チーム番号は完全に任意であり(プログラムによって選択される)、 “兄弟”チームと呼ばれるそのサブチームのセット内でのみ意味を持つことに注意してください。
- サブチームへの変更
- 現在のチームは、CHANGE TEAM構文を実行することで変更されます。以下のその形式を示します。
CHANGE TEAM ( team-value [ , sync-stat-list ] ) statements END TEAM [ ( [ sync-stat-list ] ) ]
ここでteam-valueはTEAM_TYPE型の値であり、 省略可能なsync-stat-listは最大で1つのSTAT=とERRMSG=指定子を含むコンマ区切りリストです。 STAT=およびERRMSG=指定子は、通常の形式とセマンティクスを持ちます。 構文内でのstatementsの実行は、現在のチームがteam-valueで示されるチームに設定されて行われます。 これは、構文外の現在のチームのサブチームでなければなりません。 現在のチームの設定は、手続きの呼び出し中も有効であるため、 構文によって参照されるすべての手続きは、新しいのチームで実行されます。構文からの制御の移動、例えばRETURNまたはGOTO文によるものは禁止されています。 END TEAM文を実行するか、構文に属するEXIT文を実行することにより、構文を終了できます。 後者は、構文に名前が与えられている場合にのみ可能です (これは上記では示されませんが、CHANGE TEAMの“construct-name:”接頭句、およびEND TEAM文の“construct-name”接尾句で指定可能)。
CHANGE TEAM構文の実行中、像選択子は新しいチームの像番号を使用して動作し、 組込み関数NUM_IMAGESおよびTHIS_IMAGESは新しいチームのデータを返し、SYNC ALL新しいチームのみを同期します。
CHANGE TEAM文とEND TEAM文の両方で、 新しいチームのすべての像の暗黙的な同期があり、 すべてのアクティブな像はこの時点で同じ文を実行する必要があります。
- 親または祖先チームの同期
- CHANGE TEAM構文内で実行中、SYNC ALLおよびSYNC IMAGESの効果は現在のチーム内の像にのみ適用されます。
SYNC ALLで親チームを同期するには、最初に構文を終了する必要があります。
同期後の計算がチーム内で行われる場合、これは不便かもしれません。
この目的のために、SYNC TEAM文が次の形式で追加されました
SYNC TEAM ( team-value [ , sync-stat-list ] )
ここでteam-valueは現在のチームまたはその祖先を識別し、 sync-stat-listは通常最大で1つのSTAT=指定子と最大で1つのERRMSG=指定子を含むコンマ区切りリストです。 (これらは通常のセマンティクスを持っているため、ここでは詳しく説明しません)。その結果、指定されたチームのすべての像が同期されます。
- チーム関連の組込み関数
-
組込み関数GET_TEAMは、特定のチームを識別するTEAM_TYPE型の値を返します。
これが最初のチームのTEAM_TYPE値を取得する唯一の方法です。
関数の形式は以下のとおりです
GET_TEAM( LEVEL )
ここで省略可能なLEVEL引数は、 組込みモジュールISO_FORTRAN_ENVの名前付き定数CURRENT_TEAM、INITIAL_TEAM、またはPARENT_TEAMのいずれかに等しいスカラー整数値です。 この引数は、返されるTEAM_TYPE値が識別するチームを指定します。 これが指定されない場合、現在のチームの値が返されます。 現在のチームが初期チームである場合、初期チームには親がないため、LEVEL引数をPARENT_TEAMと等しくすることはできません。 -
組込み関数TEAM_NUMBERは、(実行中の像によってFORM TEAMで使用された)チーム番号の値を返します。
以下の形式を持ちます
TEAM_NUMBER( TEAM )
省略可能なTEAM引数は、情報を返すチームを指定します。 サブチームや無関係なチームではなく、現在のチームまたは先祖チームを識別する必要があります。 TEAMがない場合、現在のチームのチーム番号が返されます。 初期チームのチーム番号は−1と見なされます(初期チームを除き、すべてのチーム番号は正の値です)。
-
組込み関数GET_TEAMは、特定のチームを識別するTEAM_TYPE型の値を返します。
これが最初のチームのTEAM_TYPE値を取得する唯一の方法です。
関数の形式は以下のとおりです
- 兄弟および先祖チームに関する情報
- 組込み関数NUM_IMAGESおよびTHIS_IMAGEは通常、現在のチームに関連する情報を返しますが、
現在のチームまたは祖先を識別するTEAM_TYPE値を持つTEAM引数(省略可能)を使用して、祖先チームの情報を返すことができます。
同様に、NUM_IMAGES組込み関数は、省略可能なTEAM_NUMBER引数を使用して兄弟チームの情報を返すことができます。
これは現在のチームまたは兄弟チームのチーム番号に等しい整数値となります。
(実行中の像は兄弟チームのメンバーではないため、THIS_IMAGEはTEAM_NUMBER引数を受け入れないことに注意してください。)
したがって、組込み関数NUM_IMAGESには次の2つの追加の形式があります。
NUM_IMAGES( TEAM ) NUM_IMAGES( TEAM_NUMBER )
THIS_IMAGEは以下の形式となります
THIS_IMAGE( TEAM ) THIS_IMAGE( COARRAY , TEAM ) THIS_IMAGE( COARRAY, DIM , TEAM )
COARRAYおよびDIM引数の意味は変更されていません。 省略可能なTEAM引数で、情報を返すチームを指定します。 - 共配列の確立
- 共配列は、そのチームまたはその祖先で確立済でない限り、チーム内で使用することはできません。
確立の基本的なルールは次のとおりです。
- SAVE属性(明示的または暗黙的)を持つ非割付け共配列は常に確立されます。
- 未割り当ての共配列(ALLOCATABLE属性付き)は確立されません。
- 割付けられた共配列は、割り当てられたチームで確立されます。
- 仮共配列は、手続きを呼び出したチームで確立されます(これは、実際の引数が確立されたチームとは異なる場合があります)。
- チームでの共配列の割付けと割付け解除
- CHANGE TEAM文の実行時にALLOCATABLE属性を持つ共配列がすでに割付けられている場合、
その構文内(またはその構文から呼び出される手続き内)でDEALLOCATEすることはできません。
ALLOCATABLE属性を持つ共配列がCHANGE TEAM文の実行時に割付けられていない場合、 その構文内(またはその構文から呼び出された手続き内)で(ALLOCATEを使用して)割付けられます。その後割付けの解除も可能です。 END TEAM文の実行時にそのような共配列が割付けられたままになっている場合、その時点で自動的に割付けが解除されます。
これは、チームを使用する場合、割付け可能な共配列が一部の像(チーム内)に割付けられているものの、 他の像(チーム外)では割付けられていないか、もしくは他の像(チーム外)に異なる形状または型パラメタで割付けられるていることを意味します。 ただし、チームで実行する場合、共配列はチームのすべての像で割付けされていないか、もしくはチームのすべての像で同じ型パラメタと形状で割付けられているかのどちらかです。
- 兄弟チームの共配列へのアクセス
- 像選択子でTEAM_NUMBER=指定子を使用すると、現在のチーム以外の兄弟チーム内の共配列にアクセスできます。
これには、像選択子の拡張構文を使用します。
[ cosubscript-list [ , image-selector-spec-list ] ]
cosubscript-listは通常の共添字並びで、image-selector-spec-listにはTEAM_NUMBER=team-number指定子が含まれます。 team-numberは、兄弟チームを識別する正の整数値です。 image-selector-spec-listにはSTAT=指定子を含めることもできます(これについては、フォールトトレランスで後述します)。TEAM_NUMBER=指定子が使用されている場合、共添字は兄弟チームで共添字として扱われます。 この方法でのアクセスは非常に危険であり、通常はおそらく親チーム全体の同期が必要になることに注意してください。 問題の共配列は、親チームで確立済みでなければなりません。
- 先祖チームの共配列へのアクセス
- 像選択子でTEAM=指定子を使用して、親またはより遠い祖先チームの共配列にアクセスできます。
これには以下の像選択子の拡張構文を使用します。
[ cosubscript-list [ , image-selector-spec-list ] ]
ここでcosubscript-listは通常の添字並びであり、 image-selector-spec-listにはTEAM=team-value指定子が含まれます。 team-value は、現在のチームまたは祖先を識別するTEAM_TYPE型の値です。 image-selector-spec-listにはSTAT=指定子を含めることもできます(これについては、フォールトトレランスで後述します)。TEAM=指定子が使用されると、指定された祖先チームの共同添字が共同添字として扱われ、 指定された像は現在のチームの内外のどちらにもある可能性があります。 現在のチームの外部にある像にアクセスする場合、像が適切に同期されるように注意する必要があります。 このような同期は(それがチーム内で動作するため)SYNC ALLSYNC IMAGESでは取得できませんが、 先祖チームを指定するSYNC TEAMもしくはロックやイベントを使用して取得できます。 問題の共配列は、指定された(現在または先祖の)チームで確立済でなければなりません。
- CHANGE TEAMでの共配列の結合
- CHANGE TEAM構文の局所共配列-nameを構文の外部の名前付き共配列に関連付けて、プロセスの共次元や共寸法を変更することができます。
これは、限られた種類の引数の関連付けのように機能します。 局所共配列名は、
外部共配列の型、パラメータ、次元数、および配列形状がありますが、ALLOCATABLE属性はありません。
このような関連付けが1つ以上あるCHANGE TEAM構文の形式は次のとおりです。
CHANGE TEAM ( team-value , coarray-association-list [ , sync-stat-list ] )
ここでcoarray-association-listは、カンマ区切りの以下のリストですlocal-coarray-name [ explicit-coshape-spec ] => outer-coarray-name
explicit-coshape-specは以下です[ [ lower-cobound : ] upper-cobound , ]... [ lower-cobound : ] *
([something] ...という表記は、somethingが0回以上発生することを意味します。)並列限式はCHANGE TEAM文の実行時に評価されます。
この機能は引数の関連付けほど強力ではないにも関わらず、より混乱しやすいものであるため、推奨されません。
-
共配列のフォールトトレランス機能がサポートされています。
これにはFAIL IMAGE文、組込みモジュールISO_FORTRAN_ENVの名前付き定数STAT_FAILED_IMAGE、
像選択子のSTAT=指定子、および組込み関数FAILED_IMAGESが含まれます。
FAIL IMAGE文の形式は単純です。
FAIL IMAGE
この文を実行すると、現在の像が“fail”になります。つまり、プログラムの実行に参加しなくなります。 これは、nAG Fortran 7.0で像が失敗する唯一の方法です。すべての像が失敗または停止した場合、プログラムの実行は終了します。 nAG Fortranは、像が失敗した場合に警告メッセージを出力します。
像選択子には指定子の省略可能なリストがあり、像選択子の修正された構文は以下の通りです。 (通常の角括弧は文字通り角括弧であり、斜体の角括弧はオプションを示します)
[ cosubscript-list [ , image-selector-spec-list ] ]
ここで、cosubscript-listは共添字のコンマ区切りリスト(変数の共次元ごとに1つのスカラー整数)、 image-selector-spec-listはコンマ区切りで最大1つのSTAT=stat-variable指定子、 そして最大で1つのTEAM=またはTEAM_NUMBER=指定子(前述のとおり)をそれぞれ示します。 アクセスされる共添字付き実体が失敗した像上にある場合、 値STAT_FAILED_IMAGEがstat-variableに代入され、そうでない場合は値ゼロが代入されます。組込み関数FAILED_IMAGESは、失敗したことがわかっている像の配列を返します (同期が行われるまでは、像が失敗し、他の像が認識されない可能性があります) 以下の形式を持ちます
FAILED_IMAGES( TEAM , KIND )
TEAM (optional) is a scalar TEAM_TYPE value that identifies the current or an ancestor team; KIND (optional) is a scalar INTEGER constant expression that is a valid Integer kind number. 関数の結果は、INTEGER型のベクトル、またはKINDが存在する場合はINTEGER(KIND)です。 配列の要素は昇順です。
失敗した像を処理できるようにするために、次のセマンティクスが適用されます。
- 失敗した像の変数への値の書き込みは許可されます(ただし、効果がない場合があります)
- 失敗した像の変数から値を読み取ることは許可されますが、結果は予測できません。
- CHANGE TEAM、END TEAM、FORM TEAM、SYNC ALL、SYNC IMAGES、 またはSTAT=指定子を伴うSYNC TEAM文が許可され、 失敗していない像に対してチームの変更、作成、または同期操作、STAT_FAILED_IMAGE値のSTAT=変数への代入を行います。
フォールトトレランス機能は、原則として、ハードウェア障害からの回復を可能にすることを目的としており、 FAIL IMAGE文を使用して、回復シナリオのテストが可能となります。 nAG Fortran 7.0はハードウェア障害からは回復しません。
-
モジュールIEEE_ARITHMETICには、新しい関数IEEE_NEXT_DOWNとIEEE_NEXT_UPが追加されました。
これらは、IEEE種別のREALでなければなりません(つまり、IEEE_SUPPORT_DATATYPEはその種類のREALに対して.TRUE.を返す必要があります)。
これらは、引数と等しくない次のIEEE値を、それぞれ下方向および上方向について返します。
ただし、−∞の次は−∞であり、@sym{inf}の次は∞となります。
これらの関数は、引数がシグナルNaN(IEEE_INVALIDが通知される)でない限り、例外を通知しないという点で、
古いIEEE_NEXT_AFTER関数よりも優れています。
たとえば、IEEE_NEXT_UP(-0.0)とIEEE_NEXT_UP(0.0)は両方とも、 IEEE_UNDERFLOWを通知せずに、最小の正の非正規値を返します(非正規値がサポートされている場合)。 (IEEE_NEXT_AFTERの場合はIEEE_UNDERFLOWの通知が行われます)
同様に、IEEE_NEXT_UP(HUGE(0.0))は、オーバーフローを通知することなく@sym{inf}を返します。
- モジュールIEEE_ARITHMETICには、 新しい名前付き定数IEEE_NEGATIVE_SUBNORMAL、IEEE_POSITIVE_SUBNORMAL、および新しい関数IEEE_SUPPORT_SUBNORMALが追加されました。 これらはFortran 2018の機能であり、2008年のIEEE算術標準の用語の変更を反映しており、 古い関数IEEE_NEGATIVE_DENORMAL、IEEE_POSITIVE_DENORMALおよびIEEE_SUPPORT_DENORMALと同等です。
-
IEEE_GET_FLAGおよびIEEE_SET_FLAGのFLAG_VALUE引数、
IEEE_GET_HALTING_MODEおよびIEEE_SET_HALTING_MODEのHALTING引数、
IEEE_GET_UNDERFLOW_MODEおよびIEEE_SET_UNDERFLOW_MODEのGRADUAL引数、
のそれぞれについて基本LOGICALが廃止され、あらゆる種別のLOGICALが許可されるようになりました。
例えば
USE F90_KIND USE IEEE_ARITHMETIC LOGICAL(byte) flags(SIZE(IEEE_ALL)) CALL IEEE_GET_FLAG(IEEE_ALL,flags)
は現在のIEEEフラグを1バイトのLOGICAL配列に格納します。
7 その他の拡張
-
VAX FORTRANのOPEN文の指定子であるACCESS='APPEND'が(古いプログラムの移植を支援する目的で)利用可能になりました。
(この機能は1991年にPOSITION='APPEND'指定子で置き換えられました)
この機能はACCESS='SEQUENTIAL',POSITION='APPEND'を使用するのと同等です。
例)
OPEN(17,FILE='my.log',ACCESS='APPEND')
は以下と同等です。OPEN(17,FILE='my.log',POSITION='APPEND')
-
VAX FORTRANのTYPE文がサポートされるようになりました。
この文はPRINT文と同じ構文とセマンティクスを持ちますが、キーワードとしてPRINTの代わりにTYPEが用いられます。
formatが名前で始まる利用形態においては一部構造型定義と曖昧になる部分があります。このような場合、その名前が有効域内で既に利用もしくは定義されている場合のみ、TYPE文として扱われます。
その他の場合には構造型定義として扱われます。例えば、
TYPE *,'Hello'
と以下は同等です。PRINT *,'Hello'
VAX FORTRANのTYPE文を含むソースファイルを拡張ソース整形で処理すると、 すべてのTYPE文がPRINT文に変更されます。 通常のソース整形はTYPE文を変更しませんが、 上述のあいまいな形式が使用されている場合 (セマンティック分析を行わずにこれを行うため) ファイルの残りの部分が誤ってインデントされます。
-
“nX”編集記述子は、その後に句読点ではなく別の編集記述子が続く場合、個々のトークンとして検出されます。
これにより、より良いエラーメッセージが生成され、-dustyオプションを使用した場合の許容範囲が広がりました。例えば、
PRINT 1,42 1 FORMAT(7XI0)
は以下を出力します。
bbbbbbb42
ここでbは空白文字を示します。 (上記はFortran標準に準拠していませんが良く利用されている拡張機能です) -
オプションでNAMELIST入力の自動スキップが可能です。
Fortran標準では、変数群入力が行われる時、入力レコードのアンパサンドの後の名前が(READ文内にある)変数群グループ名と一致する必要があります。
しかしながら一般的な拡張では、ファイル内でそのまま先に進み、変数群名の初期レコードに一致する入力レコードを探します。
通常、名前が一致しない場合にはI/Oエラーとなりますが、自動スキップが有効な場合、 代わりにファイルの終わりに達するか、もしくはアンパサンドと正しい名前で始まるレコードが見つかるまでレコードをスキップします。
例えば以下のコードに対して
PROGRAM asnl INTEGER x,y NAMELIST/name/x,y READ(*,name) PRINT *,'Result',x,y END PROGRAM
以下の入力データを与えた場合&wrong x = 999 y = -999 / &name x = 123 y = 456 /
以下のような結果が出力されます。Result 123 456
変数群入力の自動スキップは、実行時オプションによって制御されます。 環境変数nAGFORTRAN_RUNTIME_OPTIONSに実行時オプションをコンマ区切りで指定可能です。 変数群入力の自動スキップはオプションautoskip_namelistまたはlog_autoskip_namelistによって有効になります。 後者のオプションは、標準エラーへの情報メッセージを生成し、変数群入力が発生した場所を表示します。 次に例を示します。
[example.f90, line 5: Looking for namelist group NAME, skipping WRONG]
変数群入力の自動スキップは標準のFortranではありませんが、非常に一般的な拡張機能です。
8 半精度浮動小数点
REALおよびCOMPLEX型の値と変数で半精度(16ビット)浮動小数点がサポートされています。 この浮動小数点はIEEE算術標準(ISO/IEC/IEEE 60559:2011)に準拠しています。組み込み関数SELECTED_REAL_KIND(3)および組み込みモジュール関数IEEE_SELECTED_REAL_KIND(3)は、半精度の種別番号を返します。 -kind=byteモードではこの値は2となります。 -kind=sequentialモードでは16となります(この値は、種類番号の上位互換性を維持するために選択されました)。
最大の有限半精度値は65504.0、最小の正規半精度値は0.00006103515625、最小の非正規値は0.000000059604644775390625です。
スカラー半精度演算は単精度で評価され、変数に割り当てられる時に、または非組込み、もしくは非数学手続き(例えばSQRTは数学関数ですが、NEARESTはそうではありません)に実引数として渡されたときのみ半精度に丸められます。 これは-round_hrealオプションで制御できます。使用すると、コンパイル時と実行時の両方で、すべての半精度演算が半精度に丸められます。
これらの変換が行われるため、半精度は単精度よりも遅くなります。半精度の唯一の利点はメモリとファイルストレージの容量を半分にすることです。
9 追加されたエラー診断機能
-
-C=intovfは、組込み関数INTにCOMPLEX値を指定した場合に整数オーバーフローを検出するようになりました。
例)
CALL sub((128,0)) ... SUBROUTINE SUB(c) USE iso_fortran_env COMPLEX,INTENT(IN) :: c PRINT *,INT(c,int8) ...
上記コードでCOMPLEX変数Cから8ビットINTEGERへの変換は範囲外なので、 以下のようなメッセージが出力されます。Runtime Error: b6a.f90, line 10: Overflow converting 128.0 to INTEGER(int8)
-
同じファイル内のプログラム単位間での記憶列の不一致が、共通ブロックの合計サイズが同じであった場合にも、検出されるようになりました
例)SUBROUTINE s1 COMMON/c/x,y,z REAL x(5) INTEGER y CHARACTER z(4) END SUBROUTINE SUBROUTINE s2 COMMON/c/xx,zz,yy REAL xx(5) INTEGER yy CHARACTER zz(4) END SUBROUTINE
上記プログラムで次のようなメッセージが生成されます。Error: test.f90: Definitions of COMMON block /C/ in program units S1 and S2 differ at storage unit 6, variable Y in S1 provides a numeric storage unit, but variable ZZ in S2 provides a character storage unit
-dustyオプションを使用すると、このエラーを警告にダウングレードできます。
10 その他の機能強化
- 空のソースファイル、またはコメントのみを含むソースファイルをコンパイルできるようになりました。 (この場合警告が発せられます)
- -f2018オプションは、Fortran 2018のセマンティクスを要求します。 これによりFortran 2018の機能を使用した場合の拡張メッセージは抑止され、 Fortran 2018で廃止予定または削除済の機能に関してObsolescent/Deletedメッセージが生成されます。 また、デフォルトで手続きがRECURSIVEとなります。 (-recursiveオプションと同じ効果)
- 実行時オプションsuppress_underflow_warningは、浮動小数点アンダーフローフラグが設定された場合に、プログラム終了時に通常は出力される警告を抑制します。 実行時オプションunderflow_warningは、浮動小数点アンダーフローフラグが設定されている場合、プログラムの終了時に通常の警告の生成を要求します。 これらの実行時オプションは、環境変数nAGFORTRAN_RUNTIME_OPTIONSで設定できます。 これらは、コンパイル時に-no_underflow_warningオプションをオーバーライドします。
-
宣言文の二連コロンの配置を制御する新しいコード整形オプション-dcolon_column=Nが追加されました。
-dcolon_column=0を指定することは、オプション-nodcolon_columnと同義であり、整列を実行しません。(=デフォルト)
例)
Subroutine s(x, y) Integer, Intent (In) :: x Real, Intent (Out) :: y(1) Logical :: l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13 y = (/ Real :: x /) End Subroutine
上記コードに-dcolon_column=30を適用すると以下の結果が得られます。Subroutine s(x, y) Integer, Intent (In) :: x Real, Intent (Out) :: y(1) Logical :: l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, & l12, l13 y = (/ Real :: x /) End Subroutine
-
精度の一元化(“nagfor =unifyprecision”)で、浮動小数点および複素数の要素に適用される変換がより細かく制御できるようになりました。
種別指定子を持たない要素のみの変更が-pu_floats=Default_Kindsで行えます。
例)
Use working_precision, Only: rp Real (Kind=rp) :: x_single = real(42, kind=rp) Double Precision :: x_double = 42.0D0
上記コードで-pu_floats=Default_Kindsとすると以下が生成されます。Use working_precision, Only: rp Use working_precision, Only: wp Real (Kind=rp) :: x_single = real(42, kind=rp) Real (Kind=wp) :: x_double = 42.0E0_wp