Fortranでのファイル入出力が遅い

Fortran (ifort/ifx) プログラムにおいてファイル入出力に時間を要する場合、以下の方法によって時間を削減できる可能性があります。

 

ファイル数やopen/close/read/write回数を削減する

open/close/read/writeなどのファイル操作はコストを要するため、高頻度に実行するとボトルネックになる可能性があります。例えば時間発展シミュレーションの場合は、1時間ステップごと新たなファイルを生成するのではなく、1つのファイルに追記することをご検討ください。

 

read/writeも小さい単位で多数実行するより、可能な限りまとめて大きな単位で実行する方が高速です。例えば、配列をファイル出力する場合、以下のように要素ごとにwriteすると、大きな配列では長時間要します。

以下のように1つのwrite文で出力する方が高速です。

 

書式なし出力を用いる

open文の引数においてform="formatted"と指定すると書式付き出力 (テキスト形式)、form="unformatted"を指定すると書式なし出力 (バイナリ形式) が使用されます。また、formを指定していない場合は、デフォルトで書式付き出力が使用されます。書式付き出力はエディタ等で表示できる一方、計算機内部の浮動小数点数表現からテキスト形式に変換するため、書式なし出力に比べ読み書きの性能が劣り、ファイルサイズが大きくなります。

 

大容量のデータを入出力する場合は、書式なし出力をお使いください。

 

Buffered I/Oを用いる

デフォルトでは、ifort/ifxでコンパイルされたプログラムではUnbuffered I/Oが用いられます。すなわち、writeの内容は即座にファイルシステムに書き込まれます。一方、Buffered I/Oと呼ばれる機能を有効にすると、writeの内容はメモリ上の領域 (バッファ) に蓄積され、バッファが満杯になった時点でファイルシステムに書き込まれます。これにより、ファイルシステムに対する操作の回数が削減され、writeの性能が向上します。readについても同様にバッファを活用することが可能です。

 

ifort/ifxにおいてbuffered I/Oを有効化するためには、以下の方法などがあります。詳しくはIntel Fortranコンパイラのマニュアルをご参照ください。

  • - ファイルのopen時にbuffered="yes"引数を指定する
  • - プログラムのコンパイル時にオプション-assume buffered_ioを指定する
  • - 実行時に環境変数FORT_BUFFERED=trueを設定する
  •  

    I/Oライブラリを使用する

    HDF5ADIOS2などのI/Oライブラリは、I/Oを高速化するための工夫に加え、メタデータの格納、データ圧縮、部分データの読み書きなど、便利な機能を多数搭載しています。当センターの計算機でも提供していますので、利用をご検討ください。