関連情報
ナビゲーション:Fortran 2003入門   前へ   上へ   次へ

7.14 非同期入出力

7.14.1 基本構文

非同期入出力構文が許され、以下から構成されます。 OPEN, READ, WRITE, INQUIREに対する ASYNCHRONOUS=指定子、READ, WRITE, INQUIREに対する ID=指定子、及びINQUIREに対するPENDING=指定子。

INQUIRE文を除き、ASYNCHRONOUS=指定子はスカラデフォルト文字式を受け付けます。 これは'YES'もしくは'NO'(小文字も大文字として扱われます)と評価されなくてはなりません。 READ文とWRITE文においては、この文字式は定数式である必要があり、 文は非同期入出力接続が許されている外部ファイルを参照しなければなりません。 ASYNCHRONOUS='YES'が指定された場合に非同期のデータ転送が許されます。 OPEN文ではこの指定子がそのファイルに対する非同期データ転送を許すかどうかを規定します。 デフォルト設定は'NO'です。 INQUIRE文においては、ASYNCHRONOUS=指定子はスカラデフォルト文字変数を受け付け、 ファイルが現在非同期入出力用に接続されている場合には'YES'を、 非同期入出力が許されていない場合には'NO'を、 そしてファイルが接続されていない場合には'UNKNOWN'をそれに設定します。

READ文とWRITE文においてID=指定子はスカラ整変数を受け付けます。 この指定子はASYNCHRONOUS='YES'も指定されている場合にのみ許されます。 この整変数にはREADもしくはWRITEが開始する非同期データ転送の“識別子”が代入されます。 この値はINQUIRE文とWAIT文で非同期データ転送の進行を追跡するために利用できます。

INQUIRE文においては、ID=指定子はスカラ整数式を受け付けますが、 その値は該当ファイルに対するREAD文もしくはWRITE文でID=から返されるものでなくてはなりません。 またそれはPENDING=指定子と併用した場合にのみ許されます。 PENDING=指定子はスカラデフォルト論理変数を受け付け、 指定された非同期データ転送がまだ進行中であればそれを.TRUE.に、 完了していれば.FALSE.に設定します。 PENDING=ID=なしで使用された場合、 その問合せは該当ファイルに対するすべての仕掛り中非同期データ転送が対象となります。

非同期データ転送の開始後は、 転送の終了が確認されるまで関係する変数の参照もしくは定義を行ってはなりません。 局所変数の非同期WRITEの場合、転送が完了するまで手続きからの復帰が行われないことを意味します。 非同期データ転送の終了は該当ファイルに対し、後続の同期データ転送があった場合、 INQUIRE文がありPENDING=.FALSE.の応答があった場合、 またはWAIT文が実行された場合に確認できます。

7.14.2 基本的な例

以下は2つのバッファbuf1buf2を使用した例で、 ファイル中にデータがある間は一方を読込み用に、もう一方を処理用に交互に使用します (それぞれのデータセットには後続データの有無を示す論理値が続いているものとします)。
  REAL :: buf1(n,m),buf2(n,m)
  LOGICAL more,stillwaiting
  READ (unit) buf1
  DO
    READ (unit) more ! Note: synchronous
    IF (more) READ (unit,ASYNCHRONOUS='YES') buf2
    CALL process(buf1)
    IF (.NOT.more) EXIT
    READ (unit) more ! Note: synchronous
    IF (more) READ (unit,ASYNCHRONOUS='YES') buf1
    CALL process(buf2)
    IF (.NOT.more) EXIT
  END DO

同期READ文は論理値を読み込む前に、 仕掛り中の非同期 データ転送の完了を自動的に待つ(“wait”)ことになる点に注意してください。 これによりデータセットのバッファ中への読込みは完了しており、処理が安全に行えることが保証されます。

7.14.3 ASYNCHRONOUS属性

ASYNCHRONOUS='YES'を指定したREAD文もしくはWRITE文は、 その入出力リスト、SIZE=指定子の中、 もしくはNML=で示される名前並びに現れるどのような変数にも自動的にASYNCHRONOUS属性を付加します。 これは単一の手続き内で起動され終了する非同期データ転送の場合には適しています。 しかしながら、モジュール変数や仮引数に対する転送で、手続きからの復帰が転送中に行われる場合には不適切と言えます。

ASYNCHRONOUS属性は型宣言文もしくはASYNCHRONOUS文で明示的に指定できます。 ASYNCHRONOUS文での構文は次の通りです。

ASYNCHRONOUS [::] variable-name [ , variable-name ]...

ASYNCHRONOUS属性を持つ変数が仮配列で形状引継ぎ配列もしくは配列ポインタでない場合、 結合された実引数は部分配列、形状引継ぎ配列もしくは配列ポインタであってはなりません。 また仮引数がASYNCHRONOUS属性を持つ場合には、その手続きは明示的な引用仕様を持っている必要があります。 これらの制限は双方とも、属性が明示的に与えられた場合にも暗黙的に与えられた場合にも当てはまります。

7.14.4 WAIT

WAIT文はその他の入出力を行うことなく非同期データ転送の完了を待つ機能を提供します。 その構文は次の通りです。

WAIT ( wait-spec [ , wait-spec ]... )

ここで wait-spec は以下のいずれかです:

UNIT = file-unit-number
END = label
EOR = label
ERR = label
ID = scalar-integer-variable
IOMSG = scalar-default-character-variable
IOSTAT = scalar-integer-variable

UNIT=指定子は指定されなければなりませんが、 ‘UNIT =’はそれが並びでの最初の指定子であれば省略可能です。 ID=指定子はスカラ整数式を受け付けますが、 その値は該当ファイルに対するREAD文もしくはWRITE文のID=から返されるものでなくてはなりません。 ID=指定子が指定されなかった場合、 WAIT文は該当ファイルに対するすべての待ち状態の非同期データ転送が対象となります。

WAIT文の実行完了時には指定された非同期データ転送は完了しています。 指定されたファイルが非同期入出力用にオープンされていなかったり、 接続されていなかった場合には、 WAIT文は何の効果も持ちません(ID=指定子が不正な値に対して使われた場合を除いてエラーとはなりません)。

WAIT文の使用例を示します。

  REAL array(1000,1000,10),xferid(10)
  ! Start reading each segment of the array
  DO i=1,10
    READ (unit,id=xfer(i)) array(:,:,i)
  END DO
  ...
  ! Now process each segment of the array
  DO i=1,10
    WAIT (unit,id=xfer(i))
    CALL process(array(:,:,i)
  END DO

7.14.5 実行のセマンティクス

この時点では、Fortran標準で許されているとおり、すべての実際の入出力は同期式に留まっています。

Results matter. Trust NAG.
Privacy Policy | Trademarks