我正在开发一个运行时速度比精度更重要的应用程序。数字运算涉及浮点运算,我担心double和/或long double在软件中处理,而不是在处理器上本地处理(这在32位arch上总是正确的,对吧?)。我希望有条件地使用硬件支持的最高精度进行编译,但我还没有找到一种快速而简单的方法来检测软件仿真。我在GNU/Linux上使用g++,我不关心可移植性。它在x86 arch上运行,所以我假设float总是原生的。
发布于 2011-05-07 00:49:38
现代x86上的浮点单元是双精度的(事实上,它甚至比双精度还要大),而不是浮点数(32位中的"32“描述的是整数寄存器宽度,而不是浮点宽度)。然而,如果您的代码正在利用矢量化的SSE指令,那么情况就不是这样了,这些指令并行地执行4个单操作或2个双操作。
如果不是,那么将你的应用程序从浮动切换到双倍所带来的主要速度影响将来自于增加的内存带宽。
发布于 2011-05-07 00:56:37
(这在32位arch上总是正确的,对吧?)
不是的。普通的CPU都有专用于double的硬件(在某些情况下long double也是如此)。老实说,如果性能是个问题,那么你应该了解你的CPU。查看CPU手册,找出每种数据类型的性能损失是多少。
即使在缺乏“适当的”double支持的CPU上,它仍然不能在软件中模拟。Cell CPU (PlayStation3的名气)只是通过FPU传递两次double,所以它比float计算要昂贵得多,但它不是软件仿真。您仍然拥有用于double处理的专用指令。它们只是比等效的float指令效率低而已。
除非您的目标是有20年历史的CPU或有限的小型嵌入式处理器,否则浮点指令将在硬件中处理,尽管并不是所有的体系结构都能同样有效地处理每种数据类型
发布于 2011-05-07 01:14:34
x86在硬件上做了float、double和更多,并且已经做了很长时间。许多现代的32位程序都假定支持SSE2,因为它已经存在好几年了,并且可以依赖于出现在消费者芯片上。
https://stackoverflow.com/questions/5914484
复制相似问题