c++ - 使用 double 比 float 快吗?

标签 c++ performance x86 intel osx-snow-leopard

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/

相关文章:

c++ - 在 C++ 中获取 <pair<int,int>, int*> 形式的映射的所有键

c++ - << 重载运算符,为什么它不能返回类类型(没有引用)

c++ - 按 vector 中的距离对 vector 值进行排序

MySql 的列数和参数大小对性能的影响

MySql更新优化?

assembly - 无法让 16 位汇编程序跳转到 0x1000 :0x0000

c - x86 程序集上的选择排序

.net - 从 64 位进程调用 32 位代码

c++ - 包含字符串的结构的 Boost Interprocess vector 是否需要特殊分配器?

c# - 如何获取进程使用的CPU周期数