我正在开发一个运行时速度比精度更重要的应用程序。数字运算涉及浮点运算,我担心在软件中处理double
和/或long double
而不是处理器本机处理(在32位拱门上总是如此?) 。我想在硬件支持下使用最高精度进行有条件的编译,但我还没有找到一种快速简便的方法来检测软件仿真。我在GNU / Linux上使用g ++而我并不关心可移植性。它在x86 arch上运行,所以我假设float
始终是原生的。
答案 0 :(得分:3)
现代x86上的浮点单元(FPU)本身是双倍的(事实上,它甚至大于双倍),而不是浮点数(32位的“32”描述整数寄存器宽度,而不是浮点数宽度)。但是,如果您的代码利用了矢量化SSE指令,并行执行4次单行或2次双重操作,则情况并非如此。
如果没有,那么通过将应用程序从浮动切换到双倍来实现主速度将会增加内存带宽。
答案 1 :(得分:3)
(这在32位拱门上总是如此吗?)
没有。通用CPU具有double
的专用硬件(在某些情况下还有long double
)。老实说,如果性能是一个问题,那么你应该知道你的CPU。点击CPU手册,找出每种数据类型的性能损失。
即使在缺乏“正确”double
支持的CPU上,它仍然没有在软件中模拟。 Cell(Playstation 3成名)只是通过FPU两次传递double
,因此它比float
计算成本高得多,但它不是软件仿真。您仍然拥有double
处理的专用说明。它们的效率低于等效的float
指令。
除非你的目标是20年前的CPU或小型有限的嵌入式处理器,否则浮点指令将在硬件中处理,尽管并非所有架构都能同等有效地处理每种数据类型
答案 2 :(得分:3)
x86在硬件中执行float
,double
等等,并且已经做了很长时间。许多现代32位程序都假设SSE2支持,因为它已经存在了几年,并且可以依赖于存在于消费者芯片上。
答案 3 :(得分:1)
在x86上,硬件内部通常使用80位,这对于双倍来说已经足够了。
您确定性能是一个真正的问题(来自分析代码)还是只是猜测它可能不受支持?