2011-05-21 37 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