为什么乘法比划分便宜?

时间:2009-07-13 04:13:29

标签: performance theory cpu-usage

我最近写了一个Vector 3类,并将我的normalize()函数提交给了朋友。他说它很好,但是我应该尽可能地乘以倒数,因为在CPU时间里“乘法比划分便宜”。

我的问题很简单,为什么会这样?

3 个答案:

答案 0 :(得分:10)

考虑硬件可以更容易实现的基本操作 - 加,减,移位,比较。即使在简单的设置中进行乘法也需要更少的这样的基本步骤 - 此外,它提供了更快的算法 - 例如here ...但是硬件通常不会利用这些(除非极端专业硬件)。例如,正如维基百科网址所说,“Toom-Cook可以进行N次立方乘法以获得5次N次乘法的成本” - 这对于非常大的数字来说确实非常快(Fürer算法,一个相当近的发展,可以再次Θ(n ln(n) 2Θ(ln*(n))) - 查看维基百科页面及其中的链接。)

除了wikipedia之外,分部只是速度慢,再次 - 即使是最好的算法(其中一些是在HW中实现的,只是因为它们没有复杂和复杂的最佳算法用于乘法;-)不能对乘法算法产生影响。

只是为了量化不那么庞大的数字的问题,这里有gmpy的一些结果,GMP是一个易于使用的Python包装器,scheme,往往有很好的实现算术但不一定是最新和最大的喘息。在慢速(第一代;-) Macbook Pro:

$ python -mtimeit -s'import gmpy as g; a=g.mpf(198792823083408); b=g.mpf(7230824083); ib=1.0/b' 'a*ib'
1000000 loops, best of 3: 0.186 usec per loop
$ python -mtimeit -s'import gmpy as g; a=g.mpf(198792823083408); b=g.mpf(7230824083); ib=1.0/b' 'a/b'
1000000 loops, best of 3: 0.276 usec per loop

正如你所看到的,即使在这个小尺寸(数字中的位数),以及由完全相同的速度痴迷的人优化的库中,乘以倒数可以节省除法所占时间的1/3。

可能只有在极少数情况下,这几纳秒才是生死攸关的问题,但是,当它们 时,当然如果你反复划分相同的值(到摊开1.0/b操作!),然后这些知识可以节省生命。

(与x*x相比,x**2通常会节省时间[在**“提升权力”运算符的语言中,如Python和Fortran] - 和霍纳的{{3}}进行多项式计算比重复的加权操作更可取! - 。)。

答案 1 :(得分:6)

如果你回想起小学,你会记得乘法比加法更难,除法比乘法更难。 CPU的情况没有任何不同。

回想一下,计算倒数涉及一个除法,所以除非你计算一次倒数并使用它三次,否则你不会看到加速。

答案 2 :(得分:0)

(浮点)除法的CPU运算比乘法复杂得多。 CPU必须做更多。我对硬件知之甚少,但你可以找到很多关于常见分区实现的信息(例如基于newton-raphson算法)。

我还要小心,总是使用倒数的乘法而不是除法来获得CPU性能:它们可能不会给出完全相同的结果。根据您的申请,这可能会也可能不重要。