如何获取程序执行的指令数?
How can I get the number of instructions executed by a program?
我编写并交叉编译了一个小的 c++ 程序,我可以 运行 在 ARM 或 PC 中使用它。由于 ARM 和 PC 具有不同的指令集体系结构,因此我想对它们进行比较。我是否有可能获得此 C++ 程序中两个 ISA 的已执行指令数?
您是要获取静态指令数还是动态指令数?因此,例如,如果您有以下循环(伪代码):
for (i 0 to N):
a[i] = b[i] + c[i]
静态指令数将略低于 10 条指令,根据您的 ISA 给出或接受,但动态指令数将取决于 N、分支预测实现等。
因此,对于静态计数,我建议根据评论中的建议使用 objdump。您可以找到子程序的入口和出口标签,并计算其间的指令数。
对于动态指令计数,我推荐以下两种方法之一:
- 您可以使用指令集模拟器模拟 运行ning 该代码(那里有用于 ARM 和 x86 的开源 ISA 模拟器——例如 Gem5 实现了这两者,还有其他的支持其中之一。
- 您的第二个选择是 运行 在目标系统上本机执行此操作,并在 CPU 中设置性能计数器以报告动态指令计数。你会在执行你的代码之前重置,然后再阅读它(这里可能会有一些与调用你的子程序和退出相关的噪音,但你应该能够将其隔离出来)
希望这对您有所帮助:)
你需要的是一个分析器。 perf 会是一个易于使用的工具。它将为您提供 执行的指令数 ,这是比较 ISA 效率的最佳指标。
查看教程here.
您需要使用:perf stat ./your binary
寻找指令指标。这种方法在您的 CPU 的性能监控单元 - PMU - 中使用一个寄存器来计算指令的数量。
objdump -dw mybinary | wc -l
在 Linux 和朋友上,这给出了可执行文件、库或目标文件中指令数量的一个很好的近似值。这是一个静态计数,当然与运行时行为完全不同。
Linux:
valgrind --tool=callgrind ./program 1 > /dev/null
我编写并交叉编译了一个小的 c++ 程序,我可以 运行 在 ARM 或 PC 中使用它。由于 ARM 和 PC 具有不同的指令集体系结构,因此我想对它们进行比较。我是否有可能获得此 C++ 程序中两个 ISA 的已执行指令数?
您是要获取静态指令数还是动态指令数?因此,例如,如果您有以下循环(伪代码):
for (i 0 to N):
a[i] = b[i] + c[i]
静态指令数将略低于 10 条指令,根据您的 ISA 给出或接受,但动态指令数将取决于 N、分支预测实现等。
因此,对于静态计数,我建议根据评论中的建议使用 objdump。您可以找到子程序的入口和出口标签,并计算其间的指令数。
对于动态指令计数,我推荐以下两种方法之一:
- 您可以使用指令集模拟器模拟 运行ning 该代码(那里有用于 ARM 和 x86 的开源 ISA 模拟器——例如 Gem5 实现了这两者,还有其他的支持其中之一。
- 您的第二个选择是 运行 在目标系统上本机执行此操作,并在 CPU 中设置性能计数器以报告动态指令计数。你会在执行你的代码之前重置,然后再阅读它(这里可能会有一些与调用你的子程序和退出相关的噪音,但你应该能够将其隔离出来)
希望这对您有所帮助:)
你需要的是一个分析器。 perf 会是一个易于使用的工具。它将为您提供 执行的指令数 ,这是比较 ISA 效率的最佳指标。
查看教程here.
您需要使用:perf stat ./your binary
寻找指令指标。这种方法在您的 CPU 的性能监控单元 - PMU - 中使用一个寄存器来计算指令的数量。
objdump -dw mybinary | wc -l
在 Linux 和朋友上,这给出了可执行文件、库或目标文件中指令数量的一个很好的近似值。这是一个静态计数,当然与运行时行为完全不同。
Linux:
valgrind --tool=callgrind ./program 1 > /dev/null