我将如何使用Intel Performance Counter来监视特定进程的执行(即来自分支跟踪存储的其分支)监控,同时过滤掉其他进程的信息?
最佳答案
您应该知道 BTS(分支跟踪存储)和性能监控事件/计数器(CPU 内部,其 PMU block )是非常不同的东西。
分支跟踪存储是 CPU 的功能,它在内存的特殊区域中记录每个采用的分支(成对的 eip - 第一个分支指令和第二个分支目标;每对中还添加一个标志字) 。它的结果很像单步执行并记录执行代码块(基本 block )的顺序。这就像在编译器的帮助下进行代码覆盖一样,每个分支都由编译器检测。
BTS只是MSR_DEBUGCTLA MSR中的一个位(它是intel x86寄存器);我几乎可以肯定这个寄存器是线程特定的(就像在 Linux 中一样),所以你不需要 Hook 调度程序。有some examples在 Windows 中使用此 MSR;但使用了不同的位。另外,不要忘记正确设置 DS_AREA。因此,如果您确实想要 BTS,请复制 Intel Arch Manual (第 3b 卷,“调试和性能监控”部分,“19.7.8 分支跟踪存储(BTS)”部分)并手动对 BTS 进行编程。最难的部分是处理 DS 区域溢出(您需要自定义中断处理程序)。
如果您想知道的不是执行代码的跟踪,而是程序的统计信息(执行了多少指令;分支预测得如何;这里有多少间接分支......),您应该使用性能监控事件,又名“基于事件的精确采样”(PEBS)。英特尔 Vtune 就是这么做的;应该还有一些其他工具,甚至是 Intel PBS your linked 。唯一的问题(使用免费工具会更困难)是找到您想要的事件的名称。基于指令执行的事件总是绑定(bind)到某个线程。
基于事件的采样是什么意思:您可以设置一些限制,例如某些事件为 1000,例如。 BR_INST_EXEC.COND(“条件数 执行的近分支指令”)或 BR_INST_EXEC.DIRECT(“所有无条件近分支指令,不包括调用和间接分支。”),一次最多 2-4 个事件。然后 CPU 会统计与该事件对应的每个情况。当有第 1000 种情况下,将为指令 EIP 生成事件(中断)。通过采样,很容易获得代码行为的详细统计数据。如果您将限制设置为非常低的值,并且不会对 eip 的事件求和,则将得到踪迹;)
通过 PEBS,您可以知道您的代码对 CPU 的影响有多大、错误预测的分支位于何处、哪些指令等待缓存中的数据等。有数百个事件(第 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 来说也可以是实际的。
关于c - 英特尔性能监视器——有什么方法可以监视每个进程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644919/