前回までで、分岐予測の実装についておおよそ解説した。分岐予測は、
- 予測を早いステージで実行する。複数命令を同時に実行する場合は、どのウェイを有効にするかよく考えること
- 予測結果は分岐ユニットで判別する。無条件分岐命令でも、レジスタ相対ジャンプは常に予測成功となる訳ではないので注意すること
ということを注意する必要がある。
これらの考察をもとに、自作RISC-Vプロセッサに分岐予測を実装した。この効果を測定してみよう。
といっても、自作RISC-Vプロセッサは数ヶ月前から実装しているもので、分岐予測もここ数週間をかけて実装したものだ。すぐに出来たわけではなく、かなりバグも残っていると思うので、検証は継続して行う必要がある。
自作RISC-Vプロセッサで、Coremarkがとりあえず動作するようになってきた。そのうちgithubに公開しようと思うが、とりあえずは満足できる性能が出せるまではプライベートリポジトリで作業する。
ちなみに主なスペックは
- 4命令同時実行のスーパスカラ、アウトオブオーダ発行、インドーダ完了
- 1st Icache, Dcache搭載
- 整数命令のみ実装。32ビット幅。CSRなどは未実装、割り込みは未実装
と、命令実行幅のみやたらと広く、まだ基本的な部分の実装を全て終わらせることが出来ていない。 CSRとかちゃんと実装しないと、OSも立ち上げられない...
また、分岐予測もまともに実装できていない状態だったため、性能はかなり低いものだった。分岐予測を実装したことにより、どの程度性能が向上したかを見てみよう。
分岐予測の基本スペックは、単純な1段分岐で、これもまだ十分なものとは言えない。また分岐対象の命令は、
- 比較命令(相対ジャンプ)
- 即値ジャンプ命令 (JAL)
とした、JALRは命令のレジスタ相対ジャンプのため、予測が難しい。リターンスタックポインタとして利用されている状況が判別できれば、やりようはあるかもしれない。
サイクル数 | CMK/MHz | |
---|---|---|
分岐予測未実装 | 1110419 | 0.90 |
比較命令のみ分岐予測 | 702470 | 1.42 |
比較命令+即値命令の分岐予測 | 676250 | 1.48 |
比較命令および即値命令に対して分岐予測を実装したことにより、おおよそ50%の性能向上となった。
CPUの性能に詳しい人ならば直ぐに分かると思うが、この性能ではまったくのダメダメだ。BOOMの測定結果を見てみると、4-wayの実装にてCoremarkのスコアは4.0を軽く越えていたように思う。 最近のアウトオブオーダプロセッサならば、4.0は越えてあたり前なのだ。
IPC測定
一応現在の体力を把握するために、Coremarkを走らせた場合の1000サイクル毎のIPCを測定してグラフにしてみた。
だいたい0.4あたりに中央値がありそうだ。これはヒドい。
弱いところを見付けて、早急に改善しなければ。。。