BOOMにはBranch Tag(brtag)というのが採用されており、これが一般的なのかは分からないが、どういう機構で動いているのか調査することにした。
Branch Tagはその名の通り分岐命令に対して付与されるタグで、このタグに応じてRenameMapのスナップショットが取られ、分岐予測に失敗した場合にはそのスナップショットから即時リネームIDが復帰される仕組みになっている。
The Rename Stage — RISCV-BOOM documentation
On every branch (or JALR), the Rename Map Tables are snapshotted to allow single-cycle recovery on a branch misprediction.
その様子を観察する。まずはDhrystoneを動かした。RenameMap中にスナップショットを保持するためのFFが確保されている。分岐命令がデコードされると、新たにBranchTagが割り当てられ、その時の最新のRenameMapの値がスナップショットされる。
実際に分岐命令の実行を行い、その結果が予想と異なる場合、分岐予測が外れたことになる。これはRenameMapに即時伝えられ、すぐさまRenameMapがスナップショットに基づいて元に戻される。
つまり、これだけ早くリスタートができるということになるのか?これがフェッチ側にどのように影響しているのか引き続き調査する。