3

我读到 gprof(函数分析)和其他分析方法可以返回在程序执行过程中发生的浮点操作的数量,因此想知道为什么 Flops 比常规操作昂贵得多?

4

1 回答 1

12

我假设您在谈论 x86,但以下很多内容同样适用于其他架构

浮点运算很昂贵,因为对浮点数的运算比对整数的运算要昂贵得多。就是这么简单。整数的格式使得加法和减法在硬件中实现起来非常简单。浮点数(几乎总是)在IEEE 754中实现,它将数字存储为符号、指数和尾数,这允许表示非常大和非常小的数字,但它是以运算速度为代价的。如果数字只有 3 位小数,则可以使用整数,最后除以 3;广泛的精度使事情复杂化。

话虽如此,现代处理器在浮点数方面比以前更好。浮点数学最初是在一个可选的协处理器上实现的——特别是英特尔 80387——它只能通过特殊指令来访问。您将值压入 x87 堆栈,执行操作,然后将其弹出回硬件寄存器。很慢,因为它不得不离开处理器。更重要的是,使用这些特定操作变得“有风险”,因为您无法确定处理器是否存在——如果不存在,您的程序将工作,但它会使用模拟协处理器的软件例程。如果你是一个游戏开发者,你不能依赖,比如说,平方根速度快,您可以自己完成工作,并且您在所有系统上的运行速度都一样快——在某些系统上运行速度不会稍快,而在其他系统上运行速度则慢得多。

如今,处理器具有为性能而设计的特殊浮点运算,更重要的是,保证存在。所以它们非常快,虽然浮点运算不可避免地比整数运算慢,但它们通常不足以解决问题——尤其是以错误和复杂性为代价的。更重要的是,这个答案表明,在大多数情况下,它是一种洗涤。

无论如何,性能现在已经足够好,以至于老格言开始了——程序员的时间比机器时间更重要,而且你肯定会花更多的时间来编写一些避免浮点数的花哨算法,而不是仅仅使用他们。

于 2012-10-08T08:15:39.373 回答