下一行预测分支目标预测器如何工作?

时间:2012-10-11 19:19:45

标签: cpu

在问题Why is it faster to process a sorted array than an unsorted array?中,答案与分支预测对随机顺序数据不好以及对排序数据有好处有关。但事情是数据是一样的,只是顺序不同。

令我困惑的是,我几乎认为预测是编译进来的。它要么总是假设为假,要么总是假设是假的,但显然是动态的。由于它的动态如何知道预测哪个?某个地方的缓存中是否有数据?我听说过代码执行缓存和ram缓存,cpu缓存中是否有数据?它只是L1吗?

分支预测究竟如何调整其预测,其数据在何处进行动态决策呢?

1 个答案:

答案 0 :(得分:0)

您要提出的问题与分支目标的预测有关,但是在此特定示例中并没有起作用。唯一的区别是分支是否被采用。

在这种情况下,代码可以归结为:

if (data[c] >= 128)
  sum += data;

在循环中,因此在汇编中它看起来像:

cmp rsi, 128
jl loop ;this is the one being predicted
add eax, rsi
j loop

在小于跳跃的情况下,分支预测器必须猜测是要再次进入循环的起点还是失败。如果操作正确,则代码将运行得更快,因为指令队列将得到良好的填充,而不会在管道中产生气泡或停顿。

按照天气预报的原则(明天的天气将与今天的天气大致相同),如果CPU能够记住上次走的路,它将更快。您可以将其视为单个布尔值,该值存储在CPU的实现中,该值记录上一次是否这样做,并再次进行猜测。在每次跳(或不跳)之后,该值将在下一次更新。

如果您有一个aaaaAAAA模式,并且正在反复研究是否为大写字母,那么如果使用这种简单的预测,那么除了aA过渡。如果数据为aAaAaAaA,那么您总是会出错。

因此,数据模式会导致已采用/未采用记录接近发生的情况或未发生的情况。在这种情况下,如果对数据进行排序,则所有较小的值都将在数据的开头,因此分支预测器将在正确预测中取得良好的成功。如果您具有随机数据,则分支预测变量将不太有用。

现代分支预测器要复杂得多;所以这是一个简单的看法。但是,如果您将分支预测状态视为分支预测器逻辑中包含在存储单元中的单个布尔值,则表示取用/未取取布尔值。