opi-clst HPLでベンチマーク OpenBLAS導入編

 2016-11-27
OpenBLASとはBLASの実装の一つ。他にATLAS等があるが、OpenBLASのほうが高速らしいです。
 

忙しい人のための結論

  • OpenBLASを使用することにより4コア動作を実現できた。
  • OpenBLASは4コア動作、1コア動作どちらもATLASよりもスコアが良い。
  • ATLAS版1コアで4.050GFLOPSだったパラメータを用いると、OpenBLAS版4コアでは13.58GFLOPSとなった。
  • OpenBLAS版1コアでは6.491GFLOPSとなった。



参考文献

numpy・scipyでマルチスレッドBLAS・LAPACKを使う
http://qiita.com/_akisato/items/d5de60e38b5a69387bde




setup OpenBLAS

  • OpenBLASの最新版をダウンロードする(今回はv0.2.19だった)
  • ファイルを展開
  • Makefile.ruleを編集する
    • 自分でビルドしたlibだと分かりやすいように my というプレフィックスをつける
    • マルチスレッド動作を明示的に指定
  • make
  • /opt/OpenBLASにinstallする

[MASTER]% cd /usr/local/src
[MASTER]% sudo wget http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz

[MASTER]% sudo mv v0.2.19.tar.gz "OpenBLAS-0.2.19.tar.gz"
[MASTER]% sudo tar xzvf ./OpenBLAS-0.2.19.tar.gz

[MASTER]% sudo chown -R pi:pi ./OpenBLAS-0.2.19
[MASTER]% cd OpenBLAS-0.2.19
[MASTER]% cp Makefile.rule Makefile.rule_org
[MASTER]% nano Makefile.rule

[MASTER]% diff Makefile.rule Makefile.rule_org
12d11
< LIBNAMESUFFIX = my
53d52
< USE_THREAD=1
58d56
< USE_OPENMP=1
64d61
< NUM_THREADS=4

[MASTER]% make

[MASTER]% sudo make PREFIX=/opt/OpenBLAS install

OpenBLASはapt-getでもinstallできるが、今回はCBLASもビルドするので、ついでにビルド。
折角なのでマルチスレッド動作を明示的に指定してmakeした。



setup CBLAS

CBLASはBLASのC言語用ライブラリであり、ATLASやOpenBLASを利用可能です。今回はOpenBLASを使います。
  • www.netlib.orgからCBLASをダウンロード
  • ファイルを展開
  • Makefileを編集
    • BLASのライブラリのpathを指定
    • マルチスレッド版なのでpthreadをロードするオプションを追加
    • gccにfPICオプションを追加
  • make
  • 出来上がったライブラリを/opt/OpenBLAS/libにコピー

[MASTER]% cd /usr/local/src
[MASTER]% sudo wget http://www.netlib.org/blas/blast-forum/cblas.tgz
[MASTER]% sudo tar xzvf ./cblas.tgz
[MASTER]% sudo chown -R pi:pi CBLAS
[MASTER]% cd CBLAS
[MASTER]% cp Makefile.in Makefile.in_org
[MASTER]% nano Makefile.in

[MASTER]% diff Makefile.in Makefile.in_org
25c25
< BLLIB = /opt/OpenBLAS/lib/libopenblas_my.a
---
> BLLIB = /Users/julie/Documents/Boulot/lapack-dev/lapack/trunk/blas_LINUX.a
34c34
< LOADER = $(FC) -lpthread
---
> LOADER = $(FC)
40,41c40,41
< CFLAGS = -O3 -fPIC -DADD_
< FFLAGS = -O3 -fPIC
---
> CFLAGS = -O3 -DADD_
> FFLAGS = -O3

[MASTER]% make -j 4

[MASTER]% sudo cp lib/cblas_LINUX.a /opt/OpenBLAS/lib




setup HPL

HPLはデフォルトでは /usr/lib/libcblas.a を参照する。これは(raspbianやarmbianでは)ATLAS-baseのパッケージ由来のものであり、ATLASを参照している。
OpenBLAS版のCBLASを参照するようにMakefileを書き換えてビルドする。
  • (HPLは既に一度ビルド済みとする)
  • Makefileを編集する
    • OpenBLAS, OpenBLAS版CBLASのpathを指定
    • pthreadをロードするオプションを追加
    • openmpをロードするオプションを追加
  • make

[MASTER]% cd /mnt/USB01/tmp/hpl/hpl-2.2/
[MASTER]% nano Make.Linux_ARM_CBLAS

[MASTER]% diff Make.Linux_ARM_CBLAS Make.Linux_ARM_CBLAS_normal
95c95
< LAdir = /opt/OpenBLAS/lib
---
> LAdir = /usr/lib
97c97
< LAlib = $(LAdir)/cblas_LINUX.a $(LAdir)/libopenblas_my.a
---
> LAlib = $(LAdir)/libcblas.a $(LAdir)/libatlas.a
171c171
< CCFLAGS = $(HPL_DEFS) -fomit-frame-pointer -O3 -funroll-loops -W -Wall -fopenmp -lpthread
---
> CCFLAGS = $(HPL_DEFS) -fomit-frame-pointer -O3 -funroll-loops -W -Wall

[MASTER]% make arch=Linux_ARM_CBLAS clean
[MASTER]% make arch=Linux_ARM_CBLAS




clst-NODEでのsetup

ここまでのレシピはMASTERノードのものだったが、計算ノードでも同じでオーケーである。
ただし全ての計算ノードで繰り返す必要は無く、ハードウェアが完全に同じなので計算ノード間でバイナリは使いまわしできます!
[clst01]% for HOGE in `seq -w 14 -1 2`
do
rsync -auv /mnt/USB01/tmp/hpl clst${HOGE}:/mnt/USB01/tmp/
done

[clst01]% for HOGE in `seq -w 14 -1 2`
do
ssh clst${HOGE} sudo chmod o+w /usr/local/src
rsync -auvz /usr/local/src/ clst${HOGE}:/usr/local/src/
ssh clst${HOGE} sudo chmod o-w /usr/local/src
ssh clst${HOGE} cd /usr/local/src/OpenBLAS-0.2.19 \; sudo make PREFIX=/opt/OpenBLAS install
ssh clst${HOGE} cd /usr/local/src/CBLAS \; sudo cp lib/cblas_LINUX.a /opt/OpenBLAS/lib
done




HPL(OpenBLAS版) 動作確認

HPL(ATLAS版)の動作確認に使用したパラメータを用いてまずは動かしてみる。

この時、OpenBLASで使用するコアの数(スレッド数)を環境変数にて指定しておくと良い。(指定しない場合は自動判断になるハズ?)
mpichでは、MASTER側で設定した環境変数は特に何もしなくても計算ノード側に伝わります。mpich以外はよくわからんですけど、オプション指定で環境変数を引き渡す方法があるはずです。
環境変数は OPENBLAS_NUM_THREADS を設定すれば充分なのですが、優先度違いの同じような変数が他にもあるので、念のため全部指定してます。↓
[MASTER]% export OPENBLAS_NUM_THREADS=4
[MASTER]% export GOTO_NUM_THREADS=4
[MASTER]% export OMP_NUM_THREADS=4
[MASTER]% export OPENBLAS_MAIN_FREE=1
[MASTER]% mpiexec.mpich -f hostlist_IP -np 14 /mnt/USB01/tmp/hpl/hpl-2.2/bin/Linux_ARM_CBLAS/xhpl
================================================================================
HPLinpack 2.2 -- High-Performance Linpack benchmark -- February 24, 2016
Written by A. Petitet and R. Clint Whaley, Innovative Computing Laboratory, UTK
Modified by Piotr Luszczek, Innovative Computing Laboratory, UTK
Modified by Julien Langou, University of Colorado Denver
================================================================================

An explanation of the input/output parameters follows:
T/V : Wall time / encoded variant.
N : The order of the coefficient matrix A.
NB : The partitioning blocking factor.
P : The number of process rows.
Q : The number of process columns.
Time : Time in seconds to solve the linear system.
Gflops : Rate of execution for solving the linear system.

The following parameter values will be used:

N : 25600
NB : 96
PMAP : Row-major process mapping
P : 2
Q : 7
PFACT : Right
NBMIN : 4
NDIV : 2
RFACT : Crout
BCAST : 1ringM
DEPTH : 1
SWAP : Mix (threshold = 64)
L1 : transposed form
U : transposed form
EQUIL : yes
ALIGN : 8 double precision words

--------------------------------------------------------------------------------

- The matrix A is randomly generated for each test.
- The following scaled residual check will be computed:
||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )
- The relative machine precision (eps) is taken to be 1.110223e-16
- Computational tests pass if scaled residuals are less than 16.0

================================================================================
T/V N NB P Q Time Gflops
--------------------------------------------------------------------------------
WR11C2R4 25600 96 2 7 823.46 1.358e+01
HPL_pdgesv() start time *** *** ** 10:33:31 2016

HPL_pdgesv() end time *** *** ** 10:47:14 2016

--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV-
Max aggregated wall time rfact . . . : 10.60
+ Max aggregated wall time pfact . . : 8.43
+ Max aggregated wall time mxswp . . : 7.50
Max aggregated wall time update . . : 810.41
+ Max aggregated wall time laswp . . : 164.99
Max aggregated wall time up tr sv . : 0.45
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)= 0.0008070 ...... PASSED
================================================================================

Finished 1 tests with the following results:
1 tests completed and passed residual checks,
0 tests completed and failed residual checks,
0 tests skipped because of illegal input values.
--------------------------------------------------------------------------------

End of Tests.
================================================================================
13.58GFLOPSとなりました!
さっそく10GFLOPS超えてきましたね。さすがです!
ここからパラメータチューニングでもうちょっとは上がるかな?

cactiのグラフを確認してみても、ちゃんとロードアベレージは1を超え、3手前くらいまで上がっているので、ちゃんと複数コアを使っている事が確認できます。
ロードアベレージを4程度まで上げても大きなペナルティにはならないはずなので、パラメータで調整してみたいですね。
opnblas-4core-la.png


ちなみに・・mpichでの環境変数の引き渡し

ためしに適当な環境変数を与えてみるとちゃんと受け渡しが行われていることが確認できます。
[MASTER]% export HOGE=FUGA
[MASTER]% mpirun -host 192.168.111.111 -np 1 env
...snip...
HOGE=FUGA
...snip...




1コア同士で ATLAS vs OpenBLAS

環境変数で1コア動作を指定してみた場合の動作を確認すると共に、ATLAS版でのスコアと比較してみよう。
[MASTER]% export OPENBLAS_NUM_THREADS=1
[MASTER]% export GOTO_NUM_THREADS=1
[MASTER]% export OMP_NUM_THREADS=1
[MASTER]% export OPENBLAS_MAIN_FREE=1
[MASTER]% mpiexec.mpich -f hostlist_IP -np 14 /mnt/USB01/tmp/hpl/hpl-2.2/bin/Linux_ARM_CBLAS/xhpl
...snip...
================================================================================
T/V N NB P Q Time Gflops
--------------------------------------------------------------------------------
WR11C2R4 25600 96 2 7 1723.33 6.491e+00
...snip...
OpenBLASの1コア動作では6.491GFLOPSという結果になった。

ロードアベレージのグラフでも1コア動作であろうことがうかがい知れる。
opnblas-1core-la.png

ATLAS版HPLで4.050GFLOPSでしたが、OpenBLAS版HPLでは6.491GFLOPSになりました。
同じ1コアでの計算でも、OpenBLASはATLASの1.6倍速いということでしょうか。すごい。  



OpenBLAS版HPLでパラメタ調整するともうすこしだけスコア上がる・・・かな? 現在試行中!!
 
 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/275-688a98fa
≪ トップページへこのページの先頭へ  ≫