便利なライブラリHDF5
By J.Aono
HDF5とは?
HDF5はHierarchical Data Format 5の略です。5はメジャーバージョンです。
CFDや音響解析などの分野でよく使われます。CFDや音響解析では特に大量のファイル数だったり、一つのファイルが大きい場合があり、その場合に有効です。
複数ファイルがあり、その中からファイルを探すのが大変だったり、 ファイル本数が増えると管理が大変になったりします。 一つのファイルであればget_hogehogeなどのプログラムを用意しておけば、コマンドを入力するだけでそのデータを取得することができます。
HDF5は名前の通り階層化されたファイル形式です。
すべてのHDF5ファイルは、他のグループを含むことができ、他のファイル内のオブジェクトにリンクすることができるルートグループを含んでいます。
例えば、以下のようなイメージです。

次は、実際にインストールするところを説明したいと思います。
インストールなど
HDF5を実際に使うためにライブラリなどのインストールの方法を説明します。
作業環境は、LLVM version 8.1.0 (clang-802.0.42)で実施しています。
まずは、以下のサイトからHDF5のソースコードをダウンロードしてきます。
https://www.hdfgroup.org/downloads/hdf5/source-code/#src
最新版のhdf5-1.12.1(2022.4.20時点)です。 ダウンロードしましたら、解凍します。今回はtar.bz2版をダウンロードしましたので、以下のコマンドで解凍します。 今回は、homeディレクトリ直下で作業します。
$ pwd
/home/user/
$ tar jxvf hdf5-1.12.1.tar.bz2
今回は、configureコマンドでインストールをします。 まずはインストールするディレクトリを作成します。(もしルート権限を持っているようでしたら、この作業は必要ありません。) また、ダウンロードしたソースコードのディレクトリに移動します。
$ mkdir hdf5-1.12.1_build
$ cd hdf5-1.12.1
ここで、configureコマンドを実行します。ここでは、インストールディレクトリは様々なオプションを入力することができます。 使えるオプションを表示する場合は以下のコマンドで表示できます。
$ ./configure --help
最後の節で、parallel版も使いたいので、以下のオプションでインストールします。
$ ./configure --prefix=/home/user/Work/hdf5-1.12.1_build/ --enable-fortran --enable-build-mode=production --build=x86_64 CC=mpicc CXX=mpicxx F9X=mpif90 --enable-parallel
次のコマンドで、ソースコードをコンパイルします。
$ make
最後に以下のコマンドで、インストールします。
$ make install
次節では、インストールしたものを使いプログラム例などを説明したいと思います。
使い方
HDF5を実際に使うためのソースの説明と動かし方を説明します。
インストール時にexampleファイルもインストールディレクトリにあります。
/home/user/Work/HDF5/hdf5-1.12.1-build/share/hdf5_examples/
今回は、fortranのexampleですが、cも関数名が少し変わるだけで、ほとんど同じです。 hdf5_examplesのhyperslab.f90を説明していきます。 このexampleは出力と入力があるので、初めて取り掛かる場合は、非常に参考になります。
-
20行目の"USE HDF5"は、c言語のインクルードみたいなもの(正確に言うと異なりますが。)で、HDF5を使う場合は必ず必要になります。
-
77行目の"call h5open_f(error)“で、HDF5を初期化します。
-
82行目の"call h5create_f(…)“ではファイル名を指定し、openします。
-
87行目の"call h5screate_simple_f(…)“配列の大きさ分をdataspaceに確保します。
-
92行目の"call h5dcreate_f(…)“fileとdataspaceをリンクさせます。
-
100行目の"call h5dwrite_f(…)“実際にファイルに書き出します。
-
105行目の"call h5sclose_f(…)“dataspaceを閉じます。
-
110行目の"call h5dclose_f(…)“datasetを閉じます。
-
115行目の"call h5fclose_f(…)“fileを閉じます。
dataspace⇔dataset⇔fileのリンク付けが必要です。
これで出力部は終了です。次は入力部です。
openなどは同じなので、入力部分のみ記述します。
- 173行目の"H5dread_f(…)“この部分で、実際にファイルのデータを入力しています。
h5の後に続く、“d”,“s"はdataset,dataspaceの略です。この辺りのsubroutineの説明は以下のサイトに記述されています。
https://portal.hdfgroup.org/display/HDF5/The+HDF5+API
subroutineの最後の”_f"はfortranの"f"です。c言語の場合は必要ありません。
コンパイル方法と実行方法は以下の通りです。
実行すると、sdsf.h5というファイルが作成されます。 このファイルをhyperslab.f90で出力し、入力しています。
$ h5pfc hyperslab.f90 -o hyperslab.out
$ ./hyperslab.out
次は、並列環境でのプログラム例などを説明したいと思います。
Parallel HDF5
最後に、Parallel HDF5を簡単ですが、説明したいと思います。
以下のサイトにParallel HDF5のチュートリアルがあります。
https://portal.hdfgroup.org/display/HDF5/Parallel+HDF5
h5f, h5sやh5dは前回と同じなので、今回はh5pを説明します。 h5pのpはparallelです(予想通りかと思いますが。)。
-
46~48行目はまずはおきまりのMPIの初期化などです。 このプログラムでは4並列の場合のみです。
-
85行目までは、fileとdatasetとdataspaceのリンク付けです。 またplist_idという変数を使って、各プロセスとdataspaceをリンクさせています。
-
その後の86~111行目で、各プロセスが一つのファイルのどの部分に出力するかを 指定しています。あとは書き込むだけです。
-
最後にMPIを終了させます
(最後は説明が雑になってしまいましたが。。。)。
コンパイル方法と実行方法は以下の通りです。
$ h5pfc hyperslab_by_chunk.f90 -o hyperslab_by_chunk.out
$ mpirun -n 4 ./hyperslab_by_chunk.out
最後にそのほかの参考資料の紹介です。
チュートリアルが以下のサイトにあります。
https://portal.hdfgroup.org/display/HDF5/Introduction+to+Parallel+HDF5
最近知ったのですが。。。
lusterファイルシステムの場合はデフォルトではflockが許可されておらず、 intel mpiを使う場合には実行時オプションが必要など色々とあるようです。
もし興味があればお問い合わせいただけると、嬉しいです。 (知っている範囲であればお答えできると思います。)
最後まで、読んでいただき、どうもありがとうございました。