最近,我发现实际上perf(或pprof)可以在反编译视图中显示在没有实际花费这段时间的行附近的指令时序。实际花费这段时间的真正指令是它之前的指令。我知道这是由于CPU中指令流水线而发生的模糊解释。但是,我想找出以下内容:
- 是否有更详细的解释?
- 是否在perf或pprof文档中有记录?我没有找到任何参考资料。
- 是否有一种方法可以获取正确放置的时序?
最近,我发现实际上perf(或pprof)可以在反编译视图中显示在没有实际花费这段时间的行附近的指令时序。实际花费这段时间的真正指令是它之前的指令。我知道这是由于CPU中指令流水线而发生的模糊解释。但是,我想找出以下内容:
perf
通过使用CPU硬件性能计数器来记录事件,当计数器归零或达到阈值时,可以将其置于记录模式。这可能会引发中断或在内存缓冲区中写入事件(使用PEBS精确事件)。事件将包括CPU选择与事件关联的代码地址(即引发中断的点),即使对于像 cycles
这样的事件,也不像 instructions
一样固有地具有特定的指令相关联。当计数器溢出时,乱序执行后端可以有几百个指令正在运行,但必须为任何给定的样本选择一个指令。通常情况下,CPU“责怪”等待慢速产生结果的指令,而不是生成它的指令,尤其是缓存未命中加载操作。在某些情况下,比实际花费时间的指令要晚被责怪,可能有不同的原因,特别是对于异步发生的不核心事件。(例如uncore events)perf record -e cycles
或者ref_cycles
基本上可以做到这一点,并且你可以使用perf选项手动配置阈值;你不需要安装自己的中断处理程序。但是出于好奇,抱歉我不知道具体在哪里查找。 - Peter Cordes
div
这样的指令非常缓慢,但可以完全与其他指令重叠,我们应该怎么办?我们应该报告div
是缓慢的还是免费的?如果一条指令因为只能在关键路径上的另一条指令之后执行而被严重延迟,我们该怎么办?如果这个指令包括一个延迟的内存访问,又该怎么办? - Jérôme Richard