Matrix Multiplication on FPGA with the RISC-V Vector Extension
Luffcaでは、RISC-Vベクトル拡張(Vector Extention)のVicunaをFPGAボードに実装し、行列積カーネルの性能を評価しました。
関連記事は、こちら。
- Running Auto-Vectorized Program on RISC-V Vector RTL Simulator
- Matrix Multiplication based on the RISC-V Vector Extension
- 1×1 Convolution based on the RISC-V Vector Extension
- Matrix Multiplication on FPGA with the RISC-V Vector Extension(本記事)
Vicuna
Vicunaは、SystemVerilogで記述された32-bit integer vector coprocessorです。具体的には、8, 16, 32-bit整数だけをサポートし、64-bit整数や浮動小数点数のサポートを必要としないRISC-Vベクトル拡張のZve32x
に準拠してしています。ただし、記事執筆時点では除算系の命令が欠けています。
Vicunaはコプロセッサのため、メインプロセッサのIbexまたはCV32E40Xを必要とします。
FPGA with Vicuna
今回は、Digilent社のFPGAボードのNexys Video用ゲートウェアを作成しました。
Nexys Video用ゲートウェアの主な仕様は、以下の通りです。
- Processor
- メインプロセッサ: Ibex
- コプロセッサ: Vicuna
- VLEN(ベクトルレジスタのビット長): 512-bit
- 乗算器のビット長: 256-bit
- ISA: RV32IMCV
- 動作周波数: 100 MHz
- SRAM: 256 KiB
- UART: 1 ch
Matrix Multiplication on FPGA with Vicuna
行列積のリファレンス・カーネルには、以下のコードを使用しました。
// C = AB with A = [M x K], B = [K x N], C = [M x N] void imatmul_ref(const int M, const int N, const int K, const int32_t* A, const int32_t* B, int32_t* C) { int i, j, k; int32_t sum; for (i = 0; i < M; ++i) { for (j = 0; j < N; ++j) { sum = 0; for (k = 0; k < K; ++k) { sum += A[i * K + k] * B[k * N + j]; } C[i * N + j] = sum; } } }
他の記事と同じように行列AとBの成分はint8_t
に設定していたのですが、Vicunaのvsext.vf2
の結果が正しくなかったためint32_t
に変更しています。調査すると、GitHubにissueが上がっていました。
上のアイキャッチ画像が、Vicunaの性能を表しています。
正方行列のサイズ(M=N=K)が32、64、128の場合、RISC-Vベクトル拡張に基づく行列積カーネルのPerformance [OP/cycle]は、それぞれ5.865、6.544、6.913であり、リファレンス・カーネルと比較して、39〜45倍のスピードアップを実現しています。
まとめ
Luffcaでは、RISC-Vベクトル拡張のZve32x
に準拠したVicunaをFPGAボードに実装し、行列積カーネルの性能を評価しました。