【问题标题】:How can I get the number of instructions executed by a program?如何获取程序执行的指令数?
【发布时间】:2015-06-26 13:01:54
【问题描述】:

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

【问题讨论】:

  • 通常,您可以反汇编(objdump 使用 GNU binutils 工具)或使用类似size 的程序。答案取决于编译器、编译器版本、命令行参数、输出格式等。
  • 您会发现相同的代码相同的目标相同的编译器会根据优化和调试以及其他编译器选项产生不同的结果,然后随着您更改编译器的版本(相同的代码相同的目标)甚至更多变化,然后当您更改目标时,它会再次变化。基本上,如果两个目标的相同源代码需要指令,您最终应该会得到数百个不同的数字。
  • 您的意思是 a) 指令中程序的大小,还是 b) 程序运行时执行的指令数?例如,一个小循环可能有一个小 (a) 和一个大 (b)。
  • @MikeDunlavey 其实我的意思是 b),指令的数量:D
  • 那么你想要@VAndrei 的答案

标签: c++ x86 arm profiling instruction-set


【解决方案1】:

您需要的是分析器。 perf 将是一种易于使用的方法。它将为您提供执行的指令数,如果您想比较 ISA 效率,这是最好的指标。

查看教程here

您需要使用:perf stat ./your binary

查找说明指标。这种方法在 CPU 的性能监控单元 - PMU 中使用一个寄存器来计算指令的数量。

【讨论】:

    【解决方案2】:

    您是要获取静态指令的数量还是动态指令的数量?因此,例如,如果您有以下循环(伪代码):

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

    静态指令计数将略低于 10 条指令,具体取决于您的 ISA,但动态计数取决于 N、分支预测实现等。

    所以对于静态计数,我建议使用 objdump,按照 cmets 中的建议。您可以找到子程序的入口和出口标签,并计算其间的指令数。

    对于动态指令计数,我会推荐以下两种方法之一:

    • 您可以使用指令集模拟器模拟运行该代码(目前有适用于 ARM 和 x86 的开源 ISA 模拟器 - 例如 Gem5 实现了这两种模拟器,还有其他支持其中一种的模拟器。
    • 您的第二个选择是在目标系统上本地运行它并在 CPU 中设置性能计数器以报告动态指令计数。您可以在执行代码之前重置,然后再阅读(这里可能会出现一些与调用子例程和退出相关的噪音,但您应该能够将其隔离出来)

    希望这会有所帮助:)

    【讨论】:

      【解决方案3】:
      objdump -dw mybinary | wc -l
      

      在 Linux 和朋友中,这可以很好地估计可执行文件、库或目标文件中的指令数量。这是一个静态计数,当然与运行时行为完全不同。

      【讨论】:

      • 这个基于 objdump 的命令只打印反汇编行数,它给出二进制指令的近似值,未执行的指令(它不包括循环、分支等)
      【解决方案4】:

      Linux: valgrind --tool=callgrind ./program 1 > /dev/null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 2019-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多