ARM Linux Kernel浮點運算(軟浮點、硬浮點)

硬浮點Hard-float

編譯器將代碼直接編譯後給硬件浮點協處理器(浮點運算單元FPU)去執行。FPU通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬件浮點運算單元FPU當然會帶來性能的提升。因爲往往一個浮點的函數調用需要幾個或者幾十個時鐘週期。

軟浮點 Soft-float

編譯器把浮點運算轉換成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。

軟浮點支持是由交叉工具鏈提供的功能,與Linux內核無關。當使用軟浮點工具鏈編譯浮點操作時,編譯器會用內聯的浮點庫替換掉浮點操作,使得生成的機器碼完全不含浮點指令,但是又能夠完成正確的浮點操作。

ARMv7 體系結構之前,VFP 代表矢量浮點體系結構,並曾用於矢量運算。

  對於許多應用來說,設置硬件浮點至關重要,在與 NEON™ 多媒體處理功能結合使用時,硬件浮點可用於增強圖像應用程序的性能(如縮放、2D 3D 轉換、字體生成和數字過濾)。

NEON是通用的SIMD(單指令多數據)引擎。通過NEON可以加速多媒體和信號的處理算法。NEON的函數是C語言風格,但是編譯後成爲彙編語句,這樣執行的效率會提高。NeonARM核心附帶的浮點SIMD引擎,可以把它當一個DSP用。如果不使用Neon,就只能用CPU自帶的VFP進行浮點運算。標準A8VFP沒有管線化,速度是比較低的。A9VFP管線化後,效能有明顯提升,但還是不如Neon

Neon支持與VFP類似,都需要編譯器和Kernel雙方支持纔可以。

Kernel配置中:

Floatingpoint emulation  --->

[*]VFP-format floating point maths

[ ]   Advanced SIMD (NEON) Extension support

需要選中。

想要使用硬件浮點協處理器來幫助運算Application中的浮點運算。需要以下幾個前提條件:

1. Kernel中設置支持硬件協處理器。

2. 編譯器支持將浮點運算翻譯成硬件浮點運算指令,或者在需要浮點運算的時候手動調用相應的浮點運算指令。

編譯選項:

-mfpu =nameneon orvfpvx)指定FPU 單元

-mfloat-abi= namesofthard softfp):指定軟件浮點或硬件浮點或 兼容軟浮點調用接口

如果只指定 -mfpu,那麼默認編譯不會選擇選擇硬件浮點指令集

如果只指定 -mfloat-abi = hard或者softfp,那麼編譯會使用硬件浮點指令集

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章