Raspberry Pi3でスパコン遊び その4

前回まではパッケージでインストールしたMPICHライブラリとATLASライブラリを使用してHPLベンチマークテストを実施していた。
CPUのオーバークロックやOS側の設定変更等により叩き出せた結果は1.76GFLOPSがやっとで、Efficiencyはたった6%。
これらのライブラリを実行環境に合わせた形にビルドしインストールすれば、より高い成績を上げられるかもしれないと考え、今回はソースからビルドしてインストールしてみた。
下記は全てRaspberry Pi3にて実行した。


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}"

一旦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)


2.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


3.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号機と同じであれば、インストールは完了だ。

4.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)