使用双比浮动更快?

双精度值存储更高的精度,是浮点大小的两倍,但英特尔CPU优化浮点数?

也就是说,double操作的速度与+, – ,*和/或float操作一样快或者更快。

对于64位体系结构,答案是否改变?

没有一个“英特尔CPU”,特别是在哪些操作相对于其他操作被优化的情况下,但是其中大多数在CPU级别(特别是在FPU内)是这样回答你的问题的:

是+, – ,*和/?的浮动操作一样快或者更快。

是“是” – 在CPU内部然而 ,占用每个数字两倍的内存清楚地意味着高速caching上的负载更重,以及更多的内存带宽来填充和溢出来自/到RAM的高速caching行; 你关心浮点运算性能的时候就是当你做很多这样的操作的时候,所以内存和caching的考虑是至关重要的。

理查德的回答指出,还有其他的方式来执行FP操作( SSE指令;好的旧MMX是整数),尤其适用于大量数据(“SIMD”,单指令/多数据)的简单操作每个寄存器可以包装4个单精度浮点数或2个双精度浮点数,所以这个效果会更加明显。

最后,你必须进行基准testing,但是我的预测是,对于合理的(即大的 ;-)基准testing,你会发现坚持单精度的好处(当然假设你不需要额外的比特精确!-)。

如果所有的浮点计算都是在FPU中执行的,那么不,在double计算和float计算之间没有区别,因为浮点运算实际上是在FPU堆栈中以80位精度执行的。 将FPU堆栈的条目进行四舍五入以将80位浮点格式转换为double float浮点格式或float浮点格式。 将sizeof(double)字节移动到RAM / sizeof(float)字节是唯一的速度差异。

但是,如果您有可vector化的计算,那么您可以使用SSE扩展在两次double计算的同时运行四次float计算。 因此,巧妙地使用SSE指令和XMM寄存器可以在仅使用float的计算上实现更高的吞吐量。

我只是想添加到已有的伟大的答案, __m256? 同指令多数据( SIMD )C ++内部函数族可以并行操作4个 double _mm256_add_pd (例如_mm256_add_pd ),也可以并行操作8个 float (例如_mm256_add_ps )。

我不确定这是否可以转化为实际的加速,但是当使用SIMD时,每条指令处理的浮点数似乎是可能的 2倍。

在20亿次加3.3的实验中,结果是:

 Summation time in s: 2.82 summed value: 6.71089e+07 // float Summation time in s: 2.78585 summed value: 6.6e+09 // double Summation time in s: 2.76812 summed value: 6.6e+09 // long double 

所以double在C和C ++中更快,默认。 它在所有C和C ++库函数中更具可移植性和默认性。 阿洛斯双重比浮动显着更高的精度。

即使Stroustrupbuild议双重浮动:

“单精度,双精度和扩展精度的确切含义是由实现定义的,如果select问题需要对浮点计算有重大的理解,select正确的精度如果你没有这个理解,build议,花点时间学习,或者用双重的希望,最好的。“

也许唯一的情况,你应该使用浮动而不是双重在64位硬件与现代gcc。 因为浮动较小; double是8个字节,float是4个字节。

还有一点要考虑的是,如果你正在使用GPU(graphics卡)。 我与一个数字密集的项目合作,但我们并不需要双重优惠的秘密。 我们使用GPU卡来帮助进一步加速处理。 CUDA GPU需要一个特殊的软件包来支持双倍的处理速度,GPU上本地RAM的数量相当快,但相当稀less。 因此使用浮点数也可以使我们可以存储的数据量增加一倍

还有一点是记忆。 浮动RAM的数量是双打的一半。 如果你正在处理非常大的数据集,这可能是一个真正重要的因素。 如果使用双重意味着你必须caching到磁盘vs纯内存,你的差异将是巨大的。

所以对于我正在使用的应用程序来说,差异是非常重要的。

唯一真正有用的答案是:只有你可以告诉。 你需要为你的场景设定基准。 教学和记忆模式的细微变化可能会产生重大影响。

如果你使用FPU或者SSEtypes的硬件,它肯定是很重要的(前者的所有工作都是用80来扩展精度的,所以double会更接近,后来是32bit的,也就是float)。

更新:s / MMX / SSE /在另一个答案中指出。

浮点通常是对通用CPU的扩展。 速度因此将取决于所使用的硬件平台。 如果平台有浮点支持,如果有任何区别,我会感到惊讶。