x86 4byte浮动与8byte双打(长对长)?

Mar*_* Ba 1 c++ floating-point double x86

我们有一个测量数据处理应用程序,目前所有数据都保存为C++ float,这意味着我们的x86/Windows平台上有32bit/4byte.(32位Windows应用程序).

由于精度正在成为一个问题,因此一直在讨论转向另一种数据类型.目前讨论的选项是切换到double(8byte)或在__int64(8byte)之上实现固定的十进制类型.

__int64甚至讨论使用固定十进制解决方案作为基础类型的原因是有人声称double性能(仍)明显比处理floats 差,并且我们可能会看到使用本机整数类型存储数字的显着性能优势.(请注意,我们确实可以使用固定的小数精度,尽管代码显然会变得更复杂.)

显然我们最终需要进行基准测试,但我想问一下,加倍的声明是否会让现代处理器看到真相?我想对于大型阵列双打可能会使缓存命中更加浮动,但是否则我真的看不出它们在性能方面会有什么不同?

Fab*_*sen 5

这取决于你做了什么.增加,减少和乘法运算与当前x86和POWER架构处理器double一样快float.使用双参数时,除法,平方根和超越函数(exp,log,sin,cos等)通常明显较慢,因为它们的运行时间取决于所需的精度.

如果你去固定点,乘法和除法需要使用长整数乘法/除法指令来实现,这些指令通常比doubles 上的算术慢(因为处理器没有对它进行优化).更重要的是,如果你在32位模式下运行,需要从几个32位长的乘法中合成长64位乘以128位结果!

缓存利用率在这里是一个红色的鲱鱼.64位整数和双精度大小相同 - 如果你需要超过32位,无论如何都要吃掉那个惩罚.