我的问题是它们如何在现代CPU架构中共存和协同工作?
你把它稍微颠倒了。在每次取指令时,你都要索引到你的分支预测器中,它会告诉你刚刚收到的指令是否会被解码成一个执行分支。如果没有,你取下一个连续的地址。但是如果你的分支预测器说这将是一个被采用的分支,你不知道下一个要取哪个指令,因为你还没有解码这个指令。因此,为了不浪费等待分支解析的周期,可以使用分支目标缓冲区(或BTB)。BTB存储分支重定向控制流的先前地址。使用这种机制,您试图预测这次控制流将被重定向到哪里。当与返回地址堆栈配对时,这种技术对于无条件分支、函数调用和返回具有100%的成功率。在条件分支上,成功率稍微低一些,但是考虑到分支目标的高时间局部性,这仍然是非常好的。例如,您可以考虑一个循环的向后分支,它总是分支到相同的位置。
实际解析分支指令时(通常在管道的解码或执行阶段,具体取决于实现),您将调整分支预测器和BTB中的值,以便为将来的预测提供更多最新信息。
以下是BTB查找和更新如何发生的图解:
http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html
我目前正在查看CPU管道中可以检测分支错误预测的各个部分。我发现这些是: 分支目标缓冲区(BPU CLEAR) 分支地址计算器(BA CLEAR) 跳转执行单元(不确定此处的信号名称??) 我知道2和3检测到什么,但我不知道BTB中检测到什么预测失误。BAC检测BTB错误地预测了非分支指令的分支,BTB未能检测到分支,或者BTB错误预测了x86 RET指令的目标地址。执行单元评估分支并确定它是否正
如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么
分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?
编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B
我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要
我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但是只有这么远的时间才能带我,这让我想知道不同类型的分支。 在 c 中,固定目标的条件分支: 并且(如果我正确理解这个问题),无条件分支到变量目标: 是否存在性能差异?在我看来,如果这两种方法中的一种明显快于另一种,编译器只需将代码转换为匹配即可。 对于那些分支预测非常