BLAS ライブラリの違いによる GAMESS のパフォーマンス比較
GAMESS に BLAS ライブラリとして mkl, OpenBLAS, ATLAS をリンクした場合のパフォーマンスを比較しました。
参考 :
GAMESS をビルドする mkl 編
GAMESS をビルドする OpenBLAS 編
ATLAS もビルドしようとしてみたんですけど CPU throttling の停止ができなくて諦めました…。代わりに apt でインストールしたものを使っていますが、環境に最適化されたものでないことは留意してください。
sudo apt-get install libatlas-base-dev
CC や MP2 の計算で BLAS の差が出るときいたので、そのへんを試してみました。正直こういう計算はやったことがなく、マニュアルとかを読みながらやっていますが、妥当なインプットファイルを作れているか自信はないです。
環境
CPU: Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
MEMORY: 16 GB
OS : Ubuntu 18.04 64bit
gcc : version 7.3.0
GAMESS : Feb 14, 2018 R1 Public Release
BLAS : mkl (intel-mkl-2018.3-051), OpenBlas v0.3.3, ATLAS (libatlas-base-dev_3.10.3-5_amd64)
Alanine の Single Point Energy - CCSD(T)/6-311G
インプットファイルはこちら
三回ずつ計算を走らせて、その中の最も良かった TOTAL WALL CLOCK TIME を比較しました。単位は秒です。結果は mkl が最も速かったものの、OpenBLAS がかなり善戦しているという結果でした。ATLAS については自分でビルドしたものではないので、その性能を出しきれてないというのはあると思います。
Caffeine の Single Point Energy - MP2/6-311G(d)
インプットファイルはこちら
同じく、三回ずつ計算を走らせて、その中の最も良かった TOTAL WALL CLOCK TIME を比較しました。こちらでも mkl が最も速かったのですが、差はそんなにないようです。
Coumarin の Single Point Energy - B3LYP/6-311G(d)
インプットファイルはこちら
DFT 計算にはあまり BLAS を使わないのか、ほとんど差は出ませんでした。
まとめ
mkl すごい。でも OpenBLAS が思った以上にいい勝負だった。
もしかすると、Single Point Energy 計算は題目として適切ではなかったかも。
おまけ : OpenBLAS を使う場合の注意
理由はよくわからないのですけど OpenBLAS がスレッドを分けると逆に遅くなるみたいです。なので、OpenBLAS を使う場合はスレッディングを無効にしたほうがよさそうです。
スレッディングを無効にビルドしたものをリンクした場合 (
make USE_THREAD=0
) は特に何もする必要はないです。スレッディングが有効な OpenBLAS (
make
,make USE_THREAD=1
) を使う場合には環境変数OPENBLAS_NUM_THREADS
でシングルスレッドで動作するようにすると大丈夫です。デフォルトで有効になっているのでこの場合が多いかもしれません。
export OPENBLAS_NUM_THREADS=1
- OpenMP によるスレッディングが有効な OpenBLAS (
make USE_OPENMP=1
) を使う場合には環境変数OMP_NUM_THREADS
でシングルスレッドで動作するようにすると大丈夫です。
export OMP_NUM_THREADS=1
処理時間が以下のようにかなり変わります。
OpenBLAS:
OpenBLAS を make USE_THREAD=0
でビルド
GAMESS を /opt/gamess/rungms 00 4 alanine.inp
と実行
OpenBLAS 1thread:
OpenBLAS を make USE_THREAD=1
でビルド
GAMESS を OPENBLAS_NUM_THREADS=1 /opt/gamess/rungms 00 4 alanine.inp
と実行
OpenBLAS 4thread:
OpenBLAS を make USE_THREAD=1
でビルド
GAMESS を OPENBLAS_NUM_THREADS=4 /opt/gamess/rungms 00 4 alanine.inp
と実行
OpenBLAS 1thread openmp:
OpenBLAS を make USE_OPENMP=1
でビルド
GAMESS を OMP_NUM_THREADS=1 /opt/gamess/rungms 00 4 alanine.inp
と実行
OpenBLAS 4thread openmp:
OpenBLAS を make USE_OPENMP=1
でビルド
GAMESS を OMP_NUM_THREADS=4 /opt/gamess/rungms 00 4 alanine.inp
と実行