カーネルベンチマークコードの開発について
EigenExaについて
EigenExaベンチマークコードについて
ベンチマーク結果に基づく性能推定について
2/24/2014 理化学研究所 三上和徳
カーネルベンチマークコード
• 開発の目的
– エクサスケール規模のシミュレーションの核となる数値計算アルゴリズム
の中で、特に重要なものについて、数値計算ライブラリ等を用いてそのコ
ストを推定するためにカーネルベンチマークを作成し、評価に使用する。
• 対象計算アルゴリズム
– 固有値計算(実数密行列、標準固有値計算)
– 3次元FFT
– 乱数生成器
• 公開計画
– 表
カーネル ベンチマークコード 固有値計算(実対称密・標準) 公開中 3次元FFT 4月公開見込み 乱数生成 3月公開見込み固有値計算
• 実数対称密行列の標準固有値計算
•
AICSで開発中のEigenExaをもとにベンチマークコードを作成
(公開版version 2.1a)
•
h;p://www.aics.riken.jp/labs/lpnctrt/EigenExa.html
•
10種類のテスト行列(+利用者指定固有値)
• プロセスグループ形状の指定
• 固有値のみ、固有値+固有ベクトル、など(ただし全モード
計算)
3D-FFT
•
FFTW向けに紹介されている代表的な3DFFTの測定コードを
もとに、各種
FFT実装や分割方法による性能を推定する。
•
AICSで開発中のKMATH_FFTからベンチマークを作成中(3
月末完成)。
•
3D-‐FFTの主要なライブラリ、FFTE, FFTWをカーネルとして開
発中
•
3次元空間の1軸、2軸、3軸分割の選択
乱数生成器
• メルセンヌツイスター乱数生成器を利用した乱数生成部分
の性能評価ベンチマークコード
•
MPIのグループでできるだけ重複のない乱数列を管理し、
内部状態管理の
I/O処理も含む
•
AICSで開発中のKMATH_RANDOMのベンチマークコードを
現在改良し、カーネルベンチ提供用に調整中
EigenExaについて
• 理化学研究所ホームページ
2013年12月5日
60
秒でわかるプレスリリース
」より
• 「京」を使い世界最高速の固有値計算に成功
• 行列の固有値計算では行列を簡単な形式(形状)に変換し、それを中間形式と
して取り扱います。理研の研究チームは、帯行列(ゼロでない要素が対角線上
に帯状に分布する行列)を中間形式に採用することによって、前処理の時間の
削減を図った新しい計算アルゴリズムを考案し、それを基にした数学ソフト
「
EigenExa(アイゲンエクサ)」を開発しました。「京」の全プロセッサを用いて計算
した結果、世界最大規模の
100万×100万の行列の固有値計算が1時間以内で
可能なこと確認しました。これまでの地球シミュレーターの記録(
40万×40万の
行列で
3時間半)を大幅に上回りました。「京」の高い計算能力とEigenExaの利
用により、数十万から
100万程度の固有値を求める問題は1時間以内にできる
ことが立証されました。今後、シミュレーションの規模を大幅に拡大することが可
能になります。なお、
EigenExaはオープンソフトウエアとして公開され、理研計算
科学研究機構研究部門のホームページからダウンロードできます。
固有値計算 - 密行列解法の位置づけ
固有値計算
疎行列解法
・超大規模問題
・少数固有モード
・特定区間モード
・最小・最大モード
密行列解法
・全固有値
・全固有対
・全体の数分の1のモード
• 行列の全要素(NxN)をゼロと考えずに扱う
• 直接的解法
• メモリ使用量O(N^2),演算量O(N^3)
• ゼロ要素を落とし,大規模問題での使用メモリ量・演算量を削減
• 反復法が基本
• 疎行列ベクトル積(spMV)が性能を左右
疎行列解法の内部解法に
密行列解法を使用
高性能・高品質な密行列向けソルバの必要性
EigenExa - 世界の競争相手
Eigen-‐Exa
• 新1stepスキーム採用 • 京において2^16コアまでの動作確認・通信コストの認識 • 動作&通信モデル構築 • 階層化アルゴリズム、自動チューニングの取り込み • GPU版も準備へELPA
• 1step vs 2stepの議論:1stepが高速の場合が多い • 三重対角 ⇒ 帯の変換部分は未だよい実装できず ・・・実装レベルでは困難か? • B/Qでアセンブラチューニングの方向&GPU化へScaLAPACK ver 2.0.2
• 枠組みに大きな変化なし • MPIがBLACSの標準に • ルーチンの強化: ü 非対称行列ソルバー(PDHSEQR) ü 新ルーチンMRRR(PDSYEVR)DPLASMA
• PLASMA, MAGMAでの2stepスキーム • 1nodeはスケーラブルに動作 • DAGタスクスケジューリングScaLAPACK/DPLASMA
• テネシー大学
ICL h;p://icl.cs.utk.edu/dplasma/index.html
•
ScaLAPACK : Scalable Linear Algebra PACKage
–
a library of high-‐performance linear algebra rou^nes for parallel distributed
memory machines. ScaLAPACK solves dense and banded linear systems, least
squares, eigenvalue, and singular value problems. The key ideas includes
•
a block cyclic data distribu^on for dense matrices and a block data
distribu^on for banded matrices
•
block-‐par^^oned algorithms to ensure high levels of data reuse
•
well-‐designed low-‐level modular components
•
DPLASMA : Distributed Parallel Linear Algebra So`ware for Mul^core Arch.
–
DPLASMA is the leading implementa^on of a dense linear algebra package for
distributed heterogeneous systems. It is designed to deliver sustained
performance for distributed systems where each node featuring mul^ple
sockets of mul^core processors, and if available, accelerators like GPUs or
Intel Xeon Phi. DPLASMA achieves this objec^ve through the state of the art
PaRSEC run^me, por^ng the Parallel Linear Algebra So`ware for Mul^core
Architectures (PLASMA) algorithms to the distributed memory realm.
ELPA
• マックス・プランク研究所
h;p://elpa-‐lib.di-‐berlin.mpg.de/wiki
•
ELPA : Eigenvalue soLvers for Petaflop Applica^ons Library
– ELPA is a Fortran-‐based high-‐performance computa^onal library for the (massively) parallel solu^on of symmetric or Hermi^an, standard or generalized eigenvalue problems.
– Once compiled, ELPA library rou^nes can be linked to from C, C++, Fortran etc. code alike.
•
ELPA works as a "drop-‐in enhancement" for Scalapack-‐based infrastructures
(arguably the de facto standard for high-‐performance parallel linear algebra).
Thus, ELPA is not independent of this infrastructure, but rather builds on it.
Necessary prerequisite libraries for ELPA (o`en already provided by HPC
vendors) include:
– Basic linear algebra subrou^nes (BLAS) – Lapack
– Basic linear algebra communica^on subrou^nes (BLACS) – Scalapack
EigenExa - 国際競争力のある新規計算スキームの採用
dense
band
tridiagonal
eigenpairs
eigenpairs
eigenpairs
ScaLAPACK
1step Scheme
ELPA
DPLASMA
2step Scheme
(
Byte/Flop
が低い)
Eigen-‐Exa
新
1step Scheme
高性能実装が困難 全固有ベクトルを求める 場合は1stepと大差ない という報告多数
状況によっては逆変換(三重対角 ⇒ 帯)の高性
能実装も視野にいれつつ,良好なものを選択
固有値の計算パターン
•
Ax = λx
• 行列のサイズが大きい場合
– 方針:Aの固有値は相似変換A -‐> P
-‐1APをしても不変。簡単なP(回転行列
など)で変換を多数回行い対角行列に収束させる
– より簡単な行列形式に中継的に変換して計算時間の短縮をはかる
•
(1)係数行列をより帯域の狭い中間行列に変換して
•
(2)中間行列の固有値を求め
•
(3)本来の係数行列の固有ベクトルを求め直す
–
(1)の中間行列のパターン毎に手法がある
•
EigenExaの標準版、ScaLAPACK :三重対角行列:Householder(鏡像)
•
EigenExaの高速版:帯行列(narrow-‐band法)
“Development of a High-‐Performance Eigensolver on a Peta-‐Scale Next-‐
Genera^on Supercomputer System”, Imamura etal, Progress in NUCLEAR
SCIENCE and TECHNOLOGY, Vol. 2, pp.643-‐650 (2011)
• 商用ソフトウエアでは
Lanczos法:三重対角がよく利用される
EigenExa - Parallel performance: strong scalability
N=10K
N=20K
N=50K
N=130K
[sec] [cores] 2 20 200 2000 Eigen-‐K(N=10K) ELPA2-‐dev(N=10K) ScaLAPACK(N=10K) Eigen-‐K ELPA2-‐development ScaLAPACK 2.0.2
Fas
te
r
K computer@RIKEN AICS
OpenMP+MPI hybrid
8thread/1proc/1node
Part of the results is obtained by using the K computer at the RIKEN Advanced Ins^tute for Computa^onal Science (Proposal number hp12017).
EigenExaベンチマークコードについて
•
Fortranで書かれた主プログラム
– 実行プログラム名
eigenexa_benchmark
• 京(
FX10)・X86 Intel・X86 GNU・BlueGeneQ用のMakefile有り
–
make
# libEigenExa.aのみ生成される
–
make eigenexa_benchmark
# ベンチマークコードを生成
•
mpirunコマンドなどで起動
– 実行オプションをコマンドライン引数と入力ファイルで指定
– テスト用の係数行列を自動生成
– 複数の行列(タイプ・サイズ)を連続実行可能
–
EigenExaの求解ルーチンeigen_sx()又は eigen_s () を呼び出して実行
– 固有値計算に必要な計算資源を出力表示(テキスト)
EigenExaベンチマークコードについて
• 実行プログラム名 eigenexa_benchmark
• 実行時のオプション(
X86 Linux Intel環境での例)
$ ./eigenexa_benchmark -help eigenexa_benchmark [options] options:-h displays this help and exit -f input_file uses input_file
default is ./IN
-g mode sets the process grid as follows R, r MPI_COMM_WORLD row-major mode C, c MPI_COMM_WORLD column-major mode
A, a MPI_COMM_SELF (embarrasingly parallel) 1, 2,... 9 splitted MPI_COMM_WORLD
with the color=MOD(RANK,{number}) -x dimX dimY sets the cartecian shape (dimX, dimY) dimX <= dimY must be hold.
EigenExaベンチマークコードについて
• 行列や求解モードはinput_fileで指定する
•
input_fileのレコードフォーマットは以下
!
! Input file format !
! N bx by mode matrix solver !
! N : matrix dimension
! bx : block width for the forward transformation ! by : block width for the backward transformation ! mode : solver mode { 0 : only eigenvalues }
! { 1 : eigenvalues and corresponding eigenvectors} ! { 2 : mode 1 + accuracy improvement for eigenvalues} ! matrix : test matrix { 11 types, 0 ... 10 }
! solver : { 0 : eigen_sx, new algorithm, faster on the K } ! { 1 : eigen_s, conventional algorithm }
!
! if a line starts from '!', the line is treated as a comment !
EigenExaベンチマークコードについて
• テスト用の係数行列
•
matrixパラメタ(0-‐9):行列要素を自動生成。
– 以下の10種類の行列タイプから選択
•
matrixパラメタ(10):行列要素をユーザが指定。
– 外部ファイルW.datから読み込む
• ベンチマークはinput_fileで複数の行列(タイプ・サイズ)を指定して
連続実行可能
Matrix type = 0 (Frank matrix) Matrix type = 1 (Toeplitz matrix) Matrix type = 2 (Random matrix) Matrix type = 3 (Frank matrix 2) Matrix type = 4 (W: 0, 1, ..., n-1)
Matrix type = 5 (W: sin(PAI*5*i/(n-1)+EPS^1/4)^3) Matrix type = 6 (W: MOD(i,5)+MOD(i,2))
Matrix type = 7 (W: same as Frank matrix)
Matrix type = 8 (W: Uniform Distribution, [0,1)) Matrix type = 9 (W: Gauss Distribution, m=0,s=1) Matrix type = 10 (W: Read from the data file 'W.dat')
EigenExaベンチマークコードについて
• テスト結果出力例(X86 Linux Intel環境での例)
$ export OMP_NUM_THREADS=8 $ export I_MPI_FABRICS=shm:ofa $ mpirun -np 16 ${bin_path}/EigenExa-2.1/eigenexa_benchmark -x 4 4 INPUT FILE=IN ====================================================== Solver = eigen_sx / via penta-diagonal formatBlock width = 48 / 128
NUM.OF.PROCESS= 16 ( 4 4 ) NUM.OF.THREADS= 8
Matrix dimension = 20000
Matrix type = 0 (Frank matrix)
Internally required memory = 809378576 [Byte] mode 'X' :: mode 'A' + accuracy improvement
Elapsed time = 72.6625800132751 [sec] FLOP = 41809663584490.7
Performance = 575.394702154152 [GFLOPS] --- 続く
EigenExaベンチマークコードについて
• テスト結果出力例(X86 Linux Intel環境での例続き)
---
max|w(i)-w(i).true|/|w.true|= 1.066005805307593E-008 162121999.707086 *** Eigenvalue Relative Error *** : PASSED
max|w(i)-w(i).true| = 1.72822991013527 162121999.707086 *** Eigenvalue Absolute Error *** : FAILED
Do not mind it. Relative error is small enough. --- |A|_{1}= 200010000.000000
epsilon= 2.220446049250313E-016
max|Ax-wx|_{1}/Ne|A|_{1}= 3.267477534449350E-002 50 *** Residual Error Test *** : PASSED
|ZZ-I|_{F}= 1.498340806171751E-012 *** Orthogonality Test *** : PASSED
EigenExaベンチマークコードについて
• テスト結果出力例(X86 Linux Intel環境プロセスpinステートも表示)
$ export I_MPI_DEBUG=5
$ export I_MPI_FABRICS=shm:ofa
$ mpirun -np 16 ${bin_path}/EigenExa-2.1/eigenexa_benchmark -x 4 4 [0] MPI startup(): Rank Pid Node name Pin cpu
[0] MPI startup(): 0 16562 vsp25 {0,1,2,3,4,5,6,7} [0] MPI startup(): 1 16563 vsp25 {8,9,10,11,12,13,14,15} [0] MPI startup(): 2 9634 vsp27 {0,1,2,3,4,5,6,7} [0] MPI startup(): 3 9635 vsp27 {8,9,10,11,12,13,14,15} [0] MPI startup(): 4 10120 vsp29 {0,1,2,3,4,5,6,7} [0] MPI startup(): 5 10121 vsp29 {8,9,10,11,12,13,14,15} [0] MPI startup(): 6 16952 vsp10 {0,1,2,3,4,5,6,7} [0] MPI startup(): 7 16953 vsp10 {8,9,10,11,12,13,14,15} [0] MPI startup(): 8 18491 vsp11 {0,1,2,3,4,5,6,7} [0] MPI startup(): 9 18492 vsp11 {8,9,10,11,12,13,14,15} [0] MPI startup(): 10 19442 vsp12 {0,1,2,3,4,5,6,7} [0] MPI startup(): 11 19443 vsp12 {8,9,10,11,12,13,14,15} [0] MPI startup(): 12 19454 vsp16 {0,1,2,3,4,5,6,7} [0] MPI startup(): 13 19455 vsp16 {8,9,10,11,12,13,14,15} [0] MPI startup(): 14 17532 vsp17 {0,1,2,3,4,5,6,7} [0] MPI startup(): 15 17533 vsp17 {8,9,10,11,12,13,14,15}
EigenExaベンチマークコードについて
• 計算各フェイズでの通信待ち等さらに細かな情報を得たい場合は、
Makefile 中で以下のマクロを 1
に設定して
makeするとよい
–
DEBUGFLAG = $(MACRO_D_PREFIX)TIMER_PRINT=
0
• 実行時stdoutの例
calc (u,beta) 0.660794019699097 mat-vec (Au) 2.37120127677917 281.151445554300 2update (A-uv-vu) 0.451921701431274 1475.18179488897 calc v 0.000000000000000E+000 v=v-(UV+VU)u 0.455217599868774UV post reduction 5.616807937622070E-002 COMM_STAT BCAST :: 0.337308168411255 REDUCE :: 1.66761779785156 REDIST :: 0.000000000000000E+000 GATHER :: 8.748936653137207E-002 TRD-BLK 10000 4.13007497787476 322.835139912989 GFLOPS TRD-BLK-INFO 10000 48 … …
EigenExaベンチマークコードについて
• テスト結果出力例(京コンピュータでの例)
$ export OMP_NUM_THREADS=8 $ mpiexec -n 16 ./eigenexa_benchmark -x 4 4 INPUT FILE=IN ====================================================== Solver = eigen_sx / via penta-diagonal formatBlock width = 48 / 128 NUM.OF.PROCESS= 16 ( 4 4 ) NUM.OF.THREADS= 8
Matrix dimension = 20000
Matrix type = 0 (Frank matrix)
Internally required memory = 809378576 [Byte] mode 'X' :: mode 'A' + accuracy improvement Elapsed time = 53.00329535175115 [sec] FLOP = 41803090435242.67
Performance = 788.6885175312324 [GFLOPS]
---
max|w(i)-w(i).true|/|w.true|= 1.066005768542290E-08 162121999.7070863 *** Eigenvalue Relative Error *** : PASSED
max|w(i)-w(i).true| = 1.728229850530624 162121999.7070863 *** Eigenvalue Absolute Error *** : FAILED
EigenExaベンチマークコードについて
• ベンダー統計ツールとの数値比較
– 京コンピュータの場合(fipp) 行列要素生成処理も含んだ表示
Elapsed(s) MFLOPS MFLOPS/PEAK(%) MIPS MIPS/PEAK(%) --- 56.6477 773401.5044 37.7637 332690.4151 32.4893 Application --- 56.6477 48266.1621 37.7079 20797.4704 32.4960 Process 10 54.7928 49989.9193 39.0546 21502.4550 33.5976 Process 9 54.7822 49874.1968 38.9642 21430.2796 33.4848 Process 13 54.7787 50252.3960 39.2597 21643.9902 33.8187 Process 1 54.7602 50124.2821 39.1596 21575.6756 33.7120 Process 5 ... similar 16 procs
Mem throughput Mem throughput
Elapsed(s) _chip(GB/S) /PEAK(%) SIMD(%) --- 56.6477 195.4106 19.0831 75.1494 Application --- 56.6477 12.2135 19.0836 75.0269 Process 10 54.7928 12.6243 19.7254 75.1301 Process 9 54.7822 12.6181 19.7158 75.2976 Process 13 54.7787 12.6283 19.7317 74.9276 Process 1 54.7602 12.6464 19.7599 75.0345 Process 5