2011-05-21 70 views
2

我想知道在某些机器上double可能比float更快。C++编译器能否自动优化float以使我翻倍?

但是,我正在执行的操作确实只需要浮点精度。但是,他们在图像处理,我希望使用最快的之一。

我可以在任何地方使用float并相信优化的VC++ 2008编译器会在它认为更合适的情况下将其转换为double吗?我不明白这会如何破坏代码。

在此先感谢!

+3

编号精度是由设计师做出的设计决定。 “认为它更合适”?这将如何工作?你能给这个规则吗?一个不会破坏某人计算的规则? – 2011-05-21 02:36:03

+0

在32位机器上,一个32位'float'的速度至少是[64/128-bit]'double'的速度。 – 2011-05-21 02:40:38

+0

不,它不会为你优化它。但是,你总是可以把它作为一个寄存器 – 2011-05-21 04:31:59

回答

0

当代码需要将变量存储在内存中时,机会在大多数体系结构中,需要32位,double需要64位。进行内存大小转换会阻止对此类进行完全优化。

您确定浮点数学是您的应用程序的瓶颈吗?也许分析将揭示另一个可能的改进来源。

3

不,编译器不会将基本类型(如float)更改为双精度优化。

如果您认为这很可能,请在共同标题中为您的浮点使用typedef,例如, typedef float FASTFLOAT;并在整个代码中使用FASTFLOAT(或其他名称)。然后,您可以更改一个中央typedef,并在整个代码中更改该类型。

我自己的经验是float和double在x86/x64平台上的性能在数学运算上基本上是可比较的,我倾向于使用double。如果您正在处理大量数据(并且遇到内存带宽问题,而不是计算上的限制),那么浮点数可能是double的一半,您可能会从性能上获益。

您还需要了解各种优化标志的效果。根据您的目标平台要求,您可能能够更积极地进行优化。

+0

它可能不会改变变量的类型。但如果额外的速度很有用,它仍然可以选择在double上进行算术运算,并将其转换回浮点数以存储在变量中。 – 2011-05-21 07:19:22

+0

够正确。此外,我记得,浮动操作是在硬件上执行的40位值,然后被截断为32位存储。 (任何人都可以找到对此的引用吗?) – holtavolt 2011-05-21 13:01:24

2

首先,编译器不会更改浮点类型,除非它必须存储并且从不存储在存储声明中。

float将不会低于double,但如果您确实需要快速处理,则需要使用可以生成SSE2或SSE3代码的编译器进行研究,或者需要使用这些指令编写重处理例程。 IIRC,有些工具可以帮助您在必要时对处理器管线进行微处理。最后我与这个(几年前)搞混了,英特尔有一个名为IPP的库,可以通过矢量化你的数学来帮助你。

我从来没有听说过一个体系结构,其中floatdouble慢,如果只是因为内存带宽要求加倍,如果您使用double。任何可以执行单周期操作的FPU都可以执行单周期float操作,但最多只需稍作修改。

但是,马克有个好主意:如果你认为它的速度很慢,那么对你的代码进行剖析。你可能会发现真正的问题在其他地方,比如隐藏的类型转换或者函数调用的开销,你认为内联没有被内联。

+1

尽管不完全是float vs double问题,但在x86上,FPU的寄存器宽度为80位,浮点数和双精度分别为32位和64位。严格阅读C标准需要频繁截断您所请求存储类型的宽度;这需要时间。 GCC有一个'-ffast-math'标志来禁止这些截断,并以高于允许的精度执行一些中间计算;但是,我不知道MSVC。 – bdonlan 2011-05-21 02:53:12