Slide 1

Slide 1 text

MN-Coreの性能を引き出す技術 〜HPL/姫野ベンチマーク編〜 安達 知也 AIコンピューティング事業本部 ソフトウェア開発部 エンジニア 株式会社Preferred Networks

Slide 2

Slide 2 text

2 2017/10- 株式会社Preferred Networks ● MN-Coreシリーズ・付随するソフトウェアスタックの開発 ● Green500ランキング向けのベンチマークチューニング ● MN-Core Challenge(アセンブリコードゴルフ大会)テスター 2010/04-2017/10 富士通株式会社 ● スーパーコンピュータ向けソフトウェア開発 ○ 通信ライブラリ・ドライバ、ジョブスケジューラなど 大学時代はプロセッサ自作実験(高速化)にのめり込む 自己紹介 - 安達 知也 (Tomoya Adachi) コンピュータを速く動かすのが好き

Slide 3

Slide 3 text

3 本講演はアセンブリを書くのが楽しくて楽しくて仕方がない人間が MN-Coreシリーズの性能を限界まで引き出そうと奮闘した記録であり、 MN-Coreシリーズを使うのにアセンブリが必須というわけではありません 続く講演でSDK(コンパイラ、ランタイム)の紹介があります! 重要な注意

Slide 4

Slide 4 text

4 MN-Core アーキテクチャ概要

Slide 5

Slide 5 text

5 深層学習向けプロセッサ MN-Core MN-Core™ Series MN-Core MN-Core 2

Slide 6

Slide 6 text

6 階層化された分散メモリSIMDアーキテクチャ 演算器は近傍メモリのみに直接アクセスできる (MN-Core 2でもL2B数など細かい違いはあるがほぼ同様) ※以下、MN-Core・MN-Core 2に共通の話題は単に「MN-Core」とします MN-Core ブロックダイヤグラム

Slide 7

Slide 7 text

7 MN-Coreの演算・転送の種類 行列演算器 (MAU) 整数演算器 (ALU) MAB-L1B間転送 L1B-L2B間転送 DRAM L2B-DRAM-PDM間転送 ホストメモリ MN-Core-ホスト間転送 演算だけでなく全ての階層・ メモリ間の転送を明示的に ユーザーが記述する

Slide 8

Slide 8 text

8 MN-Coreのアセンブリ言語仕様上の命令は以下のように分類されている ● ALU命令 ● MAU命令(行列FMA、行列書き込み、行列転置読み出し) ● L1BM命令(PEメモリ-L1BM間転送) ● L2BM命令(L1BM-L2BM間転送) ● トップレベル転送命令(L2BM/PDM/DRAM間相互転送、同期) これらはすべて同時に発行することができる MN-Coreの命令 ALU命令 MAU命令 L1B転送命令 L2B転送命令 トップレベル転送命令 iadd $lr0v $ls8v $lr8v; fmmul $lx $lm0v $ln0v; fmwrite $ls8v $ly0; l1bmd $t $lbi ↑ ALU 命令 ↑ 行列演算命令 ↑ 行列レジスタ命令 ↑ PE-L1BM命令

Slide 9

Slide 9 text

9 1ステップ(アセンブリの1行)の命令のバイナリ列の例 0100000000000000000000000101001010101000000000001111111100000000000000000000000000000001000000000000 0000000000111111111110000000000000000010000000000000000000000000000000000000000000000000001111111110 10000000000000110000000000000000000000000111000000000000000000000000000000001100000000000000 各ユニットに対する指示が含まれている iadd $lr0v $ls8v $lr8v; fmmul $lx $lm0v $ln0v であれば、 ● GRF0 は 0 番アドレスを読め ● GRF1 は 8 番アドレスを読め ● LM0 は 0 番アドレスを読め ● ALU は GRF0 の出力と GRF1 の出力を加算しろ ● MAU は 行列レジスタ x と LM0 の出力の行列積を計算しろ ● GRF0 は ALU の出力を 8 番アドレスに書け ● LM1 は MAU の出力を 0 番アドレスに書け MN-Coreの命令の実際

Slide 10

Slide 10 text

10 以下が命令ビットに露出 しソフトウェア制御可能 ● メモリ読み書き指示 ● 演算種別 ● マルチプレクサ制御 PEの回路図概観 https://mncore-challenge.preferred.jp/tips/VLIW

Slide 11

Slide 11 text

11 Green500

Slide 12

Slide 12 text

12 年に2回(6月と11月)発表される、スパコンの性能・電力効率ランキング TOP500のランキング指標 ● 連立一次方程式をLU分解で解くプログラム(HPL)を動かし、演算数を 実行時間で割った値(FLOPS FLoating point OPeration per Second) Green500のランキング指標 ● FLOPSを消費電力で割った値(FLOPS/W) ● TOP500にランクインしたシステムに限る(重要!!) TOP500: 速いスパコンが勝つ Green500: ある程度速く、その上で省エネなスパコンが勝つ TOP500/Green500

Slide 13

Slide 13 text

13 2019年のGreen500 2019/06 15.113GF/W 2019/11 16.876GF/W

Slide 14

Slide 14 text

14 https://projects.preferred.jp/mn-core/ MN-Coreの公式スペック 66GF/W 圧倒的に勝てそう!?

Slide 15

Slide 15 text

15 2020年6月のランキングで初登場1位を獲得 初登場時と比べると最終的に倍近い電力効率を達成! MN-CoreクラスタのGreen500経歴 2020/June 2020/Nov. 2021/June 2021/Nov 2022/June 順位 1 2 1 1 5 電力効率 21.11GF/W 26.04GF/W 29.70GF/W 39.38GF/W 40.90GF/W 実行効率 41.33% 52.68% 58.08% 64.35% 65.09%

Slide 16

Slide 16 text

16 連立一次方程式をLU分解を用いて解く Ax = b → LUx = b → x = U-1L-1b 行列Aを下三角行列Lと上三角行列Uの積に分解 ● 行列サイズNxNに対して時間計算量O(N3) ベクトルbにL-1を掛け(前進代入)U-1を掛け(後退代入)解を得る ● 行列サイズNxNに対して時間計算量O(N2) HPLの計算内容

Slide 17

Slide 17 text

17 大まかに3種 ● 行列積(主にLUの積)の高速化 ● 行列積周辺の演算と通信のオーバーラップ ● コード生成の高速化(省略) ○ 制御処理をホスト側に任せているため、行交換などのランダムアク セスはアセンブリコードを再生成することで対応している 高速化の方法

Slide 18

Slide 18 text

18 MN-Coreの演算・転送の種類(再掲) 行列演算器 (MAU) 整数演算器 (IALU) MAB-L1B間転送 L1B-L2B間転送 DRAM L2B-DRAM-PDM間転送 ホストメモリ MN-Core-ホスト間転送 MN-Core DirectConnect (ICT) MN-Core-MN-Core間転送 演算だけでなく全ての階層・メモ リ間の転送を明示的にユーザー が記述する

Slide 19

Slide 19 text

19 MN-Coreプログラミング(行列積実装) 計算する行列をMN-Core内メモリにマッピング 行列を分割 行列積ユニットに 載せる用に分割 メモリの制約 を満たすよう 配置 行列の転送・計算・書き戻しをスケジューリング

Slide 20

Slide 20 text

20 MN-Coreプログラミング(行列積実装) オペコード が1対1対応 スケジュールの実装結果(アセンブリ) 行列積命令(16回) Cの書き戻し Cの転送 スケジュールの 一部を拡大 前のDRAMからの書き戻し・転送 次のDRAMからの書き戻し・転送 ポートが空いた隙にレジスタの初期化

Slide 21

Slide 21 text

21 MN-Coreプログラミング(行列積実装) 後は最内ループの内容をアドレスのみ 変更して繰り返すだけ 行列積 (LU) 単体の稼働率は98.9%

Slide 22

Slide 22 text

22 演算と行交換のオーバーラップ L D U D L L D U D L まず左端の行交換 左端の演算をしながら 次の行交換 L D U D L 以降も同様に重ねる 行交換は演算器を使わないのでUの計算や更新と並行動作可

Slide 23

Slide 23 text

23 行列積周辺の演算と通信のオーバーラップ 柱転送 行交換 行列更新 <2020/06> <2021/06> <2021/11> 行交換と行列更新のみ オーバーラップ 柱転送と行交換を オーバーラップ 行交換1回分の時間削減 さらに行列更新を オーバーラップ 行列更新1回分の時間削減 <初期段階の実装>

Slide 24

Slide 24 text

24 柱分解が終わるまで右側の計算ができないため、素朴な実装では柱分解に参 加しないプロセスが遊んでしまう ● 柱分解の時間+分解したLをやりとりする通信時間 次に柱分解を行うプロセスは以下のように更新途中で柱分解 ● 左端だけUの計算+更新 ● 更新した部分の柱分解、次のLの通信 ● 残りのUの計算+更新 (参考)Lookahead 柱分解 柱通信 行交換 U計算+更新

Slide 25

Slide 25 text

25 MN-Coreの消費電力を減らす ● 実行時間を短くする(=高速化)ことによる待機電力の削減 ● 記憶領域としてSRAMの代替でFF (flip-flop)を使うことによる電力削減 ● チップ内の信号線の0/1変化を抑えることによる電力削減 MN-Core以外の消費電力を減らす(省略) ● CPU設定、ファン設定、ネットワーク設定など 省電力化の手法

Slide 26

Slide 26 text

26 SRAMと比べてFFは… ● Pros. ○ リーク電流・貫通電流を抑え、低消費電力 ● Cons. ○ トランジスタ数が増えてしまい、回路面積的に不利 MN-Core内部の記憶領域にはSRAMを使うもの(LMなど)とFFを使うもの (T regなど)がそれぞれあり、行列積の実装時にはFFを積極的に使用 SRAMの代わりにFFを使う

Slide 27

Slide 27 text

27 自然に書いた命令でのMN-Coreの動作 行列演算器 (MAU) 整数演算器 (ALU) DRAM ホストメモリ MN-Core DirectConnect 何もしていないときは 自然に回路が止まる 命令を工夫しないと 動いてしまう!!!

Slide 28

Slide 28 text

28 PE-MAB-L1Bの概念的な接続関係 記憶領域 GRF LM0 LM1 T MAU ALU L1B L1BM GRF LM0 LM1 T x4 0 enable enable

Slide 29

Slide 29 text

29 命令を弄って回路を止める省電力化 記憶領域 GRF LM0 LM1 T MAU ALU L1B L1BM GRF LM0 LM1 T x4 0 enable enable ALUを使わないときは 命令でdisableできる 記憶領域に書き込まない場合は 0を選択することでmux以降固定 L1BMから読み出さない ときは勝手に0固定される

Slide 30

Slide 30 text

30 命令を弄っても止められない回路 記憶領域 GRF LM0 LM1 T MAU ALU L1B L1BM GRF LM0 LM1 T x4 0 enable enable この回路を止められないことが問題! チップを作った時点ではこのような 省電力化を想定していなかった

Slide 31

Slide 31 text

31 回路を止める代わりに0を参照させる 記憶領域 GRF LM0 LM1 T=0 MAU ALU L1B L1BM GRF LM0 LM1 T x4 0 enable enable 行 列 積 で 使 用 L1B方向の転送がないときは Tレジスタを参照させる Tレジスタを行列積で使わ ないようにした上で、 あらかじめ0を書いておく

Slide 32

Slide 32 text

32 電力効率の推移 縮約をFF領域で 行うようにした 柱転送と行交換と 行列積を重ねた 不要な回路を止める 処理を入れた 2020/06 2020/11 2021/06 2021/11

Slide 33

Slide 33 text

33 姫野ベンチマーク on MN-Core 2

Slide 34

Slide 34 text

34 HPCシステムの評価に使われる 差分法のベンチマーク ● 3次元ポアソン方程式をヤコビの 反復法で解く ● 19点ステンシル計算 姫野ベンチマーク概要

Slide 35

Slide 35 text

35 分散メモリ環境でのステンシル計算では、隣の点が他のPE (Processing Element) のメモリにある場合があるため「袖交換」が必要 袖交換 figure is obtained from https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=142401 Blue points are not required in Himeno BMT

Slide 36

Slide 36 text

36 姫野ベンチはメモリ律速といわれる ● 12個の行列は最内ループ中 1回ずつしか読まれない ● 一方で1個の行列は最内ループ 中20回読まれる Variation of matrix size (i x j x k) ● XS: 32 x 32 x 64 ● S: 64 x 64 x 128 ● M: 128 x 128 x 256 ● L: 256 x 256 x 512 ● XL: 512 x 512 x 1024 姫野ベンチマークの行列

Slide 37

Slide 37 text

37 問題サイズM-half (128x128x128)を定義して解く また、MN-Core 2を2ボード使用してM (128x128x256)を解く 行列を全てLM(LM0またはLM1)上に置くことで高実行効率を目指す ● DRAMは13個の行列を演算と並列で読み出すには遅すぎる 一方で、袖交換を演算とオーバーラップすることを考えると、問題サイズは できるだけ大きいほうがよい ● O(N^3) calculation vs. O(N^2) halo exchange ● 各PEは512要素(4x16x8)を担当する ● 内側の2x14x6を解いている間に袖交換 問題サイズ

Slide 38

Slide 38 text

38 MN-Coreレイアウト記法(https://tech.preferred.jp/ja/blog/mn-core-tensor-layout/)で書くと ((2_L2B:1, 16_MAB, 4:64), (2_L1B:4, 4_PE, 2_W, 8:1), (4_L2B:2, 4_L1B:1, 8:8)) ● 各L2Bは64x128x32を担当。袖交換転送量を減らす観点では64x64x64 のほうが有利だが、後述のとおりj軸がL2B内に閉じる効果を重視 ● 各L1Bは64x64x8を担当 ● 各PEは4x16x8を担当。j軸がL2B内に閉じていて高速に交換でき、早い 段階でj軸の袖領域にアクセスできる (参考)MN-Core 2でのレイアウト

Slide 39

Slide 39 text

39 演算(MAU命令)を最優先にするため、「最速カーネルコード」を並べた 上に袖交換用命令を配置していく PDMのみ使用でDRAMレイテンシの不確実性(refresh, retraining)を排除 命令スケジュール without any halo kernel halo xchg. 12 with i-halo 24 0 with ij-halo 48 with ijk-halo 64 1 iter p=wrk2 block = 8 elems j in L2B i via PDM ij jk k, ik via PDM

Slide 40

Slide 40 text

40 PDM経由でボード間の転送を行う k方向の袖が要求されるまでにギリギリ間に合う 2ボードでの命令スケジュール without any halo kernel halo xchg. 12 with i-halo 24 0 with ij-halo 48 with ijk-halo 64 1 iter p=wrk2 block = 8 elems j in L2B i via PDM ij jk k to PDM k, ik (local) k, ik (remote) board-to-board transfer

Slide 41

Slide 41 text

41 最内ループは13乗算21加算 ただし、FMAに帰着不能な乗算が 1つあるため22 FMA命令になる 解く座標が袖に接する軸数ごとに 4通りのカーネルを用意 それぞれのカーネルで袖交換用に LM読み書き可能なタイミングを 設定 カーネルコード FMAにならない乗算

Slide 42

Slide 42 text

42 自PEのpはLM0, LM1の両方に同一内容を保持しメモリポート制約を緩和 一方で、袖交換で得た隣接PEのpはLM1にだけ書かれる つまり計算が進み袖に接する軸数が増えるにつれ演算でのLM1使用率増 Kernel vsm (#halo=0,1: N7/N6) fvfma $lma[0] $lnppzz $mauf $nowrite fvfma $lma[1] $lnpzpz $mauf $nowrite fvfma $lma[2] $lnpzzp $mauf $nowrite fvfma $lnc[0] $lmpnzz $mauf $nowrite fvfma $lnc[1] $lmpznz $mauf $nowrite fvfma $lnc[2] $lmpzzn $mauf $nowrite fvfma $mauf $lna[3] -$lmpzzz $nowrite fvmul $mauf $lmbnd $t fvfma $mauf $lromega $lmpzzz $lrwrk2 fvfma $t $t $lrgosa $lrgosa fvadd $lmpnnz -$lnppnz $nowrite fvadd $mauf $lnpppz $nowrite; lpassa $lmpznn $t fvadd $mauf -$lmpnpz $nowrite; lpassa $lnppzn $lrtmp fvfma $mauf $lmb[0] $lnwrk1 $lrb fvadd -$lrtmp $l(m|n)pnzn $nowrite fvadd $mauf $lmppzp $nowrite fvadd $mauf -$lmpnzp $lrtmp2 fvadd $t -$lmpzpn $nowrite fvadd $mauf $lmpzpp $nowrite fvadd $mauf -$lmpznp $nowrite fvfma $mauf $lmb[1] $lrb $nowrite fvfma $lrtmp2 $lmb[2] $mauf $nowrite 袖交換用にLM1アク セス可能な隙間確保 readable for 7 steps writable for 5 steps

Slide 43

Slide 43 text

43 自PEのpはLM0, LM1の両方に同一内容を保持しメモリポート制約を緩和 一方で、袖交換で得た隣接PEのpはLM1にだけ書かれる つまり計算が進み袖に接する軸数が増えるにつれ演算でのLM1使用率増 Kernel vsm (#halo=2: M2N3) fvfma $lma[0] $lnppzz $mauf $nowrite fvfma $lma[1] $lnpzpz $mauf $nowrite fvfma $lma[2] $lnpzzp $mauf $nowrite fvfma $lnc[0] $lmpnzz $mauf $nowrite fvfma $lnc[1] $lmpznz $mauf $nowrite fvfma $lnc[2] $lmpzzn $mauf $nowrite fvfma $mauf $lna[3] -$lmpzzz $nowrite fvmul $mauf $lmbnd $t fvfma $mauf $lromega $lmpzzz $lrwrk2 fvfma $t $t $lrgosa $lrgosa fvadd $lmpnnz -$lnppnz $nowrite fvadd $mauf $lnpppz $nowrite; lpassa $lmppzn $t fvadd $mauf -$lmpnpz $nowrite; lpassa $lnpznn $lrtmp fvfma $mauf $lmb[0] $lnwrk1 $lrb fvadd -$t $lnpnzn $nowrite fvadd $mauf $lnppzp $nowrite fvadd $mauf -$lnpnzp $lrtmp2 fvadd $lrtmp -$lnpzpn $nowrite fvadd $mauf $lmpzpp $nowrite fvadd $mauf -$lmpznp $nowrite fvfma $mauf $lmb[1] $lrb $nowrite fvfma $lrtmp2 $lmb[2] $mauf $nowrite readable for 4 steps writable for 2 steps readable for 4 steps writable for 2 steps 袖交換ではなく次iter用のpの書き戻しで使用

Slide 44

Slide 44 text

44 自PEのpはLM0, LM1の両方に同一内容を保持しメモリポート制約を緩和 一方で、袖交換で得た隣接PEのpはLM1にだけ書かれる つまり計算が進み袖に接する軸数が増えるにつれ演算でのLM1使用率増 Kernel vsm (#halo=3: M4N1) fvfma $lma[0] $lnppzz $mauf $nowrite fvfma $lma[1] $lnpzpz $mauf $nowrite fvfma $lma[2] $lnpzzp $mauf $nowrite fvfma $lnc[0] $lmpnzz $mauf $nowrite fvfma $lnc[1] $lmpznz $mauf $nowrite fvfma $lnc[2] $lmpzzn $mauf $nowrite fvfma $mauf $lna[3] -$lmpzzz $nowrite fvmul $mauf $lmbnd $t fvfma $mauf $lromega $lmpzzz $lrwrk2 fvfma $t $t $lrgosa $lrgosa fvadd $lmpnnz -$lnppnz $nowrite fvadd $mauf $lnpppz $nowrite; lpassa $lmppzn $t fvadd $mauf -$lnpnpz $nowrite; lpassa $lmpznn $lrtmp fvfma $mauf $lmb[0] $lnwrk1 $lrb fvadd -$t $lnpnzn $nowrite fvadd $mauf $lnppzp $nowrite fvadd $mauf -$lnpnzp $lrtmp2 fvadd $lrtmp -$lnpzpn $nowrite fvadd $mauf $lnpzpp $nowrite fvadd $mauf -$lnpznp $nowrite fvfma $mauf $lmb[1] $lrb $nowrite fvfma $lrtmp2 $lmb[2] $mauf $nowrite readable for 6 steps writable for 4 steps 袖交換ではなく次iter用のpの書き戻しで使用

Slide 45

Slide 45 text

45 評価は、本家姫野ベンチマーク同様に、おおよそ実行時間が1分となるよう なイテレーション回数を設定 評価

Slide 46

Slide 46 text

46 7950000イテレーション実行時間: 59,911,428,773 ns (7536 ns / iter) 7950000 x 126 x 126 x 126 x 34 / 59911428773 = 9025.016 GFLOPS 実行効率73.4%を達成 (MN-Core 2ベクトルモードFMA理論性能=12288GFLOPS) 前述のとおりFMAでは22命令必要だが、姫野ベンチのFLOPS計算は単純に 34演算(17命令相当)で計算されることを考えると73.4%はほぼ理論性能 (参考値)MN-Coreでの性能(倍精度) 2630000 x 126 x 126 x 254 x 34 / 59861776598 = 6023.652 GFLOPS 実行効率73.5% 評価結果 - 1ボード性能

Slide 47

Slide 47 text

47 7950000イテレーション実行時間: 59,912,543,890 ns (7536 ns / iter) 7950000 x 126 x 126 x 254 x 34 / 59912543890 = 18192.949 GFLOPS 実行効率74.0%を達成 (MN-Core 2ベクトルモードFMA理論性能x2=24576GFLOPS) 評価結果 - 2ボード性能

Slide 48

Slide 48 text

48 他システムでは<1TFLOPsが報告されており、9.025TFLOPsは圧倒的 他システムとの比較 obtained from https://arxiv.org/abs/2304.11921

Slide 49

Slide 49 text

49 LMに載るサイズを解いているのは、他システムでいうとキャッシュに当た り続けている状態で、性能が出るのは当然では? 大きいサイズの問題を解く場合DRAMに行列を置く ● 単純に1 iter回すだけだとDRAMアクセスが 演算の30~40倍ぐらいの時間を食う ● つまり、temporal blockingが必要 試算では、L (256x256x512)の場合 temporal blockingにより16 itersを まとめて解くことで効率11%程度 議論 obtained from https://arxiv.org/abs/2304.11921 →既存システムで問題 サイズを落として性能 が出るわけではない

Slide 50

Slide 50 text

50 Green500 ● 高速化・省電力化の工夫により、3期にわたって1位を獲得! 姫野ベンチマーク ● 最近傍メモリに問題を収めた場合、達成可能な理論性能に到達! まとめ

Slide 51

Slide 51 text

51 MN-Core 2のアセンブリを書 いて問題(全20問)を解くコ ンテストを開催 参加者500人以上の大盛況 チュートリアルが多めなので、 MN-Core の学習にも最適! https://mncore-challenge.preferred.jp/ MN-Core Challenge ※コンテストは昨年終了済

Slide 52

Slide 52 text

Making the real world computable