【问题标题】:What is the computational cost of floating point Multiplication vs Addition?浮点乘法与加法的计算成本是多少?
【发布时间】:2016-09-27 08:06:18
【问题描述】:

忽略所有其他问题,例如内存传输等。

我正在寻找一些“成本”的衡量标准,我想我会将其量化为预期的位翻转次数,用于将两个随机浮点数(比如 32 位)相乘与相加的成本。

我想可能存在一些值得考虑的重要问题(例如数字是否具有相同的指数等)。

编辑:澄清一下,我对执行这些操作所需的能量感兴趣,而不是硬件的时间或数量,这就是为什么我认为“预期的位翻转次数”是感兴趣的数量。我认为这是一个定义明确的问题,给定算法肯定需要一些“预期的位翻转次数”来执行浮点乘法……而且我正在寻找所有算法的最小值。

编辑 2:感谢大家的回复。我得到的最相关的回复来自 njuffa,他引用了Mark Horowitz's estimates(参见第 33 页)。 Horowitz 的 more up-to-date paper 发布的数字略有不同,即:

Float32 Mult: 3.7pJ.  
Float32 Add:  0.9pJ
Int32 Mult:   3.1pJ
Int32 Add:    0.1pJ

【问题讨论】:

  • 我认为您需要更具体 - 例如,硬件 ALU 实现与“无限”硅资源的渐近复杂性。您可以查找有关如何在 FPGA 上实现浮点的资源。这可能是一个很好的起点。但就目前而言,这个问题的范围可能有点过于宽泛。
  • 我知道如果人们正在查看时间/空间复杂度,这些会有什么影响,但我会假设,如果只是测量执行算法所需的位翻转量,那么存在有明确的数字。
  • 加法与乘法的相对能耗取决于操作数的位宽。对于 32 位浮点运算,斯坦福大学的 Mark Horowitzgives numbers 加法需要 0.9 pJ,而乘法需要 4 pJ(在现在已经过时的 45 nm 工艺上,但我相信现代 14 nm 工艺仍然存在一般关系)。
  • 您可能还想考虑到许多现代浮点处理单元都专注于融合乘加 (FMA) 单元,而不是单独的浮点加法器和乘法器。由于在添加之前保留了完整的(未舍入,未截断)乘积,这为节能设计带来了新的挑战。
  • 啊,谢谢。对于那个信息。我真的对基本限制更感兴趣,而不是它如何在通用处理器上实现。

标签: floating-point complexity-theory multiplication


【解决方案1】:

在现代处理器上,浮点乘法通常比加法稍微贵一些(这也是编译器通常将 2*x 替换为 x+x 的原因之一。

在 x86 和 x86_64 上,浮点运算几乎总是使用 SSE 指令(ADDSS、MULSS 等)完成,对于这些指令,加法和乘法是恒定的时间,没有“早期输出”(这使得流水线更容易)。

实际的相对成本更难量化,取决于很多因素。这里的规范参考是 Agner Fog 的“指令延迟、吞吐量和微操作故障列表”:http://www.agner.org/optimize/

我听说过的一个粗略的启发式方法(尽管没有任何参考资料)是乘法需要大约 50% 的时间。

【讨论】:

  • 不完全。 AFAIK,在许多(大多数?)x86(32 位)系统上,FP 数学是在 FPU 上完成的。在大多数(如果不是全部)x86_64 系统上,它是使用 SSE 完成的。
  • 我不完全确定现代编译器 x+x... 替换 x*2... 没有类似 gcc 的 -ffast-math 选项。我可能错了;有太多 FP 边缘情况让我记不住。
  • @BrettHale 它不应该需要 -ffast-math 标志,因为它是一个完全有效的替代品(对于所有可能的值都给出相同的答案)。
  • 你用的是什么编译器? -0.0*2 应该给-0.0
  • 来自 IEEE 规范:“当输入和结果都不是 NaN 时,乘积或商的符号是操作数符号的异或”
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多