Intel CPUs指令队列提供静态分支预测?

时间:2015-07-26 23:12:22

标签: performance assembly x86 cpu-architecture branch-prediction

在“英特尔手册”第3卷中,它包含硬件事件计数器的说明:

  

BACLEAR_FORCE_IQ

     

计算指令队列强制BACLEAR的次数。    IQ还负责提供条件分支预测   方向基于L2提供的静态方案和动态数据   分支预测单位。如果未找到条件分支目标   然后,在目标数组和IQ预测分支被采用   IQ将强制分支地址计算器发出BACLEAR。   BAC声明的每个BACLEAR产生大约8个周期   指令获取管道中的气泡。

我一直认为分支地址计算器执行静态预测算法(当分支目标缓冲区不包含分支条目时)?

任何人都可以确认以上哪两项是正确的吗?我找不到任何东西。

2 个答案:

答案 0 :(得分:3)

  

如果在目标数组中找不到条件分支目标

怎么找不到?你用一个掩码掩码它来找到表中的索引并得到下一个分支目标。

如果您在阅读结果后检查调用地址与结果上的标记不匹配,那么您有"未采取"结果

此时我们进入声明的第二部分。

  

并且IQ预测分支被采取

所以分支目标说"没有采取"而智商预测我们会有矛盾。

为了解决IQ赢得的矛盾,因为分支目标只是"如果我们跳,我们跳到这里",但IQ预测我们是否跳过或不基于更多的逻辑。

因此

  

然后IQ会强制分支地址计算器发出一个   BACLEAR。 BAC声明的每个BACLEAR产生大约8个   指令获取管道中的循环气泡。

在14-19阶段的管道中哪个好。如果IQ可以从指令(与PC结合)读取实际目标地址,则8个周期,如果需要在寄存器中读取该值(可能尚未退出),则可能需要更长的时间。

答案 1 :(得分:1)

是。现代英特尔处理器使用至少一种静态预测技术和至少一种动态预测技术(例如性能事件描述中提到的L2 BPU)。英特尔优化手册中讨论了静态预测,但没有明确说明静态预测的确切位置。但是,与分支预测相关的多个性能事件的描述(例如BACLEAR_FORCE_IQ)表明它是在IQ单元中实现的。我认为这是静态分支预测最有意义的地方。

BPU首先猜测分支指令最有可能位于(将)获取的指令流字节中(Haswell中每个周期32个字节,获取单元宽度的两倍)。然后,基于预测为控制传输指令的指令的虚拟指令地址,BPU查询其缓冲区(具体地,“分支目标缓冲区”或“目标阵列”)。 ),对预测的分支(方向和目标地址)做出更多预测。但是,在某些情况下,BPU在其缓冲区中未命中,或者可能错误地预测了指令流字节中的分支指令的位置,或者可能存在比BPU可以处理的分支更多的分支。无论情况如何,无论做出什么预测,它们都会以指令流字节传递给指令队列单元。这是管道中最早的地方,每个指令的开始和结束位置以及哪些指令可以转移控制。

  

IQ还负责提供条件分支预测   基于静态方案和L2提供的动态数据的方向   分支预测单位。

此部分事件描述现在对您有意义。请注意,静态分支预测主要仅用于预测方向,而不是目标地址。

  

如果在目标阵列中找不到条件分支目标   IQ预测分支被采用......

简单静态分支预测器仅在BPU无法进行预测时使用。所以条件的第一部分是有道理的。然而,第二部分基本上说,如果IQ预测没有采取,那么就不需要做任何事了。这表示默认情况下,获取单元将继续从BPU故障的直通路径中获取代码。

  

...然后IQ会强制分支地址计算器发出一个   BACLEAR

因此,如果静态预测器预测到了,那么最好对此做些什么。一个直观的事情是刷新IQ之上的所有内容并告诉获取单元停止获取字节。这就是BACLEAR信号的作用。这种情况称为前端转发。如果我们可以告诉获取单元从何处获取,那将是很好的,但我们还不知道分支目标地址。即使地址嵌入在指令中(作为立即操作数),IQ也可能不是仅提取它并转发到获取单元。我们可以什么都不做,等到计算地址,从而可能节省电力和能源。或者我们可以为BPU提供地址(现在我们确切地知道分支指令的位置)并让BPU再次尝试。也许,“分支地址计算器”的目的不仅是发送BACLEAR信号,而且还尽可能早地确定地址。

  

BAC声明的每个BACLEAR产生大约8个周期   指令获取管道中的气泡。

我不清楚8周期泡沫占什么。一种可能的解释是,由BACLEAR引起的刷新大约需要8个周期,但是获取单元可能仍然处于空闲状态,等待它应该从中获取的地址。确定目标地址可能需要8个以上的周期,具体取决于计算方式和周围代码。或者它可能意味着,平均而言,完全重新转发前端并开始从目标地址获取只需要大约8个周期。此外,这8个周期的惩罚可能实际上并不在关键路径上,因此它可能不会影响整体性能。

总之,当条件分支(并且只有条件分支)在BPU中丢失(而不是任何其他BPU故障)并且IQ预测时,会发生BACLEAR_FORCE_IQ

我认为BAC用于处理任何分支错误预测情况,而不仅仅是IQ。其他表演事件表明了这一点。