rbt*_*rht 5 performance assembly cpu-architecture perf
最近,我发现实际上 perf (或 pprof)可能会在反汇编视图指令时序中显示在实际上没有花费这个时间的行附近。真正的指令,实际上花了这个时间,就在它之前。我知道一个模糊的解释,这是由于 CPU 中的指令流水线造成的。不过,我想了解以下内容:
(快速而不是非常详细的答案;如果有人想写一个更详细的答案会更好)。
perf仅使用 CPU 自己的硬件性能计数器,可以将其置于一种模式,当计数器向下计数到零或向上计数到阈值时,它们会记录事件。
引发中断或将事件写入内存中的缓冲区(使用 PEBS 精确事件)。该事件将包括 CPU 选择与该事件关联的代码地址(即引发中断的点),即使对于类似的事件本身cycles并不instructions具有关联的特定指令。当计数器结束时,无序执行后端可以有数百条正在运行的指令,但必须为任何给定的样本准确地选择一条。
一般来说,CPU“责怪”正在等待缓慢生成结果的指令,而不是生成结果的指令,尤其是缓存未命中加载。
有关 Intel x86 CPU 的示例,请参阅为什么执行指针追踪时该跳转指令如此昂贵? 这似乎还取决于在引发中断时让 ROB 中的最后一条指令退出的效果。(英特尔 CPU 至少看起来确实做到了这一点;即使指令可能很慢,对于确保向前推进也是有意义的。)
一般来说,当责备较晚的指令而不是实际花费时间的指令时,可能会出现“偏差”,可能有不同的原因。(也许特别是对于非核心事件,因为它们与核心时钟异步发生。)
其他相关的问答以及有趣的例子或其他事情