![]() |
1
71
是的,许多CPU可以在1或2个时钟周期内执行乘法,但除法总是花费更长的时间(尽管fp除法有时比整数除法更快)。 如果你看 this answer 你会看到除法可以超过24个循环。 为什么除法要比乘法长那么多?如果你记得回到小学,你可能会记得乘法基本上可以同时进行许多加法运算。除法要求迭代减法不能同时执行,因此需要更长的时间。事实上,一些FP单元通过执行一个倒数近似并乘以它来加速除法。它没有那么精确,但速度有点快。 |
![]() |
2
17
除法本质上比乘法慢得多。 事实上,这可能是编译器 不能 (而且您可能不想)在许多情况下,由于浮点错误而进行优化。这两种说法:
是
不
语义相同-
|
![]() |
3
12
小心划分,尽可能避免划分。举个例子,举倾
通常
为了让编译器为您进行这种优化,即使结果不准确(或使用运行时变量除数),您需要如下选项
还要注意C++编译器可以折叠
除法的延迟比乘法或加法(或 FMA )在现代x86 CPU上是2到4倍,而吞吐量则是6到40倍。 一 (做一个紧密的循环 只有 部门而不是 只有 乘法)。
Divide/Sqrt装置没有完全安装管道,原因见
@NathanWhitehead's answer
. 最坏的比率是256b向量,因为(与其他执行单元不同)被除单元通常不是全宽的,所以宽向量必须分为两部分。一个不完全流水线的执行单元是如此不寻常,以至于英特尔的CPU有一个
然而,在Intel和AMD CPU(而不是KNL)上的fp division和sqrt是作为单个UOP实现的,因此它不一定对周围的代码有很大的吞吐量影响。 . 对于除法来说,最好的情况是当无序执行可以隐藏延迟时,以及当有大量的乘法和加法(或其他工作)可以与除法并行发生时。
(integer division在intel上被微编码为多个uop,所以它总是对周围的代码产生更大的影响,整数乘法。由于对高性能整数除法的需求较少,所以硬件支持也不怎么理想。相关:
microcoded instructions like
例如,这将是非常糟糕的:
您在循环中所做的就是加载/划分/存储,它们是独立的,所以重要的是吞吐量,而不是延迟。
一个还原像
但在这种情况下(
approximating a function like
为了
在这种情况下,我们不会在划分延迟上遇到瓶颈,因为无序执行可以使循环的多个迭代在数组上运行。
我们不存在分歧的瓶颈
吞吐量
只要我们的多项式足够大,我们每10个fma指令只有一个除法。(在真实的
当你确实需要分开的时候,通常最好是分开而不是
|
![]() |
4
9
对。我所知道的每个FPU执行乘法比除法快得多。 然而,现代PC是 非常 快。它们还包含管道化架构,可以在许多情况下消除差异。最重要的是,任何合适的编译器都将执行您在中显示的除法操作。 编译时间 启用优化后。对于更新后的示例,任何合适的编译器都会自己执行该转换。 所以一般来说 你应该担心代码的可读性 ,让编译器担心如何快速执行。只有当您对该行的速度测量有问题时,才应该担心为了速度而歪曲代码。编译器很清楚什么比CPU上的更快,而且通常比您希望的优化器要好得多。 |
![]() |
5
6
考虑两个n位数字的乘法需要什么。使用最简单的方法,您取一个数字x,反复移位,并有条件地将其添加到一个累加器中(基于另一个数字y中的一个位)。添加n个之后,您就完成了。您的结果符合2n位。 对于除法,从2n位的x和n位的y开始计算x/y。最简单的方法是长除法,但使用二进制。在每一个阶段,你都要做一个比较和一个减法来得到更多的商。这需要你N步。 有些区别:乘法的每一步只需要看1位;除法的每一步在比较时都需要看N位。乘法的每个阶段都独立于所有其他阶段(不考虑部分积的添加顺序);对于除法,每个步骤都取决于前一步。这在硬件方面是个大问题。如果事情可以独立完成,那么它们可以在一个时钟周期内同时发生。 |
|
6
2
牛顿-瑞森通过线性代数的应用,解决了O(M(N))复杂性中的整数除法。比其他O(n*n)复杂性更快。 在代码中,该方法包含10mults9adds2bitwiseshifts。 这就解释了为什么一个除法的CPU节拍大约是乘法的12倍。 |
![]() |
7
1
答案取决于您正在为其编程的平台。 例如,在x86上对数组执行大量乘法应该比执行除法快得多,因为编译器应该创建使用SIMD指令的汇编程序代码。由于在SIMD指令中没有除法,那么使用乘法然后除法可以看到很大的改进。 |
|
Rik Bloemers · for循环不接受任何浮点变量 3 年前 |
![]() |
zell · 为什么存储7个浮点数需要34字节? 3 年前 |
![]() |
Atharva Sunil Sathe · 如何删除任意数的小数点? 3 年前 |
![]() |
user1658887 · 为什么**2!=a*a一些彩车? 7 年前 |