X86 分支预测器单元的输入?

X86 分支预测器单元的输入?,x86,cpu,cpu-architecture,branch-prediction,X86,Cpu,Cpu Architecture,Branch Prediction,我在这里看幻灯片13: (应显示Haswell的大型方框图) 顶部有一个称为“分支预测器”的块,有两个箭头。我有点不确定这里流程的正确顺序是什么?首先,“分支预测器”块没有任何输入 有人能试着解释一下(使用图表)分支预测器是如何与其他元素交互的吗 此外,分支目标(预测器)缓冲区将与图中的哪些元素进行接口?分支预测器上箭头所指的两个(橙色和紫色)是否相同 英特尔对其分支预测器的细节并不特别关注。引用Agner Fog(2013-09-04版):“分支预测器似乎在哈斯韦尔重新设计,但对其结构知之甚

我在这里看幻灯片13:

(应显示Haswell的大型方框图)

顶部有一个称为“分支预测器”的块,有两个箭头。我有点不确定这里流程的正确顺序是什么?首先,“分支预测器”块没有任何输入

有人能试着解释一下(使用图表)分支预测器是如何与其他元素交互的吗


此外,分支目标(预测器)缓冲区将与图中的哪些元素进行接口?分支预测器上箭头所指的两个(橙色和紫色)是否相同

英特尔对其分支预测器的细节并不特别关注。引用Agner Fog(2013-09-04版):“分支预测器似乎在哈斯韦尔重新设计,但对其结构知之甚少。”

很可能使用全局历史字符串(例如,一位表示最后N个分支已采取/未采取)或路径历史(类似于全局历史字符串,但通常使用指令地址散列)来寻址一个或多个分支预测表,可能使用指令地址。这可能与gshare预测值有点相似,但比gshare预测值更复杂。(可以把这个历史看作是分支预测器的一部分,而不是作为输入。)< /P> 指令地址也可能用于索引分支目标缓冲区(可能与另一个表一起用于间接调用和跳转,这可能会使用一些全局历史信息)。指令地址也可能用于预测任何分支的性质(分支标识),以便使用适当的目标预测器。分支识别对于使用特殊预测(如函数返回目标)的情况尤为重要


对于分支类型、目标或分支方向的任何预测失误,随后在管道中导出的正确信息将传递给预测器。(这可能有助于确认正确的预测。)对于普通分支和跳转,可以在前端(分支条件评估之前)计算目标,以纠正所采取案例的目标预测失误。类似地,在指令解码后可以修复分支错误识别。对于间接控制流的分支方向或目标预测失误,可以从管道的后面提供正确的信息。

它有14亿个晶体管,我很确定图表没有显示整个连接。假设分支预测器将从执行单元(用于正确的分支分辨率更新和间接分支的地址)和解码单元(用于直接地址)获取输入是合理的。谢谢你的第二句话。分支目标缓冲区如何与图相适应?它将与哪些单位进行互动?无论是谁做了演示,都没有对图像来源做出正确的归因(有些可以从IDF的演示中辨认出来)。我们讨论的是David Kanter(图5)中的图5。我认为Intel披露了返回堆栈缓冲区(RSB)的存在,请参阅。其余部分确实很模糊,但这里有一个有趣的(即使有点旧)回顾-@lee或者Agner Fog的参考工作也是x86分支预测器信息的良好来源(并提供了一些关于分支预测的一般信息)。注意:这个答案是CommunityWiki,所以您可以做出任何适当的改进。我的测试表明它可能使用了路径历史哈希或类似的东西。基本上如果你有一个嵌套的循环,比如:
outer:mov-rax,rcx;内部:dec rax,jnz内部;不。。。;dec rbx,jnz outer
,您会发现,根据内部和外部跳转之间的NOP数量,内部循环退出的预测成功率从100%到0%不等。在这两种情况下,全局历史应该是相同的,我认为BTB不能解释它(因为它应该至少有两种方式),所以(对我来说)历史哈希中似乎使用了跳转地址。