使用英特尔最后分支记录的开销是多少?

use*_*617 10 x86 intel branch-prediction

最后一个分支记录是指寄存器对(MSR)的集合,它存储与最近执行的分支相关的源和目标地址.http://css.csail.mit.edu/6.858/2012/readings/ia32/ia32-3b.pdf文档提供了更多信息,以备您感兴趣.

  • a)有人可以知道LBR会减慢程序执行程序执行的程度 - CPU和IO密集型吗?
  • b)当LBR跟踪开启时,是否将分支预测关闭?

osg*_*sgx 10

本文英特尔执行代码遗迹资源(由Arium工人,克雷格·彼得森和杰夫·阿坎波拉,2012年4月29日)列出了分支跟踪的三个变种:

  • DebugCtlMSR中的最后一个分支记录(LBR)标志以及相应的LastBranchToIP和LastBranchFromIP MSR以及LastExceptionToIP和LastExceptionFromIP MSR.

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

  • 架构事件跟踪(AET)从XDP端口捕获并存储在连接的目标内探测器中.

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

BTS允许捕获许多分支"From"和"To",并将它们存储在缓存(Cache-as-RAM,CAR)或系统DRAM中.在CAR的情况下,跟踪深度/长度受高速缓存大小(和一些常数)的限制; 具有DRAM走线长度几乎是无限的.由于额外的内存存储,本文估计BTS的开销从20%到100%.Linux上的BTS易于使用建议的perf分支记录(尚未在vanilla中)或btrax项目.perf branch演示文稿给出了一些关于BTS组织的提示:有BTS缓冲区,其中包含"from","to"字段和"预测标志".因此,使用BTS时不会关闭分支预测.此外,当BTS缓冲区填满最大大小时,会产生中断.内核中的BTS处理模块(perf_events子系统或btrax内核模块)应该在发生此类中断时将数据从BTS缓冲区复制到其他位置.

因此,在BTS模式下,有两个开销源:缓存/存储器存储和来自BTS缓冲区溢出的中断.

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

Paper的"摘要"说:

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

BTS更深入,但对CPU性能有影响,需要板载RAM.CAR初始化后即可获得跟踪数据.

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