关于性能:Intel CPUs指令队列提供静态分支预测?

Intel CPUs Instruction Queue provides static branch prediction?

在Intel手册第3卷中,它包含硬件事件计数器的说明:

BACLEAR_FORCE_IQ

Counts number of times a BACLEAR was forced by the Instruction Queue.
The IQ is also responsible for providing conditional branch prediction
direction based on a static scheme and dynamic data provided by the L2
Branch Prediction Unit. If the conditional branch target is not found
in the Target Array and the IQ predicts that the branch is taken, then
the IQ will force the Branch Address Calculator to issue a BACLEAR.
Each BACLEAR asserted by the BAC generates approximately an 8 cycle
bubble in the instruction fetch pipeline.

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

有人能确认上述哪一项是正确的吗?我什么都找不到。


If the conditional branch target is not found in the Target Array

怎么找不到?您用一个位掩码将其屏蔽,以在表中查找索引并获取下一个分支目标。

好吧,如果您在阅读了结果之后,检查调用地址是否与结果上的标记不匹配,您将得到一个"未执行"的结果。

在这一点上,我们将讨论语句的第二部分。

and the IQ predicts that the branch is taken

所以分支目标说"不采取",而智商预测它将采取,我们有一个矛盾。

为了解决这一矛盾,智商作为分支目标的胜算仅仅是"如果我们跳,我们跳到这里",但是智商根据更多的逻辑来预测我们是否跳。

因此

then the IQ will force the Branch Address Calculator to issue a
BACLEAR. Each BACLEAR asserted by the BAC generates approximately an 8
cycle bubble in the instruction fetch pipeline.

这在14-19级管道中很好。8个周期是如果iq可以从指令中读取实际目标地址(与PC结合),如果需要在寄存器中读取该值(这可能还没有失效),则可能需要更长的时间。


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

BPU首先猜测分支指令最可能位于(将要)获取的指令流字节中的位置(在Haswell中,每个周期32个字节,是获取单元宽度的两倍)。然后,基于被预测为控制传输指令的指令的虚拟指令地址,BPU查询其缓冲区(特别是"分支目标缓冲区"或"目标数组"),以对预测的分支(方向和目标地址)进行更多的预测。但是,在某些情况下,BPU会在其缓冲区中丢失,或者它可能会预测不到分支指令在指令流字节中的位置,或者分支可能比BPU可以处理的多。不管是什么情况,不管做什么预测,它们都会与指令流字节一起传递到指令队列单元。这是管道中最早的位置,在这里可以知道每个指令的开始和结束位置,以及哪些指令可以转移控制权。

The IQ is also responsible for providing conditional branch prediction
direction based on a static scheme and dynamic data provided by the L2
Branch Prediction Unit.

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

If the conditional branch target is not found in the Target Array and
the IQ predicts that the branch is taken...

简单静态分支预测器仅在BPU无法进行预测时使用。所以条件的第一部分是有意义的。第二部分,但是,基本上说,如果智商预测没有采取,那么什么都不需要做。这表示在BPU失败时,默认情况下提取单元将继续从贯穿路径中提取代码。

...then the IQ will force the Branch Address Calculator to issue a
BACLEAR

所以如果采用静态预测,那么最好做些什么。一个直观的事情是刷新高于智商的所有东西,并告诉获取单元停止获取字节。这就是"双耳"信号的作用。这种情况被称为前端重新定位。如果我们能告诉提取单元从哪里提取数据,那就太好了,但是我们还不知道分支目标地址。即使地址嵌入指令中(作为直接操作数),IQ也可能不只是提取它并转发到提取单元。我们可以什么都不做,等到地址计算出来,从而潜在地节省电力和能源。或者我们可以向BPU提供地址(现在我们已经知道分支指令的确切位置了),然后让BPU再试一次。也许,"分支地址计算器"的目的,不仅是发送回清除信号,而且尽可能早地确定地址。

Each BACLEAR asserted by the BAC generates approximately an 8 cycle
bubble in the instruction fetch pipeline.

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

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

我认为BAC用于处理任何分支预测失误的情况,而不仅仅是IQ。其他性能事件表明。