OpenMP on FPGA with RISC-V Multi-Core Processor
Luffcaでは、RISC-VマルチコアプロセッサをFPGAボードに実装し、OpenMPを用いた行列積カーネルの性能を評価しました。
関連記事は、こちら。
- Matrix Multiplication based on the RISC-V Vector Extension
- Tiny Matrix Extension using RISC-V Custom Instructions
- OpenMP on FPGA with RISC-V Multi-Core Processor(本記事)
OpenMP
OpenMP(Open Multi-Processing)は、多くのプラットフォーム、命令セット アーキテクチャ、およびオペレーティングシステムにおいて、C、C++、およびFortranの共有メモリ・マルチプロセッシング・プログラミングをサポートするAPI(application programming interface)です。
Matrix Multiplication
関連記事のMatrix Multiplication based on the RISC-V Vector ExtensionとTiny Matrix Extension using RISC-V Custom Instructionsでは、それぞれRISC-Vベクトル拡張とRISC-Vカスタム命令を用いて行列積カーネルを高速化しました。この記事では、OpenMPを用いて行列積カーネルを高速化します。
行列積カーネルは、M × Kの行列AとK × Nの行列Bから、その積であるM × Nの行列Cを計算します。リファレンスカーネルimatmul_ref
のコードは、以下のようになります。
// 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 int8_t* A, const int8_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; } } }
RISC-V Multi-core System
OpenMPを用いた行列積カーネルの性能評価には、以下に示すRISC-Vマルチコアシステムを実装したDigilent社のFPGAボードNexys Videoを使用しました。
- プロセッサ: 2018年のRISC-V SoftCPUコンテストで1位を獲得したVexRiscvのオクタコア
- ISA: RV32IMAFDC(RV32GC)
- 動作周波数: 100 MHz
- DRAM: 512 MiB
- OS: Linux
Matrix Multiplication using OpenMP on RISC-V Multi-core
アイキャッチ画像が、OpenMPを用いた行列積カーネルimatmul_opt
の性能を表しています。Performance [OP/cycle]は、10回のプログラム実行の平均を用いて算出しています。
小行列では、並列化に伴うオーバーヘッドが大きく並列化の効果が低いことから、正方行列のサイズ(M=N=K)が64未満の場合、行列積カーネルをシングルスレッドで動作させています。
正方行列のサイズが32、64、128の場合、リファレンスカーネルと比較して、それぞれ3.30倍、5.89倍、21.42倍のスピードアップを実現しました。
まとめ
Luffcaでは、RISC-VマルチコアプロセッサのオクタコアVexRiscvをFPGAボードに実装し、OpenMPを用いた行列積カーネルの性能を評価しました。