如何找到导致 l3 停滞的具体功能?

How can I find the specific function causing l3 stalls?

提问人:ajp 提问时间:11/16/2023 最后编辑:ajp 更新时间:11/16/2023 访问量:30

问:

我正在优化一个程序(在 Rust 中)。在一个小的测试输入中,我看到程序运行得相对较快,并且几乎没有时间在缓存未命中上停滞不前。(在 linux 上使用)perf

          cycle_activity.stalls_l1d_miss:      50,833,346
           cycle_activity.stalls_l3_miss:       9,958,752
                                  cycles:   3,850,988,364
                            instructions:   9,563,267,270

在大输入上,我发现程序运行速度要慢得多,并且花费大量时间在缓存未命中上。(请注意,指令计数几乎相同。

          cycle_activity.stalls_l1d_miss:   2,142,605,809
           cycle_activity.stalls_l3_miss:   1,845,486,382
                                  cycles:   6,097,683,006
                            instructions:   9,357,073,844

对于那些在 l3 访问上停滞不前的大约周期,我想知道我的代码中的哪些访问导致了它们,以任何可能的粒度(函数/指令指针/调用堆栈)。就源代码而言,我知道我怀疑可能有贡献的几个位置,但我不知道如何弄清楚到底是哪个是问题所在。我怎样才能找到这个?是否可以使用 ,也许使用 PEBS?我应该使用其他工具(例如 valgrind)吗?2,000,000,000perf

请注意,我尝试过使用 + ,但查看顶部的慢速指令并没有给我答案,而且它混合了所有慢速来源(例如分支),而在这里我想专门关注 l3 停滞。perf recordperf report

另请注意,我的程序有大量的安装代码,如果可能的话,我想从分析中排除这些代码。

蚀分析 性能

评论

1赞 Peter Cordes 11/16/2023
您是否尝试过在经常因 L3 未命中而停滞的函数中记录样本?您可以在 以外的事件上。perf record -e cycle_activity.stalls_l3_missperf recordcycles
0赞 ajp 11/16/2023
这似乎可以解决问题!你碰巧知道这个过滤方面在哪里记录吗?我没有看到它在:(man perf record
1赞 Peter Cordes 11/16/2023
它不是“过滤”,而是记录一个完全不同的事件,而不是默认事件(我认为在英特尔上映射到或类似的东西)。 / 是手册页中记录的第一个选项。man7.org/linux/man-pages/man1/perf-record.1.html .事件名称与 一起使用的事件名称相同。 显示硬件上的可用事件。cyclescpu_clk_unhalted.thread-e--eventperf stat -eperf list

答: 暂无答案