0%

Superscalar CPU Design - 3 - Branch Prediction

概述

分支预测器的输入为当前指令的 PC 值即指令地址,根据该地址,一方面分支预测器本身预测该指令是否跳转,另一方面 BTB (Branch Target Buffer) 中保存了各个 PC 值对应的“上次跳转地址”,如果 BTB hit 且预测跳转,则跳转,否则不跳转。这样处理不需要实际根据该指令的值来判断该指令是否是分支指令,因为如果不是分支指令,一定不会写 BTB,访问 BTB 时一定会 miss,就不会发生跳转。同时这样也不需要获取 iCache 结果,可以和 iCache 取指令的过程并行进行。

分支预测器的实现

在分支预测器的表示中,跳转即为预测结果被接受即 Taken (T),不跳转则为不被接受 Not Taken (N)。

2-Bit Last Time Predict

这种 2BC 预测器可以理解为一个四状态的状态机,强T,弱T,弱N,强N。前两个预测结果为 T,后两个结果 N,每次实际结果为 T 时向左转移,为 N 时向右转移。一般以弱T为初始值。

一般来说,不同的分支指令应当用不同的预测器来存储结果,因此如果对每个指令保存一个 2BC,构成的一张“表”就是 Pattern History Table (PHT)。

全局历史预测

设置一个 x 位寄存器,记录所有指令中最近的 x 次跳转指令的实际结果,并根据这个寄存器的值和当前 PC 值拼接(或 xor,或其他计算)的结果作为地址去在一个 PHT 中去寻找结果(以及更新结果)

局部历史预测

设置一张大表格,对于每个 PC 都存储一个 x 位的局部历史,再根据局部历史去寻址一个局部历史对应的 PHT。

混合预测

同时使用全局预测和局部预测,再设置一个利用全局历史寄存器寻址的 PHT 来预测要选择局部的还是全局的预测结果。

(其实可能没必要,要实现同时结合局部与全局信息的话,按局部历史结果、全局历史结果和 PC 值共同寻址 PHT 即可。

TAGE

相对复杂。

TAGE