c - 英特尔性能监视器——有什么方法可以监视每个进程吗?

标签 c performance winapi performancecounter intel-pmu

我将如何使用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/

相关文章:

C 字符串文字

sql - Spark SQL查询与DataFrame函数

c++ - 在不改变值(value)、性能的情况下多次访问位域?

c++ - boost.process 批处理脚本无法运行另一个程序

c++ - 在任何地方绘制一个类似系统的光标,最顶层

c - 这些关于指针的陈述是否具有相同的效果?

c - 阅读操作系统的好资源

delphi - 可以在 Delphi 控制台应用程序中创建热键吗?

c - 如何通过 C 预处理器 (cpp) 生成列表?

javascript - 如何提高reactjs在移动端的初始渲染性能?