英特尔CPU指令队列提供静态分支预测?

15

在Intel手册的第3卷中,它包含了一个硬件事件计数器的描述:

BACLEAR_FORCE_IQ

计算指令队列强制执行BACLEAR的次数。 IQ还负责根据静态方案和L2分支预测单元提供的动态数据提供条件分支预测方向。 如果在目标数组中没有找到条件分支目标并且IQ预测分支已经被采取,则IQ将强制分支地址计算器发出BACLEAR。 每个由BAC生成的BACLEAR在指令获取流水线中产生大约8个周期的气泡。

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

有人能否确认上述两种哪种是正确的? 我找不到任何东西。


1
我删除了我的回答,因为它并没有提供帮助。但是我注意到英特尔优化参考手册中写道:“英特尔酷睿微架构不使用静态预测启发式方法。然而,为了在 Intel 64 和 IA-32 处理器上保持一致性,软件应该将静态预测启发式方法作为默认设置。” - Gabriel Southern
2个回答

4
是的。现代Intel处理器使用至少一种静态预测技术和至少一种动态预测技术(例如性能事件描述中提到的L2 BPU)。静态预测在Intel优化手册中有讨论,但是它没有清楚地说明静态预测发生的确切位置。然而,与分支预测相关的多个性能事件的描述,例如“BACLEAR_FORCE_IQ”,表明它是在IQ单元中实现的。我认为这是静态分支预测最有意义的地方。
BPU首先猜测分支指令在(将要)获取的指令流字节中最可能出现的位置(在Haswell中每个周期32字节,是获取单元宽度的两倍)。然后,基于被预测为控制传输指令的指令的虚拟指令地址,BPU查询其缓冲区(特别是“分支目标缓冲区”或“目标数组”),以对预测的分支(方向和目标地址)进行更多预测。但是,在某些情况下,BPU会在其缓冲区中失误,或者可能会错误地预测分支指令在指令流字节中的位置,或者可能有更多的分支超出BPU的处理能力。无论情况如何,无论做出什么预测,它们都会与指令流字节一起传递到指令队列单元。这是管道中最早知道每个指令开始和结束以及哪些指令可能传输控制的地方。
IQ也负责基于静态方案和L2分支预测单元提供条件分支预测方向。这部分事件描述现在应该对您有意义了。请注意,静态分支预测大多只用于预测方向,而不是目标地址。
如果在目标数组中找不到条件分支目标,并且IQ预测分支被取出,则简单静态分支预测器只在BPU无法进行预测时使用。因此,条件的第一部分是有意义的。然而,第二部分基本上表示如果IQ预测为未取出,则不需要采取任何措施。这表明获取单元将在BPU失败的情况下默认继续从跟随路径获取代码。
然后,IQ将强制Branch Address Calculator发出BACLEAR。
如果静态预测器预测为taken,那么最好采取一些措施。一个直观的方法是清除IQ上方的所有内容,并告诉取指令单元停止获取字节。这就是BACLEAR信号的作用。这种情况称为前端重新定向。如果我们也能告诉取指令单元从哪里获取,那就更好了,但我们可能还不知道分支目标地址。即使地址嵌入在指令中(作为立即操作数),IQ也可能无法仅仅提取并转发给取指令单元。我们可以什么都不做,等待地址计算完成,从而潜在地节省功率和能量。或者,我们可以提供地址给BPU(现在我们确切地知道分支指令在哪里),让BPU再次尝试。也许,“分支地址计算器”的目的不仅是发送BACLEAR信号,还要尽早确定地址。
每个BAC由BAC生成的BACLEAR在指令获取流水线中引起大约8个周期的气泡,我不清楚这8个周期的气泡是怎么回事。一个可能的解释是,由BACLEAR引起的清除需要大约8个周期,但是取指令单元可能仍然处于空闲状态,等待应该获取的地址。确定目标地址可能需要超过8个周期,这取决于如何计算和周围代码。或者它可能意味着,在平均情况下,需要大约8个周期来完全重新定向前端并开始从目标地址获取。此外,这8个周期的惩罚实际上可能不在关键路径上,因此可能不会影响整体性能。
总之,BACLEAR_FORCE_IQ发生在条件分支(仅限条件分支)在BPU中未命中(而不是任何其他BPU故障)且IQ预测为taken时。
我认为BAC用于处理任何分支错误预测情况,而不仅仅是由IQ引起的。其他性能事件也表明了这一点。

状态预测器、BPU和IQ的理论基础是什么?当分支无法在BPU中找到时,IQ具有哪些信息可以使其比静态预测器更好地跟随? - Noah

3
如果条件分支目标在目标数组中找不到
如何找不到?您需要使用位掩码对其进行屏蔽,以查找表中的索引并获取下一个分支目标。
那么,如果在读取结果后检查调用地址是否与结果上的标签不匹配,则会出现“未采取”结果。
此时,我们进入语句的第二部分。
如果分支目标指示“未采取”,而IQ预测将采取该分支,则存在矛盾。
为了解决矛盾,IQ获胜,因为分支目标只是“如果我们跳转,我们跳到这里”,但是IQ基于更多逻辑预测是否跳转或不跳转。
因此,
那么IQ将强制Branch Address Calculator发出BACLEAR。 BAC发送的每个BACLEAR都会在指令获取流水线中生成大约8个周期的气泡。
这对于14-19级流水线来说是好的。如果IQ可以从指令(与PC相结合)中读取实际目标地址,则需要8个周期。如果需要在尚未退役的寄存器中读取值(可能是可能不久之后),则可能需要更长时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接