FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

MX: Enhancing RISC-V's Vector ISA for Ultra-Low Overhead, Energy-Efficient Matrix Multiplication の論文を読む

MX: Enhancing RISC-V's Vector ISA for Ultra-Low Overhead, Energy-Efficient Matrix Multiplication

本論文において、Dense Matrix Multiplication(MatMul)は、線形代数、デジタル信号処理(DSP)、グラフィックス、及び機械学習など、多岐にわたる計算集約的アプリケーションにおける最も普遍的な計算核の一つである。

故に、MatMulの最適化は、高性能プロセッサのみならず、組み込みの低電力プラットフォームにおいても、非常に重要な課題である。近年、複数の命令セットアーキテクチャ(ISA)は、マトリックスレジスタファイルとユニットを増設することにより、MatMulの性能と効率の向上を図っているが、これは追加のコストを要するものである。

本論文では、Matrix eXtension(MX)を提案している。これは、オープンソースのRISC-V Vector(RVV)ISAを基盤とし、MatMulのエネルギー効率を高めるための軽量な手法である。

MXは、高価な専用ハードウェアを追加するのではなく、既存のベクターレジスタファイルと機能ユニットを利用して、非常に小さな面積コスト(< 3%)でハイブリッドベクター/マトリックスエンジンを構築している。この僅かな面積コストは、データ再利用を高めるためのコンパクトな近接浮動小数点ユニット(FPU)タイルバッファに由来し、クロック周波数のオーバーヘッドは生じない。

MXは、高度にエネルギー最適化されたRVVプロセッサに実装され、12nmプロセス・ノードにおけるデュアルコア及び64コアクラスタで評価されている。評価の結果、デュアルコアにおいては、同一のFPU利用率(約97%)を維持しつつ、64×64×64の二重精度行列乗算におけるエネルギー効率が10%向上し、64コアクラスタにおいては、同一ベンチマークの32ビットデータで25%のエネルギー効率の向上と、56%の性能向上が観測されている。

論文の主要な成果は以下である:

  1. Matrix eXtension(MX)の提案:
    • MXは、RVV 1.0に基づく軽量で非破壊的なISA拡張である。メモリおよび計算操作を直接マトリックスに対応させ、アーキテクチャの電力消費を削減する。
    • 高価なベクトルレジスタファイル(VRF)へのアクセスを減少させることで、類似または優れた性能を維持しつつ、エネルギー効率を改善する。
    • 既存の演算リソースを再利用し、面積及びエネルギーのオーバーヘッドを最小化し、VRFアクセスの削減によるエネルギー効率の節約を実現する。
  2. 電力消費に対するISAの利点の理論的正当化:
    • マトリックス乗算カーネルの実行における高価なVRFアクセスを効果的に削減し、電力消費を低減する。
  3. 実装及び評価:
    • MXを、エネルギー効率の高いRVVベースのベクトルプロセッサSpatzに基づく制約されたデュアルコアクラスタと、64コアのMemPoolアーキテクチャに実装。
    • 12nmプロセスにおける性能、電力消費、及び面積(PPA)メトリクスへのMXの影響を詳細に分析。
    • 3%未満の面積オーバーヘッドで、最大56%の性能向上と25%のエネルギー効率向上を達成。

2. 解析

本節において、一般的な行列乗算(GEMM)問題のタイリングを、複数レベルのメモリ階層を通じて議論している。具体的には、メモリ、ベクトルレジスタファイル(VRF)、及び近接浮動小数点ユニット(FPU)バッファから構成されるメモリ階層を考慮している。この分析は、階層内の異なる数のレベルに容易に拡張可能である。

  1. タイリング問題

  2. 階層の下位レベルは、通常、入出力行列を一度に保持するには十分な大きさではない。従って、行列はチャンク(タイル)に分割され、ハードウェアは一度に一つの出力タイルで作業し、外積アルゴリズムが並列性を最大化するためによく使用される。

  3. 階層間で転送される要素の数は、パフォーマンスと電力消費の両方に影響を与え、行列がタイル化される方法に依存する。
  1. 総転送数

  2. 各階層ペア間の総転送数を取得するには、プログラム全体で計算される出力タイルおよびサブタイルの数を考慮する必要がある。

  3. 一般的なケースでは、入力$mk$, $nk$サイズのタイルを消費する前に、C(最初の反復)およびD(2番目の反復以降)タイルをメモリからロードし、$k$回の更新後にDタイルをメモリに戻す。VRFにおけるkタイル間のバッファリングがない場合、$mn$サイズの出力タイルをメモリからVRFにロードし、同じ量を保存する。

  4. 最適化

  5. Inter-k-buffering: 出力タイル(サブタイル)がVRF(バッファ)にバッファリングされ、全てのK(k)次元が渡過され、全出力タイル(サブタイル)が準備される場合、上記の方程式は簡略化できる。VRF内でバッファリングが行われる場合、𝐾/𝑘=1となる。

  6. Cタイルリセット: Cがゼロ行列の場合、それをメモリからロードするのを避け、VRFをゼロで初期化するか、バッファをリセットすることが可能である。inter-k-bufferingを使用し、VRFおよびバッファに対してゼロ初期化が適用される場合、行列C、Dに関連する方程式の第三項は、それぞれゼロになる。

この分析は、メモリ階層間でのデータの動きを最適化し、行列計算におけるパフォーマンスとエネルギー効率を向上させるための、具体的な方程式とアプローチを提供する。