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

10

我想要测量我的C++代码中某些部分的L1、L2和L3缓存命中/失效率。我不想在整个应用程序中使用Perf。可以将Perf作为库在C++中使用吗?

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

我试用了Intel PCM,但是我遇到了两个问题。第一,它给出了一些奇怪的数字。第二,它不支持L1缓存分析。

如果Perf无法实现,那么获取该信息的最简单方法是什么?

2个回答

3
听起来你只是想读取一些性能计数器,这正是PAPI库的理想应用场景。 示例。 支持的计数器完整列表相当长,但听起来你最感兴趣的是PAPI_L1_TCMPAPI_L1_TCA及其L2L3对应项。请注意,您还可以将访问分解为读取/写入,并区分指令和数据高速缓存。

3
是的,有特殊的每个线程监控功能,可以在用户空间内读取性能计数器。请参考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]));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接