是的。现代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引起的。其他性能事件也表明了这一点。