硬浮點Hard-float
編譯器將代碼直接編譯後給硬件浮點協處理器(浮點運算單元FPU)去執行。FPU通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬件浮點運算單元FPU當然會帶來性能的提升。因爲往往一個浮點的函數調用需要幾個或者幾十個時鐘週期。
軟浮點 Soft-float
編譯器把浮點運算轉換成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。
軟浮點支持是由交叉工具鏈提供的功能,與Linux內核無關。當使用軟浮點工具鏈編譯浮點操作時,編譯器會用內聯的浮點庫替換掉浮點操作,使得生成的機器碼完全不含浮點指令,但是又能夠完成正確的浮點操作。
在 ARMv7 體系結構之前,VFP 代表矢量浮點體系結構,並曾用於矢量運算。
對於許多應用來說,設置硬件浮點至關重要,在與 NEON™ 多媒體處理功能結合使用時,硬件浮點可用於增強圖像應用程序的性能(如縮放、2D 和 3D 轉換、字體生成和數字過濾)。
NEON是通用的SIMD(單指令多數據)引擎。通過NEON可以加速多媒體和信號的處理算法。NEON的函數是C語言風格,但是編譯後成爲彙編語句,這樣執行的效率會提高。Neon是ARM核心附帶的浮點SIMD引擎,可以把它當一個DSP用。如果不使用Neon,就只能用CPU自帶的VFP進行浮點運算。標準A8的VFP沒有管線化,速度是比較低的。A9的VFP管線化後,效能有明顯提升,但還是不如Neon。
Neon支持與VFP類似,都需要編譯器和Kernel雙方支持纔可以。
Kernel配置中:
Floatingpoint emulation --->
[*]VFP-format floating point maths
[ ] Advanced SIMD (NEON) Extension support
需要選中。
想要使用硬件浮點協處理器來幫助運算Application中的浮點運算。需要以下幾個前提條件:
1. Kernel中設置支持硬件協處理器。
2. 編譯器支持將浮點運算翻譯成硬件浮點運算指令,或者在需要浮點運算的時候手動調用相應的浮點運算指令。
編譯選項:
-mfpu =name(neon orvfpvx)指定FPU 單元
-mfloat-abi= name(soft、hard、 softfp):指定軟件浮點或硬件浮點或 兼容軟浮點調用接口
如果只指定 -mfpu,那麼默認編譯不會選擇選擇硬件浮點指令集
如果只指定 -mfloat-abi = hard或者softfp,那麼編譯會使用硬件浮點指令集