【问题标题】:Profiling instruction cache misses分析指令缓存未命中
【发布时间】:2015-08-27 14:39:20
【问题描述】:

我想在我的代码中为每个非内联函数f() 构建指令缓存惩罚的直方图。因此,如果我的代码中总共有 k 个非内联函数,我想要 k 个单独的直方图。我想知道是否有任何已知的解决方案。

对于任何一个特定函数f1(),一种简单的方法是在代码中查找对f1() 的所有调用,在调用之前记录一个时间戳值,并在f1() 的开头记录一个时间戳,构建差异的直方图。它需要添加 (n+1) 行新代码,其中 n 是调用 f1() 的次数。

我基本上想要这个简单解决方案的可扩展版本。

【问题讨论】:

    标签: c++ caching


    【解决方案1】:

    根据您的操作系统和处理器,可以使用更精确的解决方案。如果您使用的是 linux,请使用 perf_events。它为 PMU 事件提供了一个很好的接口。您可以使用它来获取 icache-misses 的准确计数,并对这些事件的堆栈快照进行采样,以找出 icache-misses 发生的位置。

    【讨论】:

    • 我使用过 perf,但据我所知,它只报告一个 icache-miss 计数值。将该计数中的增量归因于特定函数似乎并非易事。
    • 尝试perf record -e <your event name> --call-graph dwarf,如果您使用的是足够新的内核。如果没有,您需要使用--call-graph fp 并在不忽略帧指针的情况下构建您的应用程序。例如,如果您使用 gcc,编译器选项将为 -fno-omit-frame-pointer
    • 还没有机会尝试,但会在我尝试时报告。看起来很有希望
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2017-10-03
    • 2012-12-07
    • 1970-01-01
    • 2017-01-14
    • 2021-01-20
    相关资源
    最近更新 更多