【问题标题】:Why is float division slow?为什么浮点除法慢?
【发布时间】:2010-10-05 02:36:57
【问题描述】:

进行浮点除法的算法有哪些步骤?

为什么结果比乘法慢?

它的完成方式与我们手动除法的方式相同吗?反复除以除数,结果相减得到余数,再次对齐,直到余数小于某个特定值?

另外,为什么我们要提高性能而不是这样做

a = b / c 

我们这样做

d = 1 / c
a = b * d

?

编辑: 基本上我问是因为有人要求我根据权重分配在竞争者之间分配一个值。我用整数完成了所有这些操作,后来被要求转换为浮点数,这导致性能下降。我只是想知道 C 或 C++ 将如何执行这些会导致缓慢的操作。

【问题讨论】:

标签: performance algorithm hardware


【解决方案1】:

FPU 除法通常基本上使用 Newton-Raphson(或其他算法)来获得倒数,然后乘以该倒数。这就是为什么倒数运算比一般除法运算稍快的原因。

This HP paper(这实际上比我遇到的大多数关于 Newton-Raphson 的论文更容易理解)对浮点除法有这样的说法:

浮点除法和平方 根需要相当长的时间 计算比加法和 乘法。后两者是 直接计算,而前者是 通常使用迭代计算 算法。最常见的方法是 使用无除法 Newton-Raphson 迭代得到一个近似值 分母的倒数 (除法)或倒数平方 根,然后乘以 分子(除法)或输入参数 (平方根)。

【讨论】:

  • 我并不是说 HP 纸张有问题,我什至没有足够的了解来考虑这一点。然而,这篇论文最后一次修订是在 1994 年,所以我猜流程设计在 14 年内至少发生了一些的变化 :-) 所以拿这篇论文加点盐吧。
  • @WaldenL 工艺设计可能会改变(小型化),但算术几乎不会改变。
【解决方案2】:

从硬件的角度来看,除法是一种迭代算法,所花费的时间与位数成正比。目前最快的除法使用 radix4 算法,每次迭代生成 4 位结果。对于 32 位除法,您至少需要 8 步。

乘法可以在一定程度上并行进行。无需详细说明,您可以将大型乘法分解为几个较小的独立乘法。这些乘法可以再次分解,直到您处于位级别,或者您更早停止并使用硬件中的小型查找表。从硅空间的角度来看,这使得乘法硬件很重,但速度也非常快。这是经典的尺寸/速度权衡。

您需要 log2 步来组合并行计算结果,因此 32 位乘法需要 5 个逻辑步(如果您降到最小值)。幸运的是,这 5 个步骤比除法步骤简单得多(只是添加)。这意味着实际上乘法速度更快。

【讨论】:

    【解决方案3】:

    如 Wikipedia 文章 Division algorithm 中所述,计算机中的划分主要有两种方法:

    慢速分区

    使用以下循环并在每次迭代中找到一位数: partialRemainder[j+1] = radix * partialRemainder[j] - quotientDigit[n-(j+1)]*denominator

    快速除法

    从估计开始并收敛于商。您的准确度取决于迭代次数。

    Newton-Raphson 分部(非常简短):

    1. 计算倒数的估计值。
    2. 计算更准确的倒数估计值。
    3. 通过将被除数乘以倒数来计算商。

    【讨论】:

      【解决方案4】:

      你不会通过这样做来获得性能

      d = 1 / c
      a = b * d
      

      你的意思可能是:

      d = 1 / c
      a1 = b1 * d
      a2 = b2 * d
      

      这样除法只进行一次。

      除法本身比乘法慢,但是,我不知道细节。基本原因是,类似于 sin 或 sqrt 等函数,它只是在数学上更复杂。 IIRC,在平均 CPU 上,乘法大约需要 10 个周期,而除法大约需要 50 或更多。

      John Mulder 很好地解释了它是如何完成的。

      【讨论】:

      • 我一直想知道为什么;一个在循环中添加,另一个在减去。也许这是循环中对 while(x>=y) 的额外测试,而不是 n 的直接迭代......也许它正在将最终余数的十进制表示形式计算为分数???
      • 在“c”为常数的情况下,乘以倒数确实可以节省时间。
      • @Software Monkey,ALU 中的乘法是使用移位加法完成的,而不是将被相乘的数字的 n 个副本相加,因此只需要 k 次迭代,其中 k 是您的位数号码:en.wikipedia.org/wiki/Multiplication_ALU
      【解决方案5】:

      想想所涉及的硬件,您就会更好地理解为什么除法比乘法需要更长的时间。这两种运算都是在浮点单元 (FPU) 级别完成的,即使在积分 ALU 的世界中,除法电路也比乘法电路要忙得多。我怀疑这在浮点世界中只会更加痛苦,因为现在数据不仅是按最重要的数字排序,而是按 IEEE 754 标准排序。

      至于四舍五入,它实际上是关于在门之间传输的信号被焊接到地面的位置;发生这种情况时,您会丢失数字。不是四舍五入,而是截断。

      或者您是在询问仅使用整数来模拟浮点算术吗?

      【讨论】:

        【解决方案6】:

        浮点除法并不比整数除法慢多少,但编译器可能无法进行相同的优化。

        例如,编译器可以将 3 之间的整数除法替换为乘法和二进制移位。 它也可以用乘以 0.5 代替 2.0 之间的浮点除法,但不能用乘以 1/3.0 代替 3.0 之间的除法,因为 1/3.0 不能用二进制数精确表示,因此舍入错误可能会改变除法的结果。
        由于编译器不知道您的应用程序对舍入错误有多敏感(假设您在进行天气模拟,请参阅Butterfly effect)它无法进行优化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-14
          • 2011-04-21
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          相关资源
          最近更新 更多