是否有可能在C ++代码中使用Linux Perf分析器?

我想测量一些C ++代码的L1,L2和L3 Cache命中率。 我没有兴趣使用Perf为我的整个应用程序。 Perf可以用作C ++库吗?

int main() { ... ... start_profiling() // The part I'm interested in ... end_profiling() ... ... } 

我给了英特尔PCM一个镜头,但是我有两个问题。 首先,它给了我一些奇怪的数字 。 其次,它不支持L1caching分析。

如果Perf不可能,那么得到这些信息最简单的方法是什么?

听起来你所要做的只是读取一些性能指标,这是PAPI库理想的选择。

例。

受支持的计数器的完整列表是相当长的,但是听起来像您对PAPI_L1_TCMPAPI_L1_TCA以及它们的L2L3对应物最感兴趣。 请注意,您还可以将访问分解为读取/写入,并且可以区分指令和数据高速缓存。

是的,每个线程都有特殊的监控,允许从用户空间读取性能计数器。 请参阅perf_event_open(2)手册页

由于perf仅支持L1i,L1d和最后一级缓存事件,因此您需要使用PERF_EVENT_RAW模式,并将手动数字用于CPU。

要实现一个分析,你需要设置sample_intervalpoll / select fd或者等待SIGIO信号,当它发生时,从它读取样本和指令指针。 你可能会尝试使用像GDB这样的调试器来解析返回的函数名的指针指针。


另一种选择是使用SystemTap 。 您将需要执行start|end_profiling()空实现,只是为了启用SystemTap分析类似的东西:

 global traceme, prof; probe process("/path/to/your/executable").function("start_profiling") { traceme = 1; } probe process("/path/to/your/executable").function("end_profiling") { traceme = 0; } probe perf.type(4).config(/* RAW value of perf event */).sample(10000) { prof[usymname(uaddr())] <<< 1; } probe end { foreach([sym+] in prof) { printf("%16s %d\n", sym, @count(prof[sym])); } }