自作RISC-V32IMインオーダプロセッサ 煌
半年前くらいから自作プロセッサをほそぼそと開発していたが,インオーダパイプラインプロセッサとしては割と高性能だと思うものができたので簡単に紹介していく.
大まかな特徴
RISC-V32IM準拠
これに関してはそのまま.RISC-V32IMの内,システム系の命令以外を実装している.プロセッサ上でlinuxとか動かすんだったら考える必要があるが,そこまでは考えてないのでやってない.
5段パイプライン
以下のブロック図のような命令フェッチ,デコード,実行,メモリアクセス,レジスタ書き込みの5段ステージ構成となっている.
それぞれのステージのストールやフラッシュの制御信号を作るのはControllerモジュールが中央集権的に行っている.
強めの分岐予測器
強めと言っても商用プロセッサクラスの強さではなく,個人開発レベルでは強めかなくらいの気持ち.グローバル2レベル適応型分岐予測器とBTBによる分岐先予測を実装している.効果については後述.
グローバル2レベル適応型とは,プログラム全体の分岐履歴と,予測したい命令のプログラムカウンタを合わせたインデックスを持つテーブルに2bit飽和カウンタが並べられているもの. この構成にすることで,どの命令についての予測か・過去の系列がどのようなものだったかという2つを混ぜた予測ができる.
評価
CoreMarkによる評価
DIGILENT社製NEXYS VIDEOボード用に合成し,100MHzで動かした結果が下である.
2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 1310801051 Total time (secs): 13 Iterations/Sec : 230 Iterations : 3000 Compiler version : GCC9.2.0 Compiler flags : Memory location : STACK seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xcc42 Correct operation validated. See readme.txt for run and reporting rules.
CoreMark/MHzは2.3とインオーダとしては結構いいんじゃないかと思う.ちなみに最近発表されたBOOMのV3は6とか7とかだったような気がするのでアウトオブオーダプロセッサには手も足も出ない感じ.
分岐予測器の性能
本当はベンチマークとして何を使うかも重要なんだろうが,入手してないのでCoreMarkを1イテレーションだけ走らせたものをVivado上で10ms実行してみたときの性能で評価する.
実装 | 分岐予測精度 | 制御ストール発生頻度 | ミス率 | Takenミス率 | NotTakenミス率 |
---|---|---|---|---|---|
グローバル2bit飽和カウンタ | 59% | 7.5% | 55% | 58% | 47% |
グローバル2レベル適応型 | 94% | 0.5% | 44% | 51% | 11% |
非公式ベンチマークではあるが分岐予測精度は90%を超えた.ただ性能に直結するミス率は飽和カウンタに比べるとそこまで改善されていない.分岐先予測がボトルネックとなってTakenミス率の改善がないからだと考えられる.