X86 分支预测-有关目标预测和使用PC的问题

X86 分支预测-有关目标预测和使用PC的问题,x86,hardware,computer-architecture,branch-prediction,X86,Hardware,Computer Architecture,Branch Prediction,因此,我了解了流水线处理器分支预测中使用的基本技术,如2位饱和计数器、两级自适应预测器等 以下是我的问题: 1) 分支目标预测:为什么这很重要?这里使用的一些机制是什么?当我想到一个分支时,我会想到“bner2,r3,LABEL”,它说如果r2!=r3然后分支到标签,这意味着do PC(程序计数器)=PC+标签。在这里预测目标有什么神秘之处?您知道它将基于LABEL的编译值。 不知怎么的,我可能没有抓住要点 2) 为什么程序计数器值本身(例如0x4001000C)或至少其最后几位被用作分支预测方

因此,我了解了流水线处理器分支预测中使用的基本技术,如2位饱和计数器、两级自适应预测器等

以下是我的问题:

1) 分支目标预测:为什么这很重要?这里使用的一些机制是什么?当我想到一个分支时,我会想到“bner2,r3,LABEL”,它说如果r2!=r3然后分支到标签,这意味着do PC(程序计数器)=PC+标签。在这里预测目标有什么神秘之处?您知道它将基于LABEL的编译值。 不知怎么的,我可能没有抓住要点

2) 为什么程序计数器值本身(例如0x4001000C)或至少其最后几位被用作分支预测方案的一部分?我看到一个方案,PC的最后4位连接到(4位)分支历史寄存器,8位值用于访问模式历史表。 我认为电脑是相当随意的

感谢您为理解这些问题提供的帮助

在这里预测目标有什么神秘之处?您知道它将基于LABEL的编译值

由于CPU管道深度和缓存延迟,在获取指令、对其进行完全解码以识别分支目标和能够获取该指令之间需要许多周期。因此,您可以预测目标,以便抢先获取下一条指令

为什么程序计数器值本身(例如0x4001000C)或至少其最后几位被用作分支预测方案的一部分


因为PC可以唯一地识别特定的分支指令!您还打算如何为分支预测表编制索引?

添加更多颜色

1) 分支目标预测与您给出的示例不同。它对于虚拟函数和计算分支(switch语句等)更为重要。在这两种情况下,分支目标在编译时都是未知的。在虚拟函数的情况下,它必须从内存位置(虚拟函数表)加载,在switch语句的情况下,它通常通过在表中查找分支偏移量来完成。即使虚函数是无条件的,它仍然大量使用BTB

2) 基本上有两类预测值,一类是全局预测值,另一类是每个地址的预测值。全局预测器的优点是能够处理更长的模式历史(已采取/未采取的历史)。每个地址预测器的优点是能够特定于某些分支位置,但通常具有较短的历史记录(因为它们是每个地址的,因此占用大量空间)。许多处理器使用通常称为锦标赛分支预测器的方法,其中既有全局预测器又有每个地址的预测器,然后有一个预测器(置信度估计器)来选择期望给出更好答案的预测器