【发布时间】:2015-11-30 20:26:55
【问题描述】:
例如,我有一个大型线性函数(1 个基本块,~1000 条指令) 这被调用了很多次。在摆弄了一些编译器选项之后,我得到了 Cortex-A57 的性能意外下降了 10%。估计是由于 有点不同的指令调度。我想调查问题 更深入地找出哪些指令组合导致不必要的流水线 摊位。但我不知道我怎么能做到这一点。我想,我需要一个非常详细的 执行跟踪以了解发生了什么,尽管我不确定是否是 有可能得到这样的踪迹。
所以,问题是:我可以使用什么工具来调查这种低级别 性能问题?如何确定阻止 CPU 执行的原因 每个周期的最大指令数?
PS 我最感兴趣的是 Cortex-A57 内核,但我会很感激有用 有关任何其他核心甚至不同架构的信息。
PPS 函数访问内存,但预计几乎所有内存
访问命中缓存。该假设由perf stat -e r42,r43 确认
(L1D_CACHE_REFILL_LD 和 L1D_CACHE_REFILL_ST 事件)。
【问题讨论】:
-
您几乎已经回答了自己的问题 - 使用 perf 研究 microarchitectural PMU events 确实是最有用的事情之一。了解 A57,这可能是代码对齐方式的细微变化,使分支预测器的条件不理想。
-
PMU 有时可以说出问题所在,但 AFAIK 无法说出问题所在。此外,A57 的 PMU 事件列表比 A53 短得多。我希望 A57 支持“可归因的性能影响事件”,但似乎不支持。
-
您只修改了编译器选项吗?或者您是否对代码进行了任何更改?
-
无代码更改。事实上,在这两种情况下,所提到的功能都由相同数量的相同指令组成。唯一的区别是指令顺序、使用的寄存器和地址。
标签: performance arm cpu cpu-usage cpu-architecture