通过编码是否有任何(非微优化)性能提升
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引用:
我想知道导致>除法在硬件上比乘法
复杂得多的算法/体系结构要求是什么
发布于 2010-11-08 23:09:49
是的,许多CPU可以在1或2个时钟周期内执行乘法,但除法总是需要更长的时间(尽管FP除法有时比整数除法更快)。
如果你看一下this answer,你会发现除法可以超过24个周期。
为什么除法比乘法要花这么长的时间?如果你记得上小学的时候,你可能还记得,乘法基本上可以通过许多同时加法来执行。除法需要迭代减法,不能同时执行,因此需要更长的时间。事实上,一些FP单元通过执行倒数近似并乘以该倒数来加速除法。它不是很准确,但有点快。
发布于 2010-11-08 23:20:11
从本质上讲,除法比乘法慢得多。
事实上,这可能是编译器在许多情况下由于浮点不准确而无法(并且您可能不想)优化的东西。这两个陈述:
double d1 = 7 / 10.;
double d2 = 7 * 0.1;
在语义上是不相同的- 0.1
不能精确地表示为double
,所以最终会使用一个稍微不同的值-在这种情况下用乘法代替除法会产生不同的结果!
发布于 2010-11-08 23:13:25
是。据我所知,每个FPU执行乘法的速度都比除法快得多。
然而,现代的PC速度非常快。它们还包含流水线架构,这使得差异在许多情况下可以忽略不计。最重要的是,任何像样的编译器都会执行您在编译时显示的除法操作,并开启优化。对于您更新的示例,任何像样的编译器都会自己执行该转换。
因此,一般来说,你应该考虑让你的代码变得可读的,并让编译器考虑如何让它变得更快。只有当你有测量到的速度问题时,你才应该担心为了速度而破坏代码。编译器很清楚什么比它们的CPU更快,并且通常是比你希望的要好得多的优化器。
https://stackoverflow.com/questions/4125033
复制相似问题