2

我将如何使用英特尔性能计数器监视器监视特定进程的执行(即,其分支,来自分支跟踪存储),同时过滤掉其他进程的信息?

4

2 回答 2

2

您应该知道 BTS(分支跟踪存储)和性能监控事件/计数器(在 CPU 内部,它的 PMU 块)是非常不同的东西。

分支跟踪存储是 CPU 的功能,它在内存的特殊区域中记录每个采用的分支(eip 对 - 分支指令的第一个和分支目标的第二个;每对还添加一个标志字)。其结果非常类似于单步执行代码块(基本块)的记录顺序。这就像在编译器的帮助下进行代码覆盖一样,每个分支都由编译器检测。

BTS 只是 MSR_DEBUGCTLA MSR 中的一点点(它是 intel x86 寄存器);我几乎可以肯定这个寄存器是线程特定的(就像在 Linux 中一样),所以你不需要挂钩调度程序。有一些在 Windows 中使用此 MSR 的示例;但使用了不同的位。另外,不要忘记正确设置 DS_AREA。因此,如果您真的想要 BTS,请复制一份Intel Arch 手册(第 3b 卷,“调试和性能监控”部分,“19.7.8 分支跟踪存储 (BTS)”部分)并手动对 BTS 进行编程。最难的部分是处理 DS 区域溢出(您需要自定义中断处理程序)。

如果您想知道的不是执行代码的痕迹,而是程序的统计信息(执行了多少指令;分支预测的好坏;这里有多少间接分支......),您应该使用性能监控事件,也就是“基于精确事件采样”(PEBS)。英特尔 Vtune 做到了这一点;应该还有其他一些工具,甚至是您链接的 Intel PBS。唯一的问题(这对于免费工具来说有点困难)是找到你想要的事件的名称。基于指令执行的事件总是绑定到某个线程。

基于事件的采样是什么意思:您可以为某些事件设置一些限制,例如 1000,例如。BR_INST_EXEC.COND(“执行的条件近分支指令数”)或 BR_INST_EXEC.DIRECT(“所有无条件近分支指令,不包括调用和间接分支。”),一次最多 2-4 个事件。然后 CPU 将统计与该事件相对应的每一种情况。当出现第 1000 个情况时,将生成事件(中断)用于指示 EIP。通过抽样,您可以轻松获得代码行为的详细统计信息。如果您将限制设置为非常低的值,并且如果您不为 eip 汇总事件,您将获得跟踪;)

使用 PEBS,您可以知道 CPU 的代码有多糟糕,错误预测的分支位于何处,哪些指令等待来自缓存的数据等。有 100 多个事件(第 3b 卷的附录 A)。

PS有一些BTS/win的代码:http: //blog.csdn.net/quincy_hu/article/details/4053163

PPS 有 PMU 编程的简短概述,包括 PEBS 和 BTS。software.intel.com/file/30320 它适用于 Nehalem,但即使对于 Sandy 也可能是真实的。

于 2012-05-18T00:26:24.750 回答
1

We were forced to build our own instrumenting profiler that reads the MSRs directly to get this information. The Performance Counter Monitor's source code demonstrates how to build a kernel driver that reads them.

Previously we used VTune, but it crashes when run on our app. (When we tried OProfile on the Linux version, it actually crashed the entire kernel and forced us to power-cycle the machine, which was pretty funny.)

于 2012-05-18T00:32:22.103 回答