2009-07-12 109 views
2

我想在我的代码中计算几个cpu指令。例如我想知道有多少次增加,多少次乘法,多少次浮点操作,我的代码执行多少次分支。我目前在Linux下使用gprof来分析我的C++代码,但它只给出我函数的调用次数,并且我手动估计了指令的数量。有没有什么工具可以为我做诡计?也许有些虚拟机?性能分析说明

回答

2

您可以使用ValgrindCallgrind--dump-instr=yes标志来实现这个

+0

不直接计算指令,但有助于以非常方便的方式浏览程序集。谢谢。 – 2009-07-14 12:23:30

5

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

0

只是出于好奇,是指令计数来分析代码性能的有效途径?我知道,在“简单”CPU设计的日子里,你可以合理地假设每一个操作码都需要超过CPU的时间才能执行,但是现在有了所有复杂的内存缓存方案,即时操作码重新排序,流水线化,超标量体系结构以及其他所有现有CPU的投入,操作码执行的简单计数仍然能够很好地指示代码运行需要多长时间?或者,根据(例如)内存访问模式和操作码执行的顺序,执行时间会有所不同,因为它将按照操作码执行的原始频率执行?

我怀疑目前唯一能可靠地预测代码性能的方法是实际运行目标架构上的代码和时间......即通常当编译器似乎发出低效的代码时,它实际上巧妙地利用现代CPU架构的微妙特性。

+0

的确,现在有更多的变数,准确的预测很难。还有很多因素可能比指令数更重要。尽管如此,某些关系是真实的,并且对于可预见的未来仍然如成本(增加)<=成本(乘法)<=成本(除)<=成本(平方根)。用乘法替代鸿沟不太可能会损害性能并可能有所帮助。 – 2009-07-12 19:50:48

+0

你的表现是正确的。但是我的目标不是优化我的代码的性能,而是进行其他类型的分析(指令类型和频率)。 – 2009-07-14 11:51:42

1

英特尔vtune是免费的Linux用户,AFAIK(假设我们正在谈论一个基于英特尔的x86 linux机器)。它会给你所有你需要的信息和SOOO更多。

+1

就像编译器一样,Vtune作为一个“评估版”只能免费使用30天。它被列为699美元。相当“远离”自由。 – greyfade 2009-07-12 19:01:43

4

这是一般性建议,不是Linux特定的:您应该对CPU周期感兴趣。忘记指令的数量作为衡量性能的指标。一条指令的成本可能与其他10条指令相同,所以它不会告诉你任何东西。

你应该关注CPU周期,并且在线程进入睡眠(“切换/退出”)的时间内,多线程环境中(即使不是全部也是如此),这会让你知道多少时间等待I/O,数据库等完成,并影响CPU的特权时间。

0

您可以使用pin-instat这是一个PIN工具。要使用它,您需要安装PIN码。但是,单凭指令数并不能说明性能。 Cache miss,分支预测也扮演重要角色。

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