double 值存储更高的精度并且是 float 的两倍,但英特尔 CPU 是否针对 float 进行了优化?
也就是说, double 运算与 +、-、* 和/的浮点运算一样快还是更快?
64 位架构的答案会改变吗?
最佳答案
没有一个单一的“英特尔 CPU”,尤其是在哪些操作相对于其他人进行了优化方面!但其中大多数在 CPU 级别(特别是在 FPU 内)是这样的问题:
are double operations just as fast or faster than float operations for +, -, *, and /?
是"is" -- 在 CPU 内,除了除法和 sqrt 是 somewhat slower for double
than for float
. (假设您的编译器使用 SSE2 进行标量 FP 数学,就像所有 x86-64 编译器一样,以及一些 32 位编译器取决于选项。旧版 x87 在寄存器中没有不同的宽度,只有在内存中(它在加载/存储时转换),所以从历史上看,double
的 sqrt 和除法也一样慢)。
例如,Haswell 有一个 divsd
每 8 到 14 个周期 1 个吞吐量(取决于数据),但是 divss
(标量单)吞吐量为每 7 个周期之一。 x87 fdiv
是 8 到 18 个周期的吞吐量。 (来自 https://agner.org/optimize/ 的数字。延迟与除法的吞吐量相关,但高于吞吐量数字。)
float
许多库函数的版本,如 logf(float)
和 sinf(float)
也将比 log(double)
更快和 sin(double)
,因为它们要正确的精度要少得多。他们可以使用具有较少项的多项式近似来获得 float
的完整精度。与 double
然而,每个数字占用两倍的内存显然意味着缓存负载更重,内存带宽更大来填充和溢出这些缓存行/到内存;您关心浮点运算性能的时间是在您执行大量此类运算时,因此内存和缓存考虑因素至关重要。
@Richard 的回答指出,还有其他方法可以执行 FP 操作(SSE/SSE2 指令;好的旧 MMX 仅限整数),特别适用于大量数据的简单操作(“SIMD”,单指令/多数据),其中每个 vector 寄存器可以打包4个单精度 float 或仅2个 double float ,所以这种效果会更加显着。
最后,您确实必须进行基准测试,但我的预测是,对于合理的(即 large;-) 基准,您会发现坚持单精度的优势(当然假设你不需要需要额外的精度!-)。
关于c++ - 使用 double 比 float 快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426165/