開発日記

Erlangをダラダラ書きます。

分岐予測

分岐予測

  1. 条件分岐が成立するか不成立化を予測

  2. 分岐先のアドレスを予測

分岐先アドレスの予測

分岐先アドレスキャッシュ(BTAC,BTB)

  • BTACは,分岐先アドレスの予測値を与えてくれる

  • 命令アドレスをインデックスとしてアクセスするキャッシュ

  • 命令が条件分岐命令である & 条件分岐がTaken → 分岐先アドレスを記録

  • 分岐予測と並行してBTACにアクセスし,分岐命令の実行までに,得たアドレスを次の命令アドレスとして命令フェッチを開始

注意①:レジスタの内容を分岐先アドレスとする場合は,分岐先は可変.しかし一般的にプログラム中の条件分岐命令の分岐先は命令アドレスからのオフセットで記述されている.よってBTACを書き換える必要性はない.覚えておこう!

注意②:BTACのエントリ数には限りがある.キャッシュラインの競合で追い出されることや,注意①のようにレジスタ間接分岐(レジスタに格納された値が分岐先となる)の場合は分岐先アドレスを書き換える必要がある.覚えておこう!

注意③:BTACにアクセスすると常に何らかのアドレスが出る.タグマッチを行わないと無駄な命令フェッチが多くなる.条件分岐命令アドレスの上位24ビットをタグとしてBTACに記録しておき,タグマッチを行なってヒットした場合のみ命令フェッチに進むようにするケースが多い.また,上位アドレス全てを用いる必要はない.

注意④:レジスタ間接分岐の場合は,レジスタを読まないと分岐先のアドレスがわからないので,デコード時点では分岐予測は難しい.レジスタ間接分岐が使われる典型的なケースは,関数呼び出し.関数の呼び出し時に特定のアドレス(rd)にCall命令の次の命令を記録しておくケース.(一般的には,レジスタ間接ではなく関数呼び出し時の戻りアドレスはスタックにプッシュして記録することが多い.)

参考文献