分岐予測
分岐予測の高速性と予測性能はトレードオフの関係にあり、両立のために2つの分岐予測器を持つことがある。1つめの分岐予測器は高速かつ単純である。2つめの分岐予測器は低速で複雑であり、大きなテーブルを使用し、1つめの分岐予測器が間違っていればそれを上書きして訂正する。
Alpha 21264 とEV8コアは、高速な(1サイクル動作の)次ライン分岐予測を実施している。しかし次ライン分岐予測は大雑把であり、命令単位での予測はコストが高くつく。そこでこれらのプロセッサでは2サイクルかかる別の分岐予測機構を用意し、次ライン分岐予測の結果を上書きするようになっている。これによって最悪でも1命令だけフェッチした命令を捨てるだけでよくなり、性能が向上する。4命令以上を同時にフェッチすると、複数の分岐命令が含まれる可能性がある。そのため、上書きに際しては次の命令が分岐するかしないかを予測する必要がある。通常、分岐命令を評価して分岐アドレスを求める。
Intel Core i7 は2つの分岐ターゲットバッファを持ち、2つかそれ以上の分岐予測器を備えている。
2回目には常に分岐する条件分岐(例えばポインタがNULLかどうかで分岐し、NULLならリソースを確保し、さもなくば単にポインタの指すリソースにアクセスするという場合)や他の規則的に繰り返すパターンを持つ条件分岐は、飽和カウンターだけではうまく予測できない。2レベル適応型分岐予測 (two-level adaptive branch prediction) は、各条件分岐命令の過去 n 回の履歴を記憶しておき、2 ある履歴パターンそれぞれに飽和カウンターを対応させる。図3がその概念図である。
n = 2 の場合を例として考えてみよう。過去2回の分岐命令実行の際に分岐したか否かを2ビットのシフトレジスタに格納する。この分岐履歴レジスタは二進法で4種類の異なる値、00、01、10、11 のいずれかの値となる。ここで、0 は「分岐せず」、1 は「分岐した」を意味する。パターン履歴テーブルは4エントリで、各エントリのインデックスが 2 = 4 種類のパターンのいずれかと対応している。パターン履歴テーブルの各エントリの中身は図2で示したような2ビット飽和カウンターである。ある分岐命令の履歴が 00 なら、パターン履歴テーブルの最初のカウンターを使用する。