【发布时间】:2014-12-03 17:51:47
【问题描述】:
是否可以使用 perf 仅收集程序执行部分的硬件计数器统计信息?如果有,怎么做?
likwid 提供了能够定义命名区域的功能,但如果这在只安装 perf 的系统上是可能的,那就太好了。
之前的一些问题已经返回了相关答案,但还是有一些不足:
- Using probe 我得到了同样的错误,我使用的是一个稍新的内核(3.13)。这些修复程序是否在更新的版本中可用?
- Using perf_event_open 我想保持在命令行上定义事件的灵活性。我还查看了 perf stat itself 的代码,但它似乎没有通过调用 perf_event_open 进行设置。
【问题讨论】:
-
是的,您可以使用 perf_event_open 来完成。 perf stat 确实调用它(run_perf_stat → __run_perf_stat → create_perf_stat_counter → perf_evsel__open_per_thread → __perf_evsel__open)。
-
Perf 没有库可以将计数器集成到程序中或在程序中定义区域(它只是最近才获得普通的 JIT 代理接口 lwn.net/Articles/633846 优于
/tmp/perf-$pid.map文件)。您可以尝试使用诸如libpfm4 或PAPI(可能使用libpfm4)之类的库来从您的程序中计算硬件性能。他们会为您编写 perf_event_open,libpfm4 也有事件名称表,并且有一些编程方法可以使用 env vars/cmdline args 来指定事件名称。