【问题标题】:perf stat gives different number of instruction for every runperf stat 为每次运行提供不同数量的指令
【发布时间】:2014-12-06 08:57:36
【问题描述】:

我对以下空程序进行了性能分析,

#include <stdio.h>
int main() {
}

编译并运行 perf stat ./a.out 后,我​​得到以下输出(以及其他数据,如周期数、任务时钟等):

418,869 instructions # 0.87 insns per cycle

在同一精灵的每次“性能”分析期间,指令数量都会发生变化。

我的实际需要是找到我写的特定函数中的指令数。所以我将从新程序中的指令数中减去上述数字。(我可以计算在 gcc 中使用 -S 标签创建的 program.s 中的行数,但在查看 perf 行为后我很困惑)

为什么指令的数量不一致,确切地说是不一样?

更新 我按照man page 中给出的示例在 C 中使用 perf_event_open()

【问题讨论】:

    标签: linux computer-architecture perf


    【解决方案1】:

    要测量函数执行的指令数,我建议在函数的进入和退出时使用perf_event_open() 开始和停止事件计数,而不是在有和没有函数的情况下运行两次程序。

    关于空程序执行的指令数量的不确定性,您可能正在计算用户和内核领域的事件。我认为两次运行之间的用户土地计数应该保持不变,但是对于内核部分,执行该程序的幕后发生了很多事情,所以我猜不确定性来自内核代码中发生的事情。要仅计算用户空间指令,您可以使用:

    perf stat -e instructions:u a.out
    

    您能否详细说明不同之处?

    【讨论】:

    • perf_event_open() 给了我一个与 .s 文件中的指令数相等的精确计数。 perf stat -e 指令:u a.out 每次也给出不同的计数,但变化没有问题中解释的场景那么大。
    • 使用 perf_event_open 你完全知道你所测量的。对于即使添加 :u 后仍然存在的(小)变化,我想在调用程序中的 main 函数之前,用户空间中仍然有很多事情要做,这里可能会有一些变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多