perf stat --all-user ./my_program
Linux上的CPU会使用CPU性能计数器来记录它运行了多少个用户空间指令,以及它花费了多少个核心时钟周期。它使用了多少 CPU 时间,并将为您计算每个核心时钟周期的平均指令,例如
3,496,129,612 instructions:u # 2.61 insn per cycle
它为你计算IPC;这通常比每个说明更有趣second. uops
不过,就您距离最大化前端的程度而言,每个时钟通常更有趣。您可以手动计算 MIPSinstructions
and task-clock
.对于大多数其他事件,perf 以每秒的速率打印一条评论。
(如果你不使用--all-user
, 您可以使用perf stat -e task-clock:u,instructions:u
,...让这些特定事件仅在用户空间中计数,而其他事件可以始终计数,包括内部中断处理程序和系统调用。)
But see 如何使用 perf stat 计算 MIPS https://stackoverflow.com/questions/53363242/how-to-calculate-mips-using-perf-stat欲了解更多详细信息instructions / task-clock
vs. instructions / elapsed_time
如果您确实想要跨核心的总或平均 MIPS,以及是否计算睡眠。
有关在静态可执行文件中的小型微基准循环上使用它的示例输出,请参阅x86的MOV真的可以“免费”吗?为什么我根本无法重现这个? https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at-all
如何在运行时获取实时信息
您的意思是从程序内部仅分析其中的一部分吗?有一个 perf API 你可以做perf_event_open
或者其他的东西。或者使用不同的库直接访问硬件性能计数器。
perf stat
非常适合对已隔离到仅运行热循环一秒钟左右的独立程序中的循环进行微基准测试。
或者也许你的意思是别的。perf stat -I 1000 ... ./a.out
将每 1000 毫秒(1 秒)打印一次计数器值,以查看程序行为如何实时变化无论您想要什么时间窗口(低至 10 毫秒间隔)。
sudo perf top
是系统范围的,有点像 Unixtop
还有perf record --timestamp
记录每个事件样本的时间戳。perf report -D
可能与此一起有用。看http://www.brendangregg.com/perf.html http://www.brendangregg.com/perf.html,他提到了一些关于-T
(--timestamp
)。我还没有真正使用过这个;我主要隔离单个循环,我正在调整为可以在其下运行的静态可执行文件perf stat
.
是否有可能找到指令集的类型(添加、比较、输入、跳转等)?
Intel x86 CPU 至少有一个用于分支指令的计数器,但除了 FP 指令之外,其他类型没有区别。这对于大多数具有性能计数器的架构来说可能很常见。
对于 Intel CPU,有ocperf.py https://github.com/andikleen/pmu-tools,一个包装器perf
具有更多微建筑事件的象征性名称。 (更新:普通perf
现在知道大多数 uarch 特定计数器的名称,因此您不需要ocperf.py
不再了。)
perf stat -e task_clock,cycles,instructions,fp_arith_inst_retired.128b_packed_single,fp_arith_inst_retired.scalar_double,uops_executed.x87 ./my_program
它并不是为了告诉您正在运行哪些指令,您已经可以通过跟踪执行来判断。大多数指令都是完全流水线化的,因此有趣的是哪些端口的压力最大。除法/平方单位是个例外:有一个计数器arith.divider_active
: "除法单元忙于执行除法或平方根运算时的循环。考虑整数和浮点运算“。分配器没有完全流水线化,所以一个新的divps
or sqrtps
即使没有旧的微指令准备在端口 0 上执行,也无法始终启动。(http://agner.org/optimize/ http://agner.org/optimize/)
有关的:linux perf:如何解释和查找热点 https://stackoverflow.com/questions/7031210/linux-perf-how-to-interpret-and-find-hotspots用于使用perf
来识别热点。特别是使用自上而下的分析perf
对调用堆栈进行采样以查看哪些函数进行了大量昂贵的子调用。 (我提到这一点是为了以防万一你就是这样really我想知道,而不是混合指令。)
Related:
- 如何确定 C 程序中执行的 x86 机器指令数? https://stackoverflow.com/questions/54355631/how-do-i-determine-the-number-of-x86-machine-instructions-executed-in-a-c-progra
- 如何通过获取指令类型细分来表征工作负载? https://stackoverflow.com/questions/58243626/how-to-characterize-a-workload-by-obtaining-the-instruction-type-breakdown
- 如何监控 SIMD 指令的使用量 https://stackoverflow.com/questions/60104698/how-do-i-monitor-the-amount-of-simd-instruction-usage
为了获得精确的动态指令计数,如果您使用的是 x86,您可以使用 Intel PIN 等检测工具. https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool.
perf stat
计为instructions:u
硬件甚至也应该或多或少地精确,并且实际上在执行相同工作的同一程序的运行中非常可重复。
在最新的 Intel CPU 上,硬件支持记录条件/间接分支的走向,因此您可以准确地重建哪些指令按顺序运行,假设没有自修改代码并且您仍然可以读取任何 JIT 缓冲区。Intel PT https://software.intel.com/en-us/blogs/2013/09/18/processor-tracing.
抱歉,我不知道 AMD CPU 上的等效项是什么。