【发布时间】:2018-10-05 18:54:39
【问题描述】:
假设我有一个软件,并想使用black-box 方法研究它的行为。我有一个带有 2 个插槽和 4 个内核的 3.0GHz CPU。如您所知,为了找出每秒指令 (IPS),我们必须使用以下公式:
IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
起初,我想为我的特定算法找到每个周期的指令数。然后我意识到使用块盒方法几乎不可能计算它,我需要对算法进行深入分析。
但是现在,我有两个问题:无论我的机器上运行的是哪种软件及其 CPU 使用率,有没有办法计算每秒发送到 CPU 的指令数(每秒百万条指令(MIPS ))?并且是否可以找到指令集的类型(添加、比较、输入、跳转等)?
任何脚本或工具推荐都将不胜感激(使用任何语言)。
【问题讨论】:
-
perf stat ./my_program在 Linux 上将使用 CPU 性能计数器来记录它运行了多少指令,以及它花费了多少核心时钟周期。 (以及它使用了多少 CPU 时间,因此您可以获得 MIPS)。 -
@PeterCordes 完美!非常感谢。如何在运行时获取实时信息?
-
你的意思是从程序内部,只分析它的一部分?有一个
perfAPI,您可以在其中执行perf_event_open或其他操作。或者使用不同的库直接访问硬件性能计数器。通常我通过将热循环放在一个运行大量迭代的程序中来对我正在调整的代码进行微基准测试,所以我通常不这样做。 -
re: 指令类型:Intel CPU 至少有一个分支指令计数器,但除 FP 指令外,其他类型没有区别。例如使用
ocperf.py,您可以使用ocperf.py stat -e task_clock,cycles,instructions,fp_arith_inst_retired.128b_packed_single,fp_arith_inst_retired.scalar_double,uops_executed.x87 ./my_program对于精确的动态指令计数,如果您使用的是 x86,则可以使用英特尔 PIN 之类的检测工具。 software.intel.com/en-us/articles/….
标签: performance assembly profiling cpu benchmarking