在C中分析浮点使用情况

时间:2011-10-21 20:24:23

标签: c floating-point profiler primitive

有一种简单的方法来计算一段标准C代码实际执行的乘法次数吗?我想到的代码基本上只是添加和乘法,而且它是主要关注的乘法,但是获得其他操作的计数也没有什么坏处。

如果是一个选项,我想我可以用'乘法(a,b)'替换'a * b'并为本机*运算符写一个封面函数,b / c我真的不在乎关于此测试期间的时间性能,但主要反对做 必须重新编写一堆源代码才能运行测试。

我不反对重新编译源代码,可能针对某些库或使用模糊(afaik)选项。 Valgrind浮现在脑海中,但如果我理解了valgrind的目的,那更多的是追踪价值而不是计算操作。

4 个答案:

答案 0 :(得分:4)

将源代码编译为汇编语言,然后搜索乘法指令。

请注意,优化级别会极大地影响显示的数量。对于循环,您必须确定循环中乘法的范围并将其计入结果中,但如果代码受到相当大的约束或限制,那么这应该是直截了当的。

答案 1 :(得分:4)

注意:对我的评论进行了无耻的推断,因为我可以掠过。

PAPI有两个高级API函数,称为PAPI_flips和PAPI_flops,可用于记录FLOPS以及浮点运算的数量。此外,PAPI还提供了许多其他性能计数器监控功能,具体取决于您的处理器架构......缓存,总线,内存,分支机构等。我认为图形加速器和CUDA / GPGPU正在出现支持或支持。

PAPI需要安装在您的系统上,但我认为如果您知道自己在做什么,安装就不会太痛苦。

PAPI的好处在于你不需要了解代码;只是仪表它(界面与FLOPS的秒表相同)并运行它。它基于程序的实际动态执行,因此它考虑了难以分析的因素,例如(伪)随机行为,用户/变量输入和相关分支。

答案 2 :(得分:2)

如果您的编译器支持soft-float(即使用带有整数实现的函数来模拟浮点),您可以在该模式下编译程序(GCC中为-msoft-float),并使用您喜欢的分析工具来测量他们被调用了多少次。

许多处理器还具有性能计数器,可以计算已退役的浮点运算的数量。根据硬件和操作系统的不同,您可能需要或可能不需要一些内核支持来利用它们。

答案 3 :(得分:1)

我能想到的最好的是(假设你正在运行gdb):

如果您可以识别出正在发生乘法的点,则可以在乘法之前设置跟踪点(或者可能在它们之后根据细节设置),然后运行程序并计算跟踪点转储的数量。

是的,它很粗糙。当然还有其他解决方案;但是,我会毫不犹豫地把我的堆栈丢弃,就像计数一样简单。