x86 - 使用 Intel Last Branch Record 的开销是多少?

标签 x86 intel trace branch-prediction intel-pmu

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

  • a) 有人可以了解 LBR 会减慢常见程序(CPU 和 IO 密集型程序)的程序执行速度吗?
  • b) 当 LBR 跟踪打开时,分支预测会关闭吗?

最佳答案

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

  • 最后分支记录 (LBR) 标志位于 DebugCtlMSR 和相应的 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 branch record (还没有 Vanilla )或 btrax projectperfbranch 演示给出了有关 BTS 组织的一些提示:有 BTS 缓冲区,其中包含“from”、“to”字段和“预测标志”。因此,使用 BTS 时不会关闭分支预测。此外,当 BTS 缓冲区填满最大大小时,会生成中断。内核中的 BTS 处理模块(perf_events 子系统或 btrax 内核模块)应将数据从 BTS 缓冲区复制到其他位置,以防发生此类中断。

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

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

论文的“摘要”说: 

LBR has no overhead, but is very shallow (4–16 branch locations, depending on the CPU). Trace data is available immediately out of reset.

BTS is much deeper, but has an impact on CPU performance and requires on-board RAM. Trace data is available as soon as CAR is initialized.

AET requires special ITP hardware and is not available on all CPU architectures. It has the advantage of storing the trace data off board.

关于x86 - 使用 Intel Last Branch Record 的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14670586/

相关文章:

assembly - 对汇编FLD指令m64fp感到困惑

linux - 等待用户输入而不回车,linux x86 汇编器

x86 - SSE 比较打包的无符号字节

loops - x86 程序集 : Loops!

multithreading - `xchg` 是否包含 `mfence` 假设没有非时间指令?

x86 - 写入和读取的持久内存缓存策略

assembly - 如何在不支持硬件的情况下测试 AVX-512 指令?

c# - 是否应使用 "if"语句保护 TraceSource?

c - 如何跟踪所有本地函数调用和退出,并将其记录到文件中以供查看

javascript - 使用 javascript 的 Ajax/XMLHttpRequest 跟踪