「2ビット予測子」は2つのもののいずれかを指している可能性がありますが、どちらかが他のものよりもはるかに可能性が高い.
4 つのエントリしかない分岐テーブルを意味する可能性は低いため、特定の分岐をテーブル内のエントリに関連付けるために 2 ビットが使用されます。4 エントリのテーブルは非常に小さいため、多くの分岐が同じテーブル エントリを共有するため、分岐予測子は静的分岐予測よりもはるかに正確ではありません (たとえば、後方分岐が行われると常に予測します。通常、ループを形成するために使用されます)。
より類似した可能性は、分岐が行われる可能性が高いかどうかを示すために 2 ビットを使用することです。分岐予測機能を備えた初期のマイクロプロセッサ (Pentium、PowerPC 604 など) の一部は、おおよそこの方法で動作していました。基本的な考え方は、2 ビットの飽和カウンターを保持し、その現在の状態に基づいて予測を行うというものです。インテルは、これらの状態を強く取らない、弱く取らない、弱く取られる、強く取られると呼びました。これらには (たとえば) 0、1、2、3 の番号が付けられるため、2 ビット カウンターを使用して状態を追跡できます。分岐が行われるたびに、(すでに 3 でない限り) 数値を増やし、分岐が行われないたびに (再び、すでに 0 でない限り) 数値を減らします。カウンターが 0 または 1 の場合に分岐を予測する必要がある場合、分岐が行われないと予測します。.
各分岐に使用される個別の予測エントリは、プログラム内の各分岐命令が分岐予測テーブルに独自のエントリを持つことを意味します。別の方法として、分岐命令からテーブル エントリへの何らかのマッピングがあります。たとえば、2 20エントリのテーブルがある場合、分岐命令のアドレスから 20 ビットを使用し、それらのビットをテーブルへのインデックスとして使用できます。32 ビットのアドレス指定と 32 ビットの命令を備えたマシンを想定すると、テーブル内の任意の 1 つのエントリにマップできる最大 1024 の分岐命令があることになります (32-20-2 = 10、2 10 = 1024)。実際には、少数の命令のみが分岐であり、アドレス空間の一部がデータに使用されるなどと予想されるため、テーブル内の 1 つのエントリにマップされる分岐はおそらくわずかです。
何を求めているかという基本的な質問に関しては、2 つの分岐が分岐予測テーブルの同じスロットにマップされた場合に、それぞれがマップされた場合よりも(偶然にも)より正確に予測される一連の分岐命令が必要です。テーブルの別のスロット。もう少し詳しく説明するために (ただし、パズル全体を明らかにしないことをお勧めします)、分岐予測子が通常間違っている分岐のパターンから始めます。予測子が基本的に行うことは、分岐が前回行われた場合、今回も行われる可能性が高いことを示していると仮定することです (逆に、前回行われなかった場合は、今回も行われない可能性があります)。 )。
したがって、それとは正反対の枝のパターンから始めます。次に、分岐予測テーブルの同じ場所に 2 番目の分岐マッピングを追加します。これは、分岐予測テーブルのデータを調整して、前の分岐ではなく次の分岐をより正確に反映する分岐のパターンに従います。 .
1技術的には、Pentium は実際にはこのように動作しませんでしたが、動作するように文書化されており、おそらく動作するように意図されていました。それが実際にどのように機能したかの不一致はバグだったようです。