英特尔性能监视器 - 以任何方式监控每个进程?

时间:2012-05-17 23:41:22

标签: c performance winapi performancecounter intel-pmu

如何使用Intel Performance Counter监视器监视特定进程的执行(即分支跟踪存储中的分支),同时过滤掉其他进程的信息?

2 个答案:

答案 0 :(得分:2)

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

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

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

如果你想知道没有执行代码的痕迹,但你想知道程序的统计数据(执行了多少指令;分支预测得多好;这里有多少间接分支...),你应该使用性能监控事件又名“基于精确事件的抽样“(PEBS)。英特尔Vtune做到了这一点;应该有一些其他工具,甚至是英特尔PBS your linked。唯一的问题(使用免费工具这有点困难)是找到你想要的事件的名称。基于指令执行的事件总是绑定到某个线程。

基于事件的采样意味着什么:您可以设置一些限制,例如:某些事件为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,但即使对于桑迪来说也是如此。

答案 1 :(得分:1)

我们被迫建立自己的仪器分析器,直接读取MSR以获取此信息。 Performance Counter Monitor的源代码演示了如何构建读取它们的内核驱动程序。

之前我们使用过VTune,但在我们的应用程序上运行时崩溃了。 (当我们在Linux版本上尝试OProfile时,它实际上崩溃了整个内核并迫使我们重启机器,这非常有趣。)