考虑我有一个软件,并希望使用black-box方法研究其行为。我有一个3.0GHz CPU,2个插座和4个内核。如您所知,为了找出每秒指令(IPS),我们必须使用以下公式:
IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
首先,我想找到我的特定算法的每个周期的指令数。然后我意识到几乎不可能使用块方法来计算它,我需要对算法进行深入分析。
但现在,我有两个问题:无论我的机器上运行什么类型的软件及其CPU使用情况,有没有办法计算每秒发送到CPU的指令数(每秒百万条指令(MIPS) ))?是否有可能找到指令集的类型(添加,比较,输入,跳转等)?
任何一个脚本或工具推荐都会受到赞赏(用任何语言)。
答案 0 :(得分:1)
perf stat ./my_program
将使用CPU性能计数器来记录它运行的指令数量,以及它花费了多少核心时钟周期。它使用了多少CPU时间,并为您计算每个核心时钟周期的平均指令,例如
3,496,129,612 instructions # 2.61 insn per cycle
。
这通常比每秒的说明更有趣。但是,每个时钟uops
通常会更加有趣,因为你最接近前端的程度如何。
但如果您确实需要跨核心的总MIPS或平均MIPS,以及是否计算睡眠,请参阅How to calculate MIPS using perf stat以获取有关instructions / task-clock
与instructions / elapsed_time
的更多详细信息。
有关在静态可执行文件中的微小microbenchmark循环上使用它的示例输出,请参阅Can x86's MOV really be "free"? Why can't I reproduce this at all?
如何在运行时获取实时信息
你的意思是从程序中,只描述其中的一部分?有一个perf API,您可以在其中执行perf_event_open
或其他操作。或者使用不同的库直接访问HW perf计数器。
perf stat
非常适合对一个循环进行微基准测试,这个循环已被隔离到一个独立的程序中,该程序只运行热循环一秒左右。
或许你的意思是别的。 perf stat -I 1000 ... ./a.out
将每1000毫秒(1秒)打印计数器值,以查看程序行为如何实时更改,无论您想要什么时间窗口(低至10毫秒间隔)。
还有perf record --timestamp
来记录每个事件样本的时间戳。 perf report -D
可能与此有用。请参阅http://www.brendangregg.com/perf.html,他提到-T
(--timestamp
)。我还没有真正用过这个;我主要隔离我正在调整的单个循环。
是否可以找到指令集的类型(添加,比较,输入,跳转等)?
Intel x86 CPU至少有一个分支指令计数器,但除FP指令外,其他类型没有区别。对于大多数具有perf计数器的架构而言,这可能是常见的。但是对于Intel CPU,有ocperf.py,perf
的包装器,带有更多微体系结构事件的符号名称,所以你可以
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
它不是为了告诉您正在运行的指令,您已经可以通过跟踪执行来判断它。大多数指令都是完全流水线的,所以有趣的是哪些端口压力最大。除法/ sqrt单位是例外:arith.divider_active
有一个计数器:“当除法单元忙于执行除法或平方根运算时的循环。整数和浮点运算的帐户”。分隔符未完全流水线化,因此即使没有旧的uops准备好在端口0上执行,新的divps
或sqrtps
也无法始终启动。(http://agner.org/optimize/)
相关:linux perf: how to interpret and find hotspots使用perf
来识别热点。特别是使用自上而下的分析,您需要perf
对调用堆栈进行采样,以查看哪些函数会导致大量昂贵的子调用。 (我提到这个是你想要知道的,而不是指令混合。)
对于精确的动态指令计数,如果您使用的是x86 ,则可以使用英特尔PIN等工具工具。 https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool
在最近的英特尔CPU上,有硬件支持记录条件/间接分支的方式,因此您可以精确地重建哪些指令以哪种顺序运行,假设没有自修改代码并且您仍然可以读取任何JIT缓冲区。 Intel PT
抱歉,我不知道AMD CPU上的等价物是什么。