インテル® Fortran コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
外部ファイルについては、I/O を非同期に指定できます。 これにより、I/O 文の実行中にほかの文を実行することができます。
Linux* または OS X* システムで、非同期 I/O を使用するプログラムを実行するには、プログラムをコンパイルおよびリンクする際に、次のいずれかのコンパイラー・オプションを明示的に指定する必要があります。
-threads
-reentrancy threaded
-openmp
Windows® システムでは、非同期 I/O を使用するプログラムを実行するための追加のオプションは必要ありません。
非同期 I/O は、外部ファイルに対するすべての READ 操作および WRITE 操作でサポートされています。 ただし、非同期 I/O を指定する場合、書式付き I/O 操作で可変書式の式を使用することはできません。
非同期 I/O を使用するには、最初にファイルの OPEN 文で ASYNCHRONOUS='YES' を指定し、非同期 I/O で実行するすべての READ 文および WRITE 文に対しても同様の指定を行います。
非同期 I/O 文の実行で、"保留" I/O 操作が開始されます。この操作は、次の方法で終了させることができます。
指定された保留状態の非同期データ転送を待機する明示的な WAIT (initno) 文
ファイルの CLOSE 文
REWIND や BACKSPACE などのファイル位置付け文
ファイルの INQUIRE 文
非同期データ転送文で使用されているオブジェクトが早期に割り当て解除されないようにするには、WAIT 文を使用します。 (これは、保留中の操作が完了する前に割り当て解除される可能性があるローカル・スタック・オブジェクトと割付けオブジェクトでは特に重要です。) WAIT 操作を指定しないと、プログラムはアクセス違反で終了することがあります。 次の例は、WAIT 文の使用方法を示します。
module mod
real, allocatable :: X(:)
end module mod
subroutine sbr()
use mod
integer :: Y(500)
!X and Y initialization
allocate (X(500))
call foo1(X, Y)
!asynchronous writing
open(1, asynchronous='yes')
write(1, asynchronous='yes') X, Y
!some computation
call foo2()
!wait operation
wait(1)
!X deallocation
deallocate(X)
!stack allocated object Y will be deallocated when the routine returns
end subroutine sbr
非同期 I/O が許可されているどうかを調べるには、INQUIRE 文で ASYNCHRONOUS キーワード (ASYNCHRONOUS= 指定子) を使用します。 許可されている場合は、YES が返されます。
また、INQUIRE 文で PENDING キーワード (PENDING= 指定子) を使用して、保留中だった非同期データ転送が完了したかどうかを確認できます。
ID= 指定子がある場合は、指定されたデータ転送が完了すると、PENDING によって指定された変数に False が設定され、INQUIRE 文は指定されたデータ転送の待機処理を実行します。
ID= 指定子が省略されている場合は、指定されたユニットの保留中だったすべてのデータ転送が完了すると、PENDING によって指定された変数に False が設定され、INQUIRE 文は指定されたユニットの保留中だったすべてのデータ転送の待機処理を実行します。
それ以外の場合は、PENDING によって指定された変数に True が設定され、待機処理は実行されません。 保留中だったデータ転送は、保留中のままになります。
ASYNCHRONOUS というデータ属性は、変数で非同期入力/出力を使用するかどうか指定します。 この属性を変数に割り当てると、一部の最適化が行われます。