インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

非同期 I/O の使用

外部ファイルについては、I/O を非同期に指定できます。これにより、I/O 文の実行中にほかの文を実行することができます。

Linux* または macOS* システムで、非同期 I/O を使用するプログラムを実行するには、プログラムをコンパイルおよびリンクする際に、次のいずれかのコンパイラー・オプションを明示的に指定する必要があります。

Windows* システムでは、非同期 I/O を使用するプログラムを実行するための追加のオプションは必要ありません。

ASYNCHRONOUS 指定子の使用

非同期 I/O は、外部ファイルに対するすべての READ 操作および WRITE 操作でサポートされています。ただし、非同期 I/O を指定する場合、書式付き I/O 操作で可変書式の式を使用することはできません。

非同期 I/O を使用するには、最初にファイルの OPEN 文で ASYNCHRONOUS='YES' を指定し、非同期 I/O で実行するすべての READ 文および WRITE 文に対しても同様の指定を行います。

非同期 I/O 文の実行で、"保留" I/O 操作が開始されます。この操作は、次の方法で終了させることができます。

非同期データ転送文で使用されているオブジェクトが早期に割り当て解除されないようにするには、WAIT 文を使用します。(これは、保留中の操作が完了する前に割り当て解除される可能性があるローカル・スタック・オブジェクトと割付けオブジェクトでは特に重要です。)WAIT 操作を指定しないと、プログラムはアクセス違反で終了することがあります。次の例は、WAIT 文の使用方法を示します。

module mod
   real, allocatable :: X(:)
end module mod
subroutine sbr()
use mod
integer :: Y(500)
   ! X と Y を初期化
   allocate (X(500))
   call foo1(X, Y)
   ! 非同期書き込み
   open(1, asynchronous='yes')
   write(1, asynchronous='yes') X, Y
   ! 計算処理
   call foo2()
   ! 待機
   wait(1)
   ! X の割り当て解除
   deallocate(X)
   ! スタックに割り当てられたオブジェクト Y はルーチンのリターン時に割りて解除される
end subroutine sbr

非同期 I/O が許可されているどうかを調べるには、INQUIRE 文で ASYNCHRONOUS キーワード (ASYNCHRONOUS= 指定子) を使用します。許可されている場合は、YES が返されます。

また、INQUIRE 文で PENDING キーワード (PENDING= 指定子) を使用して、保留中だった非同期データ転送が完了したかどうかを確認できます。

ID= 指定子がある場合は、指定されたデータ転送が完了すると、PENDING によって指定された変数に False が設定され、INQUIRE 文は指定されたデータ転送の待機処理を実行します。

ID= 指定子が省略されている場合は、指定されたユニットの保留中だったすべてのデータ転送が完了すると、PENDING によって指定された変数に False が設定され、INQUIRE 文は指定されたユニットの保留中だったすべてのデータ転送の待機処理を実行します。

それ以外の場合は、PENDING によって指定された変数に True が設定され、待機処理は実行されません。保留中だったデータ転送は、保留中のままになります。

ASYNCHRONOUS 属性の使用

ASYNCHRONOUS というデータ属性は、変数で非同期入力/出力を使用するかどうか指定します。この属性を変数に割り当てると、一部の最適化が行われます。

関連情報