2013-05-20 91 views
1

我有一個程序,其中包含大型浮點值數組,並根據它們執行大量計算,稍後將這些值縮放到0到25​​5之間以充當像素值。是否有可能降低浮點計算的準確性,以便它可以說4個有效數字來提高速度,並希望減少內存中陣列的大小?以精度爲代價提高浮動計算速度?

我正在使用C++,g ++在Linux上編譯並提升多個數組。

感謝, 安格斯

+3

0到255聽起來像是一個字節!只是執行更快的整數運算。可能更快仍然存儲爲一個整數和掩碼等 –

+1

你有沒有考慮使用定點數學? –

+0

它執行什麼計算? – tmyklebu

回答

3

通常,現代處理器的浮點比32位算法更窄。有些程序可以加載和存儲16位浮點對象,但在加載時將它們轉換爲32位對象,並使用32位對象進行算術運算。如下所述,做整數運算可能比浮點運算有一些優點。

在當今的大多數硬件中,正常的浮點操作與處理器中最簡單的操作相當。可能有一些方法可以加快算術速度,但它們可能需要您正在使用的特定硬件的專業知識,並需要在軟件開發方面進行大量投資。

處理器的吞吐量對於浮點運算而言與整數運算的吞吐量相同並不少見。吞吐量是處理器可以執行的每秒操作數。但是,浮點運算可能會有更長的延遲。一個常見的情況是處理器可以在一個處理器週期內完成一個整數加法,處理器可以在四個週期內完成一個浮點加法,但它分四部分完成,每個部分可以在不同的加法與其他部分一樣。因此,儘管從浮點加法開始到完成四個週期,處理器仍然每個週期完成一次加法。

這樣做的結果是,諸如a + b + c之類的算術鏈需要8個週期才能完成浮點運算,但只需要2個整數週期。相比之下,單獨的,非鏈式算術(如a + b,c + d,e + f和g + h)在浮點或整數中有效地採用相同的時間量。所以,這個功能是否會幫助你的算術取決於你算術的細節。

許多現代處理器具有的另一個特性稱爲SIMD,單指令多數據。此功能允許處理器同時執行多個算術運算(通常是四個32位整數運算或四個32位浮點運算,有時更多運算的整數較窄,有時使用64位浮點的運算較少)。用一般的C++代碼訪問SIMD特性是很麻煩的。一些編譯器提供了一些自動使用這個。即使如此,它需要知道並關注具體細節,例如數據對齊,可能干擾並行操作的問題,以及向編譯器通知編譯代碼將執行的特定處理器模型。 SIMD特性還可以通過特殊的編譯器內置函數,宏和/或語言擴展或彙編語言來訪問。

圖像處理是一個非常流行的領域,編寫了使用SIMD特性來提供常見圖像處理操作(如圖像縮放,圖像旋轉,顏色轉換,銳化或模糊等濾鏡等)的軟件庫。

既然你提到Linux,而且我沒有和Linux一起工作,我會把它留給其他人討論什麼庫可用。

2

這些天,浮點運算通常在被設計用來處理浮點類型的全寬度的硬件來完成。將它限制在較低的精度可能會讓它變慢!這是Java遇到的一個問題:最初,float類型的數學必須在32位完成,並且在double上的數學必須在64位完成。在英特爾的硬件上這可以完成,但比運行80位數學運算要慢得多。因此,他的Java規範發生了變化。