【问题标题】:What is the overhead of using Intel Last Branch Record?使用 Intel Last Branch Record 的开销是多少?
【发布时间】:2013-01-18 04:46:36
【问题描述】:

Last Branch Record 是指寄存器对 (MSR) 的集合,这些寄存器对 (MSR) 存储与最近执行的分支相关的源地址和目标地址。 http://css.csail.mit.edu/6.858/2012/readings/ia32/ia32-3b.pdf 文档有更多信息,如果您有兴趣。

  • a) 有人能说明 LBR 会在多大程度上减慢常见程序的程序执行速度 - CPU 和 IO 密集型?
  • b) 当 LBR 跟踪开启时,分支预测是否会关闭?

【问题讨论】:

  • 您将如何使用英特尔 LBR?我认为,LBR 的开销对于记录来说很小,并且预测没有关闭。
  • 我只是在程序开始时启用 LBR 并在结束时禁用它。我也认为开销应该相对较小,至少与软件工具相比是这样。但是,如果存在一些关于开销的官方文档会很有帮助。
  • 官方文档唯一的地方是intel.com/content/www/us/en/processors/…

标签: x86 intel trace branch-prediction intel-pmu


【解决方案1】:

论文Intel Code Execution Trace Resources(Arium 工作人员、Craig Pedersen 和 Jeff Acampora,2012 年 4 月 29 日)列出了分支跟踪的三种变体:

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

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

  • 架构事件跟踪 (AET) 从 XDP 端口捕获并存储 在外部连接的 In-Target Probe 中。

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

BTS 允许捕获多对分支“From”和“To”,并将它们存储在缓存(Cache-as-RAM,CAR)或系统 DRAM 中。在 CAR 的情况下,跟踪深度/长度受缓存大小(以及一些常数)的限制; DRAM 走线长度几乎是无限的。该论文估计,由于额外的内存存储,BTS 的开销从 20% 到 100% 不等。 Linux 上的 BTS 很容易使用建议的 perf branch record(还没有原版)或 btrax projectperf branch 演示文稿提供了一些关于 BTS 组织的提示:有 BTS 缓冲区,其中包含“from”、“to”字段和“predicted flag”。因此,使用 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 上都可用 架构。它的优点是可以在板外存储跟踪数据。

【讨论】:

  • 感谢论文分享和重点总结!
【解决方案2】:

这是一个老问题(也有老答案),但它确实出现在今天的搜索中。

在 2021 年,您希望用于硬件跟踪的是英特尔® 处理器跟踪 (IPT)。
请记住,问题显然与 Intel/AMD 台式机 CPU 有关。 AFAIK 有类似的 ARM CPU 解决方案,此处未介绍。

我在 Windows 中使用自定义驱动程序同时使用了 LBR 和 IPT 设置,而后者是迄今为止开销最少的。某处在两位数或更少的百分比明智的减速进行过程跟踪。

也在回答中说:

LBR 没有开销,..

在技术上是正确的,但说起来不切实际,因为实际读取存储寄存器时会产生开销。通常,您会将其设置为在每个分支记录上中断。因此,我们正在讨论为每个通过陷阱/单步标志激活线程的单个分支(调用、jmp、jcc、int 等)指令处理中断/异常/陷阱的开销。

IPT 的最大缺点是仅在 Intel CPU 上可用,而 LBR 功能也由 AMD CPU 支持。

不幸的是,AFAIK(上次我检查过)IPT 功能尚不被任何商业 VM 软件支持。这意味着您很可能只能在直接硬件上进行 IPT 会话。除非您真的想在 VM 中进行跟踪,否则这没什么大不了的。就此而言,LBR 可能具有相同的限制。

某些 Linux 具有对 IPT 的本机内核支持。 Windows 的一个很好的起点是 Alex Ionescu 的 WinIPT 项目:
https://ionescu007.github.io/winipt/

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2017-09-27
    • 1970-01-01
    • 2015-09-18
    • 2014-10-18
    相关资源
    最近更新 更多