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 については自分でビルドしたものではないので、その性能を出しきれてないというのはあると思います。

f:id:machakann:20180916203850j:plainf:id:machakann:20180921222253p:plain
The Computing Time of Alanine Single Point Energy

Caffeine の Single Point Energy - MP2/6-311G(d)

インプットファイルはこちら

同じく、三回ずつ計算を走らせて、その中の最も良かった TOTAL WALL CLOCK TIME を比較しました。こちらでも mkl が最も速かったのですが、差はそんなにないようです。

f:id:machakann:20180916203855j:plainf:id:machakann:20180921222256p:plain
The Computing Time of Caffeine Single Point Energy

Coumarin の Single Point Energy - B3LYP/6-311G(d)

インプットファイルはこちら

DFT 計算にはあまり BLAS を使わないのか、ほとんど差は出ませんでした。

f:id:machakann:20180916203859j:plainf:id:machakann:20180921222257p:plain
The Computing Time of Coumarin Single Point Energy

まとめ

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

処理時間が以下のようにかなり変わります。

f:id:machakann:20180921222300p:plain
Alanine Single Point Energy CCSD(T)/6-311G (including OpenBLAS variations)

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 と実行