前回まではパッケージでインストールしたMPICHライブラリとATLASライブラリを使用してHPLベンチマークテストを実施していた。
CPUのオーバークロックやOS側の設定変更等により叩き出せた結果は1.76GFLOPSがやっとで、Efficiencyはたった6%。
これらのライブラリを実行環境に合わせた形にビルドしインストールすれば、より高い成績を上げられるかもしれないと考え、今回はソースからビルドしてインストールしてみた。
下記は全てRaspberry Pi3にて実行した。
MPICHの導入
1.MPICHのインストール
ノード間のデータ通信をサポートするMPI(Message Passing Interface)ライブラリの、幾つかある実装のうちの1つ。
分散メモリ環境にて並列計算を実現し演算の高速化を図る。
MPICHや後でインストールするATLASとHPL導入の前に、前もって必要なツールやライブラリをインストールしておく。
自分の環境では既にインストール済み。
sudo apt-get install gcc gfortran libc6-dev
HPL用トップディレクトリを作成。各ライブラリやビルド用の一時ディレクトリ等はhpl-2.1ディレクトリ以下に保存される。
mkdir hpl-2.1 cd hpl-2.1
wgetコマンドでMPICHのtar玉を落としておく。
wget http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz
tarコマンドで解凍後、インストール先のディレクトリを作成。解凍時に作成された作業用ディレクトリに移動。
tar zxvf mpich-3.0.4.tar.gz mkdir mpich cd mpich-3.0.4
configureスクリプトを走らせる。自分の環境では--enable-sharedオプションを付けないと正常終了しなかった。
configure終了の後は、makeコマンドでビルドしmake installコマンドでインストール
./configure --prefix=/home/pi/hpl-2.1/mpich --with-arch=armv8 --with-fpu=vfp --enable-shared make make install
インストール後、viで.bashrcを開き以下を追加
export MPIROOT="/home/pi/hpl-2.1/mpich" export PATH="${MPIROOT}/bin:${PATH}" export MPIBIN="${MPIROOT}/bin:${MPIBIN}" export MANPATH="${MPIROOT}/share/man:${MANPATH}" export LD_LIBRARY_PATH="${MPIROOT}/lib:${LD_LIBRARY_PATH}"
2.MPICHインストール後の確認
一旦exitし再度ログイン。その後mpicc -vコマンドを実行し、自分の環境が正常に認識されてる事を確認。
インストールが正常に終了すると、以下が出力される。
アーキテクチャがARMv6として認識されてるのはご愛嬌。
mpicc -v mpicc for MPICH version 3.0.4 Using built-in specs. COLLECT_GCC=cc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.9/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Raspbian 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf Thread model: posix gcc version 4.9.2 (Raspbian 4.9.2-10)
ATLASの導入
1.ATLASのインストール
BLASという、行列やベクトルに関する基本演算ライブラリの幾つかある実装のうちの1つ。
ATLAS自体は、ARMをサポートしている以下のバージョンを使用する。
必須ではないが、configureスクリプトにてlapackのtgzファイルを指定する場合は前もってwgetコマンドで落としておく。
wget http://jaist.dl.sourceforge.net/project/math-atlas/Stable/3.10.3/atlas3.10.3.tar.bz2 wget http://www.netlib.org/lapack/lapack-3.4.2.tgz
atlasのtar玉の解凍とインストール先ディレクトリの作成。
tar jxvf atlas3.10.3.tar.bz2 cd ATLAS mkdir ATLAS_ARM cd ATLAS_ARM
configureスクリプトを走らせる。
1号機にのみインストールし他の機器にはrsyncコマンドでディレクトリごとコピーする為、インストール先をhomeディレクトリ以下に指定した。
../configure --cripple-atlas-performance --prefix=/home/pi/hpl-2.1/lib --with-netlib-lapack-tarfile=/home/pi/hpl-2.1/lapack-3.4.2.tgz
configureスクリプトの完了後、makeコマンドを実行。
せっかくコアが4個あるので-j4オプションを付けてmakeを実行したかったのだが、"gccの-Vオプションなんて知らないよ"といった意味のエラーを吐いて途中で止まる為、コア1個で実施。
完了までに約14時間要した。
ビルド中にベンチマークテストのような事を値を少しづつ変えながら何度も実行し、インストール先の環境に合うよう調整している為であるが、今時のPCで実行していたら3分の1以下の時間で済むだろう。
make CC=gcc make check make ptcheck make time make install
HPLの導入
HPLのインストール
HPL(High Performance LINPACK)は、Linpackベンチマークの幾つかある実装のうちの1つ。
密行列を係数とする連立一次方程式を解く速度を測定する。
インストール方法は、前回と同じ内容。
tar玉を解凍後、sh make_genericスクリプトを走らせてMakeファイルを作成。
wget http://www.netlib.org/benchmark/hpl/hpl-2.1.tar.gz tar xf hpl-2.1.tar.gz cd hpl-2.1/setup sh make_generic cd .. cp setup/Make.UNKNOWN Make.rpi
上記にて作成したMake.rpiファイルを開き、以下のとおりに修正した。
ARCH = rpi TOPdir = $(HOME)/hpl-2.1 MPdir = /home/pi/hpl-2.1/mpich MPinc = -I $(MPdir)/include MPlib = $(MPdir)/lib/libmpich.a LAdir = /home/pi/hpl-2.1/ATLAS/ATLAS_ARM/lib LAinc = /home/pi/hpl-2.1/ATLAS/ATLAS_ARM/include LAlib = $(LAdir)/libf77blas.a $(LAdir)/libatlas.a
make arch=rpiでビルドしmake installでインストール。
上のMPICHやATLAS程時間はかからない。
make arch=rpi make install
ディレクトリ~/hpl-2.1/bin/rpi内にあるHPL.datを1台構成用に修正する。
修正前に、元からあったHPL.datはファイル名を変更して保存する。
rsyncコマンドでhpl-2.1ディレクトリ以下を他ノードにコピーする。
rsync -ah -e ssh ~/hpl-2.1 pi@192.168.1.12:~/ rsync -ah -e ssh ~/hpl-2.1 pi@192.168.1.13:~/ rsync -ah -e ssh ~/hpl-2.1 pi@192.168.1.14:~/ rsync -ah -e ssh ~/hpl-2.1 pi@192.168.1.15:~/ rsync -ah -e ssh ~/hpl-2.1 pi@192.168.1.16:~/
各ノードにログインし、hpl-2.1ディレクトリ以下の構成やファイルが1号機と同じであれば、インストールは完了だ。
HPLベンチマークテストの実施
CPUのクロック数を1300MHzに固定設定し、再起動。
HPL.datファイルの以下のオプションを修正。
N: 5000 NB: 144 P: 2 Q: 3
この値でベンチマークテストを実施すると...
(CPU Clock: 1300MHz)
結果: 22.86秒 3,647MFLOPS (3.647GFLOPS)
何と、いきなり前回(8/27 1355MHz 1.756GFLOPS)の記録をあっさりと更新。目標としていたCRAY-2の1.9GFLOPSを軽く超えてしまった。
N値を10000に変更し、ベンチマークテストを実施。
(CPU Clock: 1300MHz)
結果: 128.01秒 5,209MFLOPS (5.209GFLOPS)
N値を15000に変更し、ベンチマークテストを実施。
(CPU Clock: 1300MHz)
結果: 375.89秒 5,987MFLOPS (5.987GFLOPS)
N値を20000に変更し、ベンチマークテストを実施。
(CPU Clock: 1300MHz)
結果: 789.39秒 6,757MFLOPS (6.757GFLOPS)
N値を25600に変更し、ベンチマークテストを実施。
(CPU Clock: 1300MHz)
結果: 1555.93秒 7,189MFLOPS (7.189GFLOPS)
N値を25000に、NB値を160に変更し、ベンチマークテストを実施。
(CPU Clock: 1300MHz)
結果: 1425.70秒 7,307MFLOPS (7.307GFLOPS)
この時点で、Raspberry Pi3 6台クラスタ構成時の理論ピーク演算性能が28.8GFLOPSに対し、ベンチマークテストの結果(実効ピーク演算性能)は7.31GFLOPSだった。
Efficiencyは0.25。前回の0.06(6%)から大幅に向上したが、まだまだ25%しか出し切れてない。
もう2台追加すれば楽に10GFLOPSを超えられるだろう。
しかしここではツールやOSのチューニングで高成績を叩き出したい。
関連する記事
http://d.hatena.ne.jp/debslink/20160724/1469358050 Raspberry Pi3でスパコン遊び その1
http://d.hatena.ne.jp/debslink/20160801/1469980976 Raspberry Pi3でスパコン遊び その2
http://d.hatena.ne.jp/debslink/20160827/1472285472 Raspberry Pi3でスパコン遊び その3