Post on 14-Jul-2020
1
カーネルベンチマークコードの開発について EigenExaについて EigenExaベンチマークコードについて ベンチマーク結果に基づく性能推定について
2/24/2014 理化学研究所 三上和徳
カーネルベンチマークコード
• 開発の目的
– エクサスケール規模のシミュレーションの核となる数値計算アルゴリズムの中で、特に重要なものについて、数値計算ライブラリ等を用いてそのコストを推定するためにカーネルベンチマークを作成し、評価に使用する。
• 対象計算アルゴリズム
– 固有値計算(実数密行列、標準固有値計算)
– 3次元FFT
– 乱数生成器
• 公開計画
– 表
2
カーネル ベンチマークコード
固有値計算(実対称密・標準) 公開中
3次元FFT 4月公開見込み
乱数生成 3月公開見込み
固有値計算
• 実数対称密行列の標準固有値計算
• AICSで開発中のEigenExaをもとにベンチマークコードを作成(公開版version 2.1a)
• h;p://www.aics.riken.jp/labs/lpnctrt/EigenExa.html • 10種類のテスト行列(+利用者指定固有値)
• プロセスグループ形状の指定
• 固有値のみ、固有値+固有ベクトル、など(ただし全モード計算)
3
3D-FFT
• FFTW向けに紹介されている代表的な3DFFTの測定コードを
もとに、各種FFT実装や分割方法による性能を推定する。 • AICSで開発中のKMATH_FFTからベンチマークを作成中(3
月末完成)。
• 3D-‐FFTの主要なライブラリ、FFTE, FFTWをカーネルとして開発中
• 3次元空間の1軸、2軸、3軸分割の選択
4
乱数生成器
• メルセンヌツイスター乱数生成器を利用した乱数生成部分の性能評価ベンチマークコード
• MPIのグループでできるだけ重複のない乱数列を管理し、内部状態管理のI/O処理も含む
• AICSで開発中のKMATH_RANDOMのベンチマークコードを現在改良し、カーネルベンチ提供用に調整中
5
EigenExaについて
6
• 理化学研究所ホームページ2013年12月5日60秒でわかるプレスリリース」より
• 「京」を使い世界最高速の固有値計算に成功
• 行列の固有値計算では行列を簡単な形式(形状)に変換し、それを中間形式として取り扱います。理研の研究チームは、帯行列(ゼロでない要素が対角線上に帯状に分布する行列)を中間形式に採用することによって、前処理の時間の削減を図った新しい計算アルゴリズムを考案し、それを基にした数学ソフト「EigenExa(アイゲンエクサ)」を開発しました。「京」の全プロセッサを用いて計算した結果、世界最大規模の100万×100万の行列の固有値計算が1時間以内で可能なこと確認しました。これまでの地球シミュレーターの記録(40万×40万の行列で3時間半)を大幅に上回りました。「京」の高い計算能力とEigenExaの利用により、数十万から100万程度の固有値を求める問題は1時間以内にできることが立証されました。今後、シミュレーションの規模を大幅に拡大することが可能になります。なお、EigenExaはオープンソフトウエアとして公開され、理研計算科学研究機構研究部門のホームページからダウンロードできます。
固有値計算 - 密行列解法の位置づけ
7
固有値計算 疎行列解法・超大規模問題 ・少数固有モード ・特定区間モード ・最小・最大モード
密行列解法・全固有値 ・全固有対 ・全体の数分の1のモード
• 行列の全要素(NxN)をゼロと考えずに扱う
• 直接的解法
• メモリ使用量O(N^2),演算量O(N^3)
• ゼロ要素を落とし,大規模問題での使用メモリ量・演算量を削減
• 反復法が基本
• 疎行列ベクトル積(spMV)が性能を左右
疎行列解法の内部解法に
密行列解法を使用
高性能・高品質な密行列向けソルバの必要性
EigenExa - 世界の競争相手
8
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
9
• テネシー大学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
10
• マックス・プランク研究所 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 - 国際競争力のある新規計算スキームの採用
11
dense
band
tridiagonal eigenpairs
eigenpairs
eigenpairs
ScaLAPACK
1step Scheme
ELPA
DPLASMA
2step Scheme (Byte/Flopが低い)
Eigen-‐Exa
新1step Scheme 高性能実装が困難 全固有ベクトルを求める場合は1stepと大差ないという報告多数
状況によっては逆変換(三重対角 ⇒ 帯)の高性能実装も視野にいれつつ,良好なものを選択
固有値の計算パターン
12
• 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法:三重対角がよく利用される • 行列のサイズが小さい場合: – Jacobi法やベキ乗法などの簡便な方法で直接求めても可
EigenExa - Parallel performance: strong scalability
13
N=10K
N=20K
N=50K
N=130K
2013/11/20 13
[sec]
[cores] 2
20
200
2000
64 128 256 512 1K 2K 4K 8K 16K 32K 64K
Eigen-‐K(N=10K) ELPA2-‐dev(N=10K) ScaLAPACK(N=10K)
Eigen-‐K ELPA2-‐development ScaLAPACK 2.0.2
Faster
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 () を呼び出して実行
– 固有値計算に必要な計算資源を出力表示(テキスト)
14
EigenExaベンチマークコードについて
• 実行プログラム名 eigenexa_benchmark • 実行時のオプション(X86 Linux Intel環境での例)
15
$ ./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のレコードフォーマットは以下
16
! ! 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 ! 1000 48 128 2 0 0 -1
EigenExaベンチマークコードについて
• テスト用の係数行列 • matrixパラメタ(0-‐9):行列要素を自動生成。 – 以下の10種類の行列タイプから選択
• matrixパラメタ(10):行列要素をユーザが指定。 – 外部ファイルW.datから読み込む
• ベンチマークはinput_fileで複数の行列(タイプ・サイズ)を指定して連続実行可能
17
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環境での例)
18
$ 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 format Block 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環境での例続き)
19
----------------------------------------------- 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ステートも表示)
20
$ 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}
... OS(ジョブスケジューラ)が捕捉したメモリ量: Max Memory : 936 MB
EigenExaベンチマークコードについて
• 計算各フェイズでの通信待ち等さらに細かな情報を得たい場合は、Makefile 中で以下のマクロを 1に設定してmakeするとよい – DEBUGFLAG = $(MACRO_D_PREFIX)TIMER_PRINT=0
• 実行時stdoutの例
21
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.455217599868774 UV 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ベンチマークコードについて
• テスト結果出力例(京コンピュータでの例)
22
$ export OMP_NUM_THREADS=8 $ mpiexec -n 16 ./eigenexa_benchmark -x 4 4 INPUT FILE=IN ====================================================== Solver = eigen_sx / via penta-diagonal format Block 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 Do not mind it. Relative error is small enough. 以下カット
EigenExaベンチマークコードについて
• ベンダー統計ツールとの数値比較 – 京コンピュータの場合(fipp) 行列要素生成処理も含んだ表示
23
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
... similar 16 procs
ベンチマーク結果表示値に基づく性能推定について
24
• 演算量 – FLOP : EngenExa eigen_sx()の浮動小数点演算量 ~= Cf x N3 – Matrix dimension = N
• メモリ量 – Internally required memory :MPIプロセスあたりの合計配列サイズ~= Cm x N2 – (次ページ注参照)
• 計算時間 – Elapsed ^me : 演算・通信等の合計経過時間
• 実効ピーク性能比 – Performance [GFLOPS]:固有値計算の性能(全プロセス合計値) – プロセス当たりの性能はデータレイアウト・プロセスマッピングでほぼ決まる
• テスト結果を用いて推定(同じプラットフォームで外挿)できること – より大規模な行列を計算する場合の浮動小数点演算量、メモリ量、演算時間
– より多数のノード数を利用する場合の演算時間
– 通信の待ち時間は実行条件への依存が大きく、推定方法は一様ではない
利用上の留意点
25
• 必要メモリ量の表示
– ベンチマークコードによるメモリ量の算出(Internally required memory ) • MPIプロセスあたりの最大メモリ量(ソースプログラムで静的に読める値)
– ジョブが実際に必要とするメモリ量はより多い • テキスト・ライブラリ・MPIバッファなどのセグメントは入っていない • OpenMPスレッド並列の場合はスレッドprivateな変数領域が相当量必要
• 計算結果 – 計算の結果a(n,n)は対角化されるが a(1,1)成分はFLOP値(浮動小数点演算回
数)、a(2,1)成分は経過時間の値で各々上書きされて返ってくるので注意
ベンチマークコードによるメモリ量の表示 Internally required memory = 809378576 [Byte]
OSによる統計出力メモリ量(京コンピュータfipp表示の例) スレッド数 MAX MEMORY SIZE (USE) 1 1346.4 MiB (1.4GB) 8 2078.6 MiB (2.1GB)
26
ダウンロードページ h;p://www.aics.riken.jp/labs/lpnctrt/EigenExa.html