gpt4 book ai didi

floating-point - 浮点加法与浮点乘法的相对速度是多少

转载 作者:行者123 更新时间:2023-12-03 09:20:20 25 4
gpt4 key购买 nike

一两年前,编写数字代码以避免使用乘法和除法而使用加法和减法是值得的。一个很好的例子是使用 forward differences计算多项式曲线而不是直接计算多项式。

情况仍然如此,还是现代计算机体系结构已经发展到 *,/不再比 +,- 慢很多倍的地步?

具体来说,我对在具有大量板载浮点硬件的现代典型 x86 芯片上运行的已编译 C/C++ 代码感兴趣,而不是试图在软件中执行 FP 的小型微型计算机。我意识到流水线和其他架构增强功能排除了特定的周期计数,但我仍然想获得有用的直觉。

最佳答案

它还取决于指令组合。您的处理器将有多个计算单元随时待命,如果所有计算单元一直被填满,您将获得最大吞吐量。因此,执行 mul 的循环与执行循环或添加一样快 - 但如果表达式变得更复杂,则相同。

例如,以这个循环为例:

for(int j=0;j<NUMITER;j++) {
for(int i=1;i<NUMEL;i++) {
bla += 2.1 + arr1[i] + arr2[i] + arr3[i] + arr4[i] ;
}
}

对于 NUMITER=10^7,NUMEL=10^2,两个数组都初始化为小的正数(NaN 慢得多),在 64 位 proc 上使用 double 数需要 6.0 秒。如果我用
bla += 2.1 * arr1[i] + arr2[i] + arr3[i] * arr4[i] ;

只需要 1.7 秒......所以由于我们“过度”添加,muls 基本上是免费的;增加的减少有所帮助。它变得更加困惑:
bla += 2.1 + arr1[i] * arr2[i] + arr3[i] * arr4[i] ;

-- 相同的 mul/add 分布,但现在常数被加入而不是乘以 - 需要 3.7 秒。您的处理器可能已优化为更有效地执行典型的数值计算;所以像 muls 的总和和缩放的总和这样的点积几乎是最好的;添加常量并不常见,所以速度较慢......
bla += someval + arr1[i] * arr2[i] + arr3[i] * arr4[i] ; /*someval == 2.1*/

再次需要 1.7 秒。
bla += someval + arr1[i] + arr2[i] + arr3[i] + arr4[i] ; /*someval == 2.1*/

(与初始循环相同,但没有昂贵的常量添加:2.1 秒)
bla += someval * arr1[i] * arr2[i] * arr3[i] * arr4[i] ; /*someval == 2.1*/

(主要是 muls,但还有一个:1.9 秒)

所以,基本上;很难说哪个更快,但如果你想避免瓶颈,更重要的是要有一个理智的组合,避免 NaN 或 INF,避免添加常量。无论您做什么,请确保您测试并测试各种编译器设置,因为通常很小的更改就会产生影响。

还有一些案例:
bla *= someval; // someval very near 1.0; takes 2.1 seconds
bla *= arr1[i] ;// arr1[i] all very near 1.0; takes 66(!) seconds
bla += someval + arr1[i] * arr2[i] + arr3[i] * arr4[i] ; // 1.6 seconds
bla += someval + arr1[i] * arr2[i] + arr3[i] * arr4[i] ; //32-bit mode, 2.2 seconds
bla += someval + arr1[i] * arr2[i] + arr3[i] * arr4[i] ; //32-bit mode, floats 2.2 seconds
bla += someval * arr1[i]* arr2[i];// 0.9 in x64, 1.6 in x86
bla += someval * arr1[i];// 0.55 in x64, 0.8 in x86
bla += arr1[i] * arr2[i];// 0.8 in x64, 0.8 in x86, 0.95 in CLR+x64, 0.8 in CLR+x86

关于floating-point - 浮点加法与浮点乘法的相对速度是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1146455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com