2

我想在我的代码中计算几个 cpu 指令。例如,我想知道我的代码执行了多少次加法、多少次乘法、多少次浮点运算、多少个分支。我目前在 Linux 下使用 gprof 来分析我的 c++ 代码,但它只给出了对我的函数的调用次数,并且我手动估计了指令的数量。是否有任何工具可以为我解决问题?也许是一些虚拟机?

4

6 回答 6

5

这是一个一般性建议,而不是特定于 Linux:您应该对 CPU 周期感兴趣。忘记将指令数量作为性能衡量标准。一条指令可能与其他 10 条指令的成本相同,因此它不会告诉您任何信息。

您应该关注 CPU 周期,以及在多线程环境中(如果不是全部的话)线程进入睡眠状态(“切换/退出”)的时间,这将使您了解等待 I/ 的时间有多少。 O、DB 等完成,它会影响 CPU 特权时间。

于 2009-07-12T17:07:37.080 回答
4

如果您确实需要计算指令,那么您最好生成汇编程序,然后将输出传递给智能 grep 等效项。对于gcc,请尝试-S开关。

于 2009-07-12T15:19:57.687 回答
3

您可以使用带有标志的ValgrindCallgrind--dump-instr=yes来实现此目的

于 2009-07-12T15:39:34.900 回答
1

Intels vtune 对 Linux 用户是免费的,AFAIK(假设我们谈论的是基于 Intel 的 x86 linux 机器)。它将为您提供所需的所有信息以及更多信息。

于 2009-07-12T17:03:21.817 回答
1

您可以使用pin-instat这是一个PIN工具。要使用它,您需要安装 PIN。但是,仅指令数并不能说明性能。缓存未命中、分支预测也起着重要作用。

免责声明:我是 pin-instat 的作者。

于 2014-05-18T17:21:11.587 回答
0

只是出于好奇,指令计数是分析代码性能的有用方法吗?

我知道在“简单”CPU 设计的日子里,你可以合理地假设每个操作码都将花费许多纳秒的 CPU 时间来执行,但是现在有了所有复杂的内存缓存方案,就在 - fly 操作码重新排序、流水线、超标量架构以及其他所有已投入现代 CPU 的东西,对操作码执行的简单计数是否仍然可以很好地指示代码运行需要多长时间?或者执行时间是否会根据(例如)内存访问模式和操作码执行的顺序而变化,因为它会根据操作码执行的原始频率而变化?

我的怀疑是,如今可靠地预测代码性能的唯一方法是在目标架构上实际运行代码并对其计时......即通常当编译器似乎发出低效代码时,它实际上正在做一些聪明的事情利用了现代 CPU 架构的一个微妙特性。

于 2009-07-12T16:44:48.170 回答