浮点除法与浮点乘法

编码是否有任何(非微型优化)性能增益?

float f1 = 200f / 2

与...相比

float f2 = 200f * 0.5

几年前,我的一位教授告诉我,浮点数的划分比浮点乘法要慢,但没有详细说明原因。

这种说法是否适用于现代PC架构?

UPDATE1

关于评论,请考虑这种情况:

float f1;
float f2 = 2
float f3 = 3;
for( i =0 ; i < 1e8; i++)
{
  f1 = (i * f2 + i / f3) * 0.5; //or divide by 2.0f, respectively
}

更新2从评论中引用:

[我想]知道什么是算法/体系结构的要求,导致分裂在硬件上要比乘法复杂得多


是的,许多CPU可以在1或2个时钟周期内执行乘法,但分频总是需要更长的时间(尽管FP分频有时比整数除法更快)。

如果你看到这个答案,你会看到该分区可能超过24个周期。

为什么师比乘法要长得多? 如果你记得回到小学,你可能会记得,乘法基本上可以同时进行多次。 Division需要迭代减法,不能同时执行,因此需要更长的时间。 实际上,一些FP单位通过执行倒数近似并乘以该速度来加速分裂。 它不太准确,但速度更快。


除了乘法之外,Division本身就是一个慢得多的操作。

事实上,这可能是由于浮点数不准确而导致编译器不能在许多情况下进行优化(而且您可能不想)。 这两个陈述:

double d1 = 7 / 10.;
double d2 = 7 * 0.1;

在语义上并不相同 - 0.1不能完全表示为double ,所以稍微不同的值最终会被使用 - 在这种情况下用乘法替代除法将产生不同的结果!


是。 我知道的每个FPU执行乘法的速度都比分区快得多。

但是,现代个人电脑速度非常快。 它们还包含流水线架构,可以在许多情况下使差异变得可忽略不计。 最后,任何体面的编译器都会执行您在编译时显示的分割操作,并启用优化。 对于你更新的例子,任何体面的编译器都会自己执行这个转换。

所以一般而言, 您应该担心让代码易读 ,并让编译器担心使其变得更快。 只有当你对该行有速度问题时,你才会担心为了提高速度而损害代码。 编译人员很清楚哪些内容比他们的CPU更快,并且通常比你期望的要好得多。

链接地址: http://www.djcxy.com/p/15017.html

上一篇: Floating point division vs floating point multiplication

下一篇: Why don't LLVM passes optimize floating point instructions?