MN-Coreの性能を引き出す技術〜HPL/姫野ベンチマーク編〜/MTC25

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Preferred Networks Preferred Networks PRO
January 15, 2026
39

 MN-Coreの性能を引き出す技術〜HPL/姫野ベンチマーク編〜/MTC25

A会場
1. MN-Coreの展望 的矢 知樹(AIコンピューティング事業本部 事業戦略・プロダクトマーケティング部 部長)
2. MN-Coreの設計思想 牧野 淳一郎(コンピュータアーキテクチャ担当CTO)
3. MN-Core Arch deep dive 真島 優輔(AIコンピューティング事業本部 MN-Core 開発部 Engineering Manager)
4. 誰もがMN-Coreを利用できるAIクラウドサービス: Preferred Computing Platform 照屋 大地(AIコンピューティング事業本部 基盤技術部 部長)

B会場
1. MN-Coreの性能を引き出す技術 HPL/姫野ベンチマーク編 安達 知也(AIコンピューティング事業本部 ソフトウェア開発部 エンジニア)
2. MN-Core SDK × LLM推論  樋口 兼一(AIコンピューティング事業本部 ソフトウェア開発部) /坂本 亮(AIコンピューティング事業本部 ソフトウェア開発部 部長)

Avatar for Preferred Networks

Preferred Networks PRO

January 15, 2026
Tweet

More Decks by Preferred Networks

Transcript

  1. 2 2017/10- 株式会社Preferred Networks • MN-Coreシリーズ・付随するソフトウェアスタックの開発 • Green500ランキング向けのベンチマークチューニング • MN-Core

    Challenge(アセンブリコードゴルフ大会)テスター 2010/04-2017/10 富士通株式会社 • スーパーコンピュータ向けソフトウェア開発 ◦ 通信ライブラリ・ドライバ、ジョブスケジューラなど 大学時代はプロセッサ自作実験(高速化)にのめり込む 自己紹介 - 安達 知也 (Tomoya Adachi) コンピュータを速く動かすのが好き
  2. 7 MN-Coreの演算・転送の種類 行列演算器 (MAU) 整数演算器 (ALU) MAB-L1B間転送 L1B-L2B間転送 DRAM L2B-DRAM-PDM間転送

    ホストメモリ MN-Core-ホスト間転送 演算だけでなく全ての階層・ メモリ間の転送を明示的に ユーザーが記述する
  3. 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命令
  4. 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の命令の実際
  5. 12 年に2回(6月と11月)発表される、スパコンの性能・電力効率ランキング TOP500のランキング指標 • 連立一次方程式をLU分解で解くプログラム(HPL)を動かし、演算数を 実行時間で割った値(FLOPS FLoating point OPeration per

    Second) Green500のランキング指標 • FLOPSを消費電力で割った値(FLOPS/W) • TOP500にランクインしたシステムに限る(重要!!) TOP500: 速いスパコンが勝つ Green500: ある程度速く、その上で省エネなスパコンが勝つ TOP500/Green500
  6. 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の計算内容
  7. 18 MN-Coreの演算・転送の種類(再掲) 行列演算器 (MAU) 整数演算器 (IALU) MAB-L1B間転送 L1B-L2B間転送 DRAM L2B-DRAM-PDM間転送

    ホストメモリ MN-Core-ホスト間転送 MN-Core DirectConnect (ICT) MN-Core-MN-Core間転送 演算だけでなく全ての階層・メモ リ間の転送を明示的にユーザー が記述する
  8. 22 演算と行交換のオーバーラップ L D U D L L D U

    D L まず左端の行交換 左端の演算をしながら 次の行交換 L D U D L 以降も同様に重ねる 行交換は演算器を使わないのでUの計算や更新と並行動作可
  9. 23 行列積周辺の演算と通信のオーバーラップ 柱転送 行交換 行列更新 <2020/06> <2021/06> <2021/11> 行交換と行列更新のみ オーバーラップ

    柱転送と行交換を オーバーラップ 行交換1回分の時間削減 さらに行列更新を オーバーラップ 行列更新1回分の時間削減 <初期段階の実装>
  10. 26 SRAMと比べてFFは… • Pros. ◦ リーク電流・貫通電流を抑え、低消費電力 • Cons. ◦ トランジスタ数が増えてしまい、回路面積的に不利

    MN-Core内部の記憶領域にはSRAMを使うもの(LMなど)とFFを使うもの (T regなど)がそれぞれあり、行列積の実装時にはFFを積極的に使用 SRAMの代わりにFFを使う
  11. 27 自然に書いた命令でのMN-Coreの動作 行列演算器 (MAU) 整数演算器 (ALU) DRAM ホストメモリ MN-Core DirectConnect

    何もしていないときは 自然に回路が止まる 命令を工夫しないと 動いてしまう!!!
  12. 29 命令を弄って回路を止める省電力化 記憶領域 GRF LM0 LM1 T MAU ALU L1B

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

    L1BM GRF LM0 LM1 T x4 0 enable enable この回路を止められないことが問題! チップを作った時点ではこのような 省電力化を想定していなかった
  14. 31 回路を止める代わりに0を参照させる 記憶領域 GRF LM0 LM1 T=0 MAU ALU L1B

    L1BM GRF LM0 LM1 T x4 0 enable enable 行 列 積 で 使 用 L1B方向の転送がないときは Tレジスタを参照させる Tレジスタを行列積で使わ ないようにした上で、 あらかじめ0を書いておく
  15. 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 姫野ベンチマークの行列
  16. 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でのレイアウト
  17. 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
  18. 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
  19. 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の書き戻しで使用
  20. 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の書き戻しで使用
  21. 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ボード性能
  22. 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ボード性能
  23. 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 →既存システムで問題 サイズを落として性能 が出るわけではない