自作RISC-Vプロセッサの性能解析をしているのだが、パイプライントレースを解析していてまず気になったのは、分岐予測の結果が悪いことだ。
分岐予測では、即値による分岐、PC相対分岐をターゲットにしており、単純な分岐ではあるがそれなりにヒットするはずだった。 調査してみると、分岐予測バッファのエントリ数が極端に少ないため、分岐予測バッファが書き換えられ、分岐予測が行なわれていないことが分かった。
具体的には、現在は16x4エントリ分の分岐予測しか持っていない。さらに、4エントリを1ペアにして、4エントリ中は同一PCでしか予測できない構造になっているので、最悪の場合16エントリ分の予測しか持っていない。これは少ない!
まずは実装コストを度外視して、エントリ数を増やすことにより効果があるかどうかを確認する。
まずは16エントリの分岐予測バッファを、思い切って128エントリまで増やす。現在は実装の形式があまり合成に優しくない形式になっているので直す必要があるが、とりあえずシミュレーションで動けば良いので良しとする。
この結果、ある程度IPCの向上が見られた。つまり、分岐予測バッファのエントリ数はこれまで足りていなかったということだ。
前回までのグラフと重ねてみる。まだデバッグが完了していないので、途中でシミュレーションが落ちてしまっているが、灰色の「BRU Entry-4 & Pred-Buffer 128が比較的数値が高く、また全体のシミュレーション時間も若干前倒しになっているのが分かると思う。
ただし、これだけではまったく十分ではない。全体的に解析していて気になるのはやはりLoad-Useの遅さだ。この部分でストールが大量に発生してしまい、その結果全体のサイクル数が増大している。 1次キャッシュで、パイプラインをある程度埋めることは出来ているが、やはり問題になるのはロード命令から次の命令へのレイテンシだ。この辺りはどのようにして改善していこうかなあ。。。
2016/11/23 追記: いくつかバグを修正して最後までCoremarkを流れるようにした。Google Spreadsheetによりグラフをプロットしてみた。
- 分岐命令用命令RSエントリ=1, 分岐予測エントリ=16
- 分岐命令用命令RSエントリ=2, 分岐予測エントリ=16
- 分岐命令用命令RSエントリ=4, 分岐予測エントリ=128
分岐予測を追加したことにより、黄色のラインが若干上に上がっている。