X86 使用“英特尔上一个分支”记录的开销是多少?

X86 使用“英特尔上一个分支”记录的开销是多少?,x86,intel,branch-prediction,X86,Intel,Branch Prediction,最后一个分支记录是指寄存器对(MSR)的集合,这些寄存器对存储与最近执行的分支相关的源地址和目标地址。文档中有更多信息,以备您感兴趣 a) 有人能告诉我们LBR会在多大程度上降低CPU和IO密集型通用程序的执行速度吗 b) LBR跟踪打开时是否会关闭分支预测 该论文(由Arium workers、Craig Pedersen和Jeff Acampora于2012年4月29日撰写)列出了分支追踪的三种变体: 上一个分支记录(LBR)调试CTLMSR中的标志以及相应的LastBranchToIP

最后一个分支记录是指寄存器对(MSR)的集合,这些寄存器对存储与最近执行的分支相关的源地址和目标地址。文档中有更多信息,以备您感兴趣

  • a) 有人能告诉我们LBR会在多大程度上降低CPU和IO密集型通用程序的执行速度吗
  • b) LBR跟踪打开时是否会关闭分支预测
该论文(由Arium workers、Craig Pedersen和Jeff Acampora于2012年4月29日撰写)列出了分支追踪的三种变体:

  • 上一个分支记录(LBR)调试CTLMSR中的标志以及相应的LastBranchToIP和LastBranchFromIP MSR以及LastExceptionToIP和LastExceptionFromIP MSR

  • 分支跟踪存储(BTS)使用缓存作为RAM或系统DRAM

  • 体系结构事件跟踪(AET)从XDP端口捕获并存储 在外部连接的目标探头中

如第2页所述,LBR在MSR中保存信息,“不会妨碍任何实时性能”,但仅对非常短的代码有用(“有效的跟踪显示非常浅,通常可能只显示数百条指令”)。仅保存有关4-16个分支的信息

BTS允许捕获多对“从”和“到”分支,并将它们存储在缓存(缓存为RAM、CAR)或系统DRAM中。对于CAR,跟踪深度/长度受缓存大小(以及一些常量)的限制;使用DRAM时,跟踪长度几乎是无限的。本文估计由于额外的内存存储,基站的开销从20%到100%。Linux上的BTS很容易与建议的(还不是普通的)或
perf branch
presentation给出了一些关于BTS组织的提示:存在BTS缓冲区,其中包含“from”、“to”字段和“predicted flag”。因此,使用BTS时不会关闭分支预测。此外,当BTS缓冲区填充到最大大小时,会生成中断。内核中的BTS处理模块(perf_事件子系统或btrax内核模块)应在发生此类中断时将数据从BTS缓冲区复制到其他位置

因此,在BTS模式下,有两种开销来源:缓存/内存存储和BTS缓冲区溢出引起的中断

AET使用外部代理保存调试和跟踪数据。此代理通过扩展调试端口(XDP)连接,并与目标内探测器(ITP)接口。根据本文,AET的开销“会对系统性能产生显著影响,可能会大几个数量级”,因为AET可以生成/捕获更多类型的事件。但收集的数据存储在调试平台之外

论文的“摘要”说: 

LBR没有开销,但非常浅(4-16个分支位置,具体取决于 在CPU上)。跟踪数据在重置后立即可用

BTS更深入,但对CPU性能有影响,需要 车载RAM。一旦CAR初始化,跟踪数据就可用

AET需要特殊的ITP硬件,并非在所有CPU上都可用 架构。它的优点是将跟踪数据存储在板外


您将如何使用英特尔LBR?我认为,LBR的记录开销很小,预测功能也没有关闭。我只是在程序开始时启用LBR,然后在程序结束时禁用它。我也认为开销应该相对较小,至少与软件工具相比。但是,如果有一些关于管理费用的官方文件的话,这将是很有帮助的。官方文件的唯一地方是感谢分享论文和总结要点!