如何使用 perf stat 计算 MIPS

Posted

技术标签:

【中文标题】如何使用 perf stat 计算 MIPS【英文标题】:How to calculate MIPS using perf stat 【发布时间】:2018-11-18 16:47:46 【问题描述】:

以下answer about Benchmarking - How to count number of instructions sent to CPU to find consumed MIPS 建议:

perf stat ./my_program 在 Linux 上将使用 CPU 性能计数器 记录它运行了多少条指令,以及它有多少个核心时钟周期 拿。 (以及它使用了多少 CPU 时间,并将计算 MIPS 你)。


一个示例生成以下不包含计算的MIPS 信息的输出。

 Performance counter stats for './hello.py':

       1452.607792 task-clock (msec)         #    0.997 CPUs utilized
               327 context-switches          #    0.225 K/sec
               147 cpu-migrations            #    0.101 K/sec
            35,548 page-faults               #    0.024 M/sec
     2,254,593,107 cycles                    #    1.552 GHz                     [26.64%]
   <not supported> stalled-cycles-frontend
   <not supported> stalled-cycles-backend
     1,652,281,933 instructions              #    0.73  insns per cycle         [38.87%]
       353,431,039 branches                  #  243.308 M/sec                   [37.95%]
        18,536,723 branch-misses             #    5.24% of all branches         [38.06%]
       612,338,241 L1-dcache-loads           #  421.544 M/sec                   [25.93%]
        41,746,028 L1-dcache-load-misses     #    6.82% of all L1-dcache hits   [25.71%]
        25,531,328 LLC-loads                 #   17.576 M/sec                   [26.39%]
         1,846,241 LLC-load-misses           #    7.23% of all LL-cache hits    [26.26%]

       1.456531157 seconds time elapsed

[Q] 如何从perf stat 的输出中正确计算MIPS?为了计算 MIPS,我应该从 perf stat 获得的值遵循 instructions/seconds_time_elapsed 吗?

【问题讨论】:

【参考方案1】:

这显然只是指令/秒。 (除以 100 万来缩放为 Mega 公制前缀。)

使用总运行时间将为您提供整个程序的 MIPS,所有内核的总和,并计算睡眠/等待它所花费的任何时间。

Task-clock 将计算所有内核上使用的总 CPU 时间,因此它将为您提供所有使用的内核的平均 MIPS,不计算任何睡眠时间。 (task-clock:u 只计算用户空间时间,但task-clock 也计算在内核中花费的时间。)

【讨论】:

据我了解,task-clock 相当于所有内核的平均 MIPS,对吧?据我了解,使用task-clock 而不是instructions / seconds_elapsed_seconds 会更有效,以忽略任何花费在睡眠/等待上的时间。 @Peter Cordes @alper:这不是“效率”的问题,它只是您可能想要衡量的两种不同的东西。 instructions / task-clock 是所有内核的平均 MIPS,仅计算未用于睡眠的时间。例如perf stat sleep 1 将仅显示 ~0.4 毫秒的 task-clock,但经过的时间为 1 秒。具有 I/O 等待或硬页面错误的代码在这些时间间隔内不执行任何指令会浪费时间,因此将这段时间计算在内当然是合理的。或者在多线程代码中等待互斥锁所花费的时间。 两者之间的差异很大。 perf stat sleep 1 为任务时钟返回 1 msec,即 0.001 秒。所以它将是经过时间instructions / 1 或任务时钟instructions / 0.001,大约小 1000 倍。 @Peter Cordes @alper:完全正确。 sleep 使用很少的 CPU 时间来启动、动态链接其库并进行系统调用。但它会花费大量时间睡觉,因此总挂钟时间很高。在经过的大部分时间内,CPU 可用于其他任务,但sleep 任务本身并未完成。大文件的cp 类似:大部分时间都在等待 I/O。 uk 修饰符(以及任何其他修饰符)似乎不适用于 task-clockcpu-clock 事件。始终包括用户时间和内核时间。

以上是关于如何使用 perf stat 计算 MIPS的主要内容,如果未能解决你的问题,请参考以下文章

如何获取使用 perf stat 运行的程序的退出代码?

使用 mpirun 时,如何使分析器(valgrind、perf、pprof)拾取/使用带有调试符号的本地版本库?

理解 perf stat 输出中的数字

perf stat 前端和后端周期显示大于 100%

KVM虚拟机使用Perf stat 提示cycles not supported

如何使用perf捕获组合的内核和用户空间堆栈