如何获取程序执行的指令数量?

5

我已经编写并交叉编译了一个小的C++程序,可以在ARM或PC上运行。由于ARM和PC具有不同的指令集架构,我想进行比较。我能否获得该C++程序在两种ISA中执行的指令数?


1
通常情况下,您可以使用反汇编工具(如GNU binutils中的objdump)或类似size的程序。答案取决于编译器、编译器版本、命令行参数、输出格式等因素。 - artless noise
你会发现,对于相同的代码、相同的目标以及相同的编译器,基于不同的优化、调试和其他编译器选项,结果会产生不同的变化。而当你改变编译器版本(相同的代码,相同的目标),差异会更加明显,当你改变目标时,这种差异又会有所不同。基本上,对于同一源代码,在这两个目标之间所需的指令数量将会有数百个不同的数字。 - old_timer
1
你的意思是a)程序指令大小还是b)程序运行时执行的指令数量?例如,一个小循环可能具有较小的(a)和较大的(b)。 - Mike Dunlavey
@MikeDunlavey 实际上我是指 b),指令数量 :D - Cong Wang
然后您想从@VAndrei那里得到答案。 - Mike Dunlavey
4个回答

6
你需要的是一个性能分析器。 perf 是一个易于使用的选择。它会给出执行的指令数,这是比较ISA效率的最佳指标。
查看这里的教程。
你需要使用:perf stat ./your binary 查找指令指标。此方法使用CPU性能监视单元中的寄存器 - PMU - 计算指令数量。

4

您想获取静态指令或动态指令的数量吗?例如,如果您有以下循环(伪代码):

for (i 0 to N):
 a[i] = b[i] + c[i]

静态指令计数将会在10条指令左右,这取决于你的ISA,但动态计数将取决于N、分支预测实现等因素。
因此,对于静态计数,我建议使用objdump,根据评论中的建议。您可以找到子程序的入口和出口标签,并计算它们之间的指令数量。
对于动态指令计数,我建议有两种选择:
1. 您可以使用指令集模拟器模拟运行该代码(ARM和x86都有开源ISA模拟器,例如Gem5实现了两者,还有其他支持其中一种的模拟器)。 2. 第二个选项是在目标系统上本地运行并设置CPU性能计数器以报告动态指令计数。您需要在执行代码之前重置并在之后读取它(这里可能会有与调用子例程和退出相关的噪声,但您应该能够将其隔离出来)。
希望这有所帮助 :)

1
objdump -dw mybinary | wc -l

在Linux及其类似系统上,这可以很好地近似计算可执行文件、库文件或目标文件中指令的数量。这是一个静态计数,当然与运行时行为完全不同。

这个基于objdump的命令只是打印反汇编行数的计数,从而给出二进制文件中指令数量的近似值,而不是执行的指令数量(它不考虑循环、分支等)。 - Zskdan

0

Linux操作系统: valgrind --tool=callgrind ./program 1 > /dev/null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接