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

问题描述 投票:1回答:1

在问题Why is it faster to process a sorted array than an unsorted array?中,答案与分支预测有关,对随机顺序数据不利,而对分类数据不利。但事实是数据是相同的,只是顺序不同。

这让我感到困惑,我几乎以为预测可以编译进来。它要么总是假设为真,要么总是假设为假,但显然是动态的。由于它是动态的,它如何知道要进行预测?缓存中是否有数据?我听说过代码执行缓存和ram缓存,cpu缓存中是否有数据?只有L1吗?

分支预测如何精确地调整其预测,其数据在何处做出动态决策呢?

cpu
1个回答
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的模式,并且正在遍历是否为大写字母,如果使用此简单的预测,那么除[C0 ] 过渡。如果数据为aA,那么您将一直出错。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.