VFP--ARM浮點體系結構機介紹【轉】


轉自:https://www.cnblogs.com/Akagi201/archive/2012/03/31/2427063.html

浮點

    ARM 浮點體系結構 (VFP) 為半精度、單精度和雙精度浮點運算中的浮點操作提供硬件支持。它完全符合 IEEE 754 標准,並提供完全軟件庫支持。

ARM VFP 的浮點功能為汽車動力系統、車身控制應用和圖像應用(如打印中的縮放、轉換和字體生成以及圖形中的 3D 轉換、FFT 和過濾)中使用的浮點運算提供增強的性能。下一代消費類產品(如 Internet 設備、機頂盒家庭網關)可直接從 ARM VFP 受益。

VFP 應用

  • 汽車控制應用
    • 動力系統
    • ABS、牽引控制和主動懸架
  • 3D 圖形
    • 數字消費類產品
    • 機頂盒、游戲
  • 圖像
  • 工業控制系統
    • 運動控制

工業和汽車領域中的許多實時控制應用都得益於 ARM VFP 提供的浮點的動態范圍和准確性。汽車動力系統、防抱死制動系統、牽引控制和主動懸架系統都是關鍵業務應用,它們對准確性和可預測性的要求必不可少。

VFP 體系結構版本

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

    對於許多應用來說,設置硬件浮點至關重要,並且硬件浮點可用作使用高級設計工具(如 MatLab、MATRIXx 和 LabVIEW)直接對系統建模和派生應用程序代碼的片上系統 (SoC) 設計流程的一部分。在與 NEON™ 多媒體處理功能結合使用時,硬件浮點可用於增強圖像應用程序的性能(如縮放、2D 和 3D 轉換、字體生成和數字過濾)。

迄今為止,VFP 主要有三個版本:

<ol>
  • VFPv1 已廢棄。要獲取詳細信息,可向 ARM 發送相關請求。
  • VFPv2 是對 ARMv5TE、ARMv5TEJ 和 ARMv6 體系結構中 ARM 指令集的可選擴展。
  • VFPv3 是對 ARMv7-A 和 ARMv7-R 配置文件中 ARM、Thumb&reg; 和 ThumbEE 指令集的可選擴展。可使用 32 個或 16 個雙字長寄存器實現 VFPv3。術語 VFPv3-D32 和 VFPv3-D16 用於區別這兩個實現選項。可通過半精度擴展對 VFPv3 進行擴展,這些擴展可在半精度浮點和單精度浮點之間提供雙向轉換功能。</ol>

 

VFP9-S

ARM VFP9-S 可合成矢量浮點 (VFP) 協處理器與所有 ARM9E™ 系列處理器內核兼容。它支持單精度和雙精度浮點;使 ARM 支持軟件完全符合 IEEE754,或僅使硬件大致符合 IEEE754。支持代碼包含兩個組件:例行程序庫和一組異常處理程序,前者執行未實現函數(如超越函數)和一些支持的函數(如除法),后者用於處理異常情況。

VFP9-S 功能

  • ARM VFPv2 ISA
  • 16 個雙精度或 32 個單精度寄存器
  • 使 ARM 支持代碼完全符合 IEEE754
  • 大致符合 IEEE754 的快速運行模式(僅硬件)
  • 與 VFP10 和 VFP11 保持二進制兼容
  • 可使用支持工具和單元庫移植到任何工藝
  • 100 - 130K 門
  • 1.3Mflops/MHz
  • 面積 <1.0mm2 TSMC 0.13µm G
  • 180 - 210MHz(最壞情況)TSMC 0.13µm G
  • <0.4mW/MHz(典型情況)功耗 TSMC 0.13µm G

VFP9-S 優點

ARM VFP9-S 的矢量處理功能對汽車動力系統、車身控制應用和圖像應用(如打印中的縮放、轉換和字體生成以及圖形中的 3D 轉換、FFT 和過濾)中使用的浮點體系結構提供增強的性能。下一代消費類產品(如 Internet 設備、機頂盒和家庭網關)可直接從 ARM VFP9 受益。

VFP9-S 應用

  • 汽車控制應用:
    • 動力系統
    • ABS、牽引控制和主動懸架
  • 3D 圖形
  • 數字消費類產品
    • 機頂盒、游戲機
  • 圖像
    • 激光打印機、靜態數碼相機、數碼攝像機
  • 工業控制系統
    • 運動控制

工業和汽車領域中的許多實時控制應用都得益於 ARM VFP9-S 提供的浮點的動態范圍和准確性。汽車動力系統、防抱死制動系統、牽引控制和主動懸架系統都是關鍵業務應用,它們對准確性和可預測性的要求必不可少。

將 VFP9-S 整合到 SoC 設計中后,可使開發速度更快、性能更可靠,因為技術計算工具(MatLab、MATRIxx 等)可用於直接對系統建模和派生應用程序代碼,從而確保系統設計行為更准確、可靠和可預測。

 

VFP10

ARM VFP10 是硬宏單元矢量浮點 (VFP) 協處理器,與所有 ARM10E™ 系列的 CPU 內核兼容。它支持單精度和雙精度浮點;使 ARM 支持軟件完全符合 IEEE754,或僅使硬件大致符合 IEEE754。支持代碼包含兩個組件:例行程序庫和一組異常處理程序,前者執行未實現功能(如超越函數)和一些支持的功能(如分割),后者用於處理異常情況。

VFP10 功能

  • ISA 是 ARM VFPv2
  • 16 個雙精度或 32 個單精度寄存器
  • 具有 64 位 LD/ST 接口的大型獨立寄存器文件
  • 使 ARM 支持代碼完全符合 IEEE754
  • 大致符合 IEEE754 的快速運行模式(僅硬件)
  • 與 VFP9 和 VFP11 保持二進制兼容
  • 標量和矢量操作支持(FP DSP 的理想選擇)
  • 並行 LD/ST、FMAC 和 DIV/SQRT 執行引擎
  • 2.0Mflops/MHz
  • 面積 ~1.16mm 2 TSMC 0.13µm LV
  • 最多 325MHz(最壞情況)TSMC 0.13µm LV
  • <0.4mW/MHz(典型情況)功耗 TSMC 0.13µm LV

VFP10 指令集 (VFPv2)

  • 運算:
    • Add、Sub、Mult、Neg-Mult、Negate、Abs Value、Compare、Div、Square Root
  • FMAC(單版本和雙版本):
    • Multiply-Add、Multiply-Subtract、Neg-Multiply-Add、Neg-Multiply-Subtract
  • 類型轉換
  • 加載/存儲標量和矢量,64 位/周期

VFP10 優點

ARM VFP10 的矢量處理功能為汽車動力系統、車身控制應用和圖像應用(如打印中的縮放、轉換和字體生成以及圖形中的 3D 轉換、FFT 和過濾)中使用的浮點體系結構提供增強的性能。下一代消費類產品(如 Internet 設備、機頂盒和家庭)可直接從 ARM VFP10 受益。

許多應用程序本身可從浮點的動態范圍和准確性中受益。許多應用程序將移至到嵌入式應用程序,這些應用程序多年來始終基於浮點。推出 VFP10 后,可使用技術計算工具(如 MatLab 或 MATRIxx)輕松轉換到嵌入式領域。

VFP10 應用

汽車控制應用

  • 動力系統
  • ABS
  • 牽引控制和主動懸架
  • 數字消費類產品
    • 機頂盒、游戲機
  • 3D 圖形
    • FFT 和 FIR 過濾
  • 圖像
    • 激光打印機、靜態數碼相機、數碼攝像機
  • 工業控制系統
    • 運動控制

工業和汽車領域中的許多實時控制應用程序均從 ARM VFP10 提供的動態范圍和准確性中受益。汽車動力系統、防抱死制動系統、牽引控制和主動懸架系統都是關鍵業務應用程序,它們對准確性和可預測性的要求必不可少。將 VFP10 整合到 SoC 設計中后,可使開發速度更快、性能更可靠,因為技術計算工具(MatLab、MATRIxx 等)可用於直接對系統建模和派生應用程序代碼,從而確保系統設計行為更准確、可靠和可預測。

 

查看http://linux.chinaunix.net/bbs/thread-1125926-1-1.html可能有所收獲

///////////////////////////////////////

一:早期ARM上的浮點模擬器:

早期的ARM沒有協處理器,所以浮點運算是由CPU來模擬的,即所需浮點運算均在浮點運算模擬器(float math emulation)上進行,需要的浮點運算,常要耗費數千個循環才能執行完畢,因此特別緩慢。

直到今天,在ARM Kernel配置時,都有如下選項:

Floating point emulation --->

[ ] NWFPE math emulation

[ ] FastFPE math emulation (EXPERIMENTAL)

在這里,可以配置ARM 浮點模擬器。

 

浮點模擬器 模擬浮點是利用了undefined instrction handler,在運算過程中遇到浮點計算是產生異常中斷,這么做帶來的后果是帶來極頻繁的exception,大大增加中斷延遲,降低系統實時性。

 

二:軟浮點技術:

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

 

三:浮點協處理器:

在較新版本的ARM中,可以添加協處理器。 一些ARM CPU為了更好的處理浮點計算的需要,添加了浮點協處理器。

並定義了浮點指令集。 如果不存在實際的硬件,則這些指令被截獲並由浮點模擬器模塊(FPEmulator)來執行。

 

 

四: 硬件浮點協處理器以及對應指令集的使用:

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

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

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

 

1. Kernle的支持:

如果Kernel不支持浮點協處理器,則因為協處理器寄存器等使用權限等問題,協處理器對應指令無法運行。

網絡上有位高手指出:

CP15 c1 協處理器訪問控制寄存器,這個寄存器規定了用戶模式和特權對協處理器的訪問權限。我們要使用VFP當然要運行用戶模式訪問CP10和CP11。
另外一個寄存器是VFP的FPEXC Bit30這是VFP功能的使用位。
其實操作系統在做了這兩件事情之后,用戶程序就可以使用VFP了。當然,Kernel 除了這2件事外,還處理了其他一些事情。

 

Floating point emulation --->
[*] VFP-format floating point maths

Include VFP support code in the kernel. This is needed IF your hardware includes a VFP unit.

 

2. 編譯器指定浮點指令:

編譯器可以顯式指定將浮點運算翻譯成何種浮點指令。

 

如果編譯器支持軟浮點,則其可能會將浮點運算翻譯成編譯器中自帶的浮點庫。則不會有真正的浮點運算。

否則,可以翻譯成FPA(Floating Point Accelerator)指令。 FPA指令再去查看是否有浮點模擬器。

還可以將浮點運算指定為VFP(vector floating point)指令或者neon向量浮點指令。

 

 

五. 編譯器指定編譯硬浮點指令:

測試浮點加減乘除等運算的時間長度:

 

float src_mem_32[1024] = {1.024};


float dst_mem_32[1024] = {0.933};

 

for(j = 0; j < 1024; j++)
{
for(i = 0; i < 1024; i++)
{
src_32 = src_mem_32[i] + dst_mem_32[i];
}
}

通過printf 計算前后毫秒數的差值來看計算能力。

 

編譯:

arm-hisiv200-linux-gcc -c -Wall fcpu.c -o fcpu.o

arm-hisiv200-linux-gcc fcpu.o -o FCPU -L./

運行,則得到32位浮點數加1024次所需要時間。

 

如果要使用VFP呢?

arm-hisiv200-linux-gcc -c -Wall -mfpu=vfp -mfloat-abi=softfp fcpu.c -o fcpu.o

arm-hisiv200-linux-gcc -Wall -mfpu=vfp -mfloat-abi=softfp fcpu.o -o FCPU -L./

則運行后發現,所需要時間幾乎減小了一半。 說明還是非常有效果的。

關於-mfpu -mfloat-abi講解:見附錄2。

 

另外,如何才能在直觀的檢查出是否使用VFP呢?

可以通過察看編譯出的ASM程序得到結論。

 

#arm-hisiv200-linux-objdump -d fcpu.o

00000000 <test_F32bit_addition>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd00c sub sp, sp, #12
c: e3a03000 mov r3, #0
10: e50b300c str r3, [fp, #-12]
14: e3a03000 mov r3, #0
18: e50b3008 str r3, [fp, #-8]
1c: e3a03000 mov r3, #0
20: e50b3008 str r3, [fp, #-8]
24: ea000017 b 88 <test_F32bit_addition+0x88>
28: e3a03000 mov r3, #0
2c: e50b300c str r3, [fp, #-12]
30: ea00000d b 6c <test_F32bit_addition+0x6c>
34: e51b200c ldr r2, [fp, #-12]
38: e59f3064 ldr r3, [pc, #100] ; a4 <test_F32bit_addition+0xa4>
3c: e0831102 add r1, r3, r2, lsl #2
40: ed917a00 vldr s14, [r1]
44: e51b200c ldr r2, [fp, #-12]
48: e59f3058 ldr r3, [pc, #88] ; a8 <test_F32bit_addition+0xa8>
4c: e0831102 add r1, r3, r2, lsl #2
50: edd17a00 vldr s15, [r1]
54: ee777a27 vadd.f32 s15, s14, s15
58: e59f304c ldr r3, [pc, #76] ; ac <test_F32bit_addition+0xac>
5c: edc37a00 vstr s15, [r3]
60: e51b300c ldr r3, [fp, #-12]
64: e2833001 add r3, r3, #1
68: e50b300c str r3, [fp, #-12]
6c: e51b200c ldr r2, [fp, #-12]
70: e59f3038 ldr r3, [pc, #56] ; b0 <test_F32bit_addition+0xb0>
74: e1520003 cmp r2, r3
78: daffffed ble 34 <test_F32bit_addition+0x34>
7c: e51b3008 ldr r3, [fp, #-8]
80: e2833001 add r3, r3, #1
84: e50b3008 str r3, [fp, #-8]
88: e51b2008 ldr r2, [fp, #-8]
8c: e59f301c ldr r3, [pc, #28] ; b0 <test_F32bit_addition+0xb0>
90: e1520003 cmp r2, r3
94: daffffe3 ble 28 <test_F32bit_addition+0x28>
98: e28bd000 add sp, fp, #0
9c: e49db004 pop {fp} ; (ldr fp, [sp], #4)
a0: e12fff1e bx lr

 

這里明顯包含vfp指令。 所以是使用vfp指令的:

arm-hisiv200-linux-gcc -c -Wall -mfpu=vfp -mfloat-abi=softfp fcpu.c -o fcpu.o

注意:VFP 指令指令在附錄1中。

 

 

如果使用:

arm-hisiv200-linux-gcc -c -Wall fcpu.c -o fcpu.o

 

#arm-hisiv200-linux-objdump -d fcpu.o

00000000 <test_F32bit_addition>:
0: e92d4800 push {fp, lr}
4: e28db004 add fp, sp, #4
8: e24dd008 sub sp, sp, #8
c: e3a03000 mov r3, #0
10: e50b300c str r3, [fp, #-12]
14: e3a03000 mov r3, #0
18: e50b3008 str r3, [fp, #-8]
1c: e3a03000 mov r3, #0
20: e50b3008 str r3, [fp, #-8]
24: ea000019 b 90 <test_F32bit_addition+0x90>
28: e3a03000 mov r3, #0
2c: e50b300c str r3, [fp, #-12]
30: ea00000f b 74 <test_F32bit_addition+0x74>
34: e51b200c ldr r2, [fp, #-12]
38: e59f3068 ldr r3, [pc, #104] ; a8 <test_F32bit_addition+0xa8>
3c: e7932102 ldr r2, [r3, r2, lsl #2]
40: e51b100c ldr r1, [fp, #-12]
44: e59f3060 ldr r3, [pc, #96] ; ac <test_F32bit_addition+0xac>
48: e7933101 ldr r3, [r3, r1, lsl #2]
4c: e1a00002 mov r0, r2
50: e1a01003 mov r1, r3
54: ebfffffe bl 0 <__aeabi_fadd>
58: e1a03000 mov r3, r0
5c: e1a02003 mov r2, r3
60: e59f3048 ldr r3, [pc, #72] ; b0 <test_F32bit_addition+0xb0>
64: e5832000 str r2, [r3]
68: e51b300c ldr r3, [fp, #-12]
6c: e2833001 add r3, r3, #1
70: e50b300c str r3, [fp, #-12]
74: e51b200c ldr r2, [fp, #-12]
78: e59f3034 ldr r3, [pc, #52] ; b4 <test_F32bit_addition+0xb4>
7c: e1520003 cmp r2, r3
80: daffffeb ble 34 <test_F32bit_addition+0x34>
84: e51b3008 ldr r3, [fp, #-8]
88: e2833001 add r3, r3, #1
8c: e50b3008 str r3, [fp, #-8]
90: e51b2008 ldr r2, [fp, #-8]
94: e59f3018 ldr r3, [pc, #24] ; b4 <test_F32bit_addition+0xb4>
98: e1520003 cmp r2, r3
9c: daffffe1 ble 28 <test_F32bit_addition+0x28>
a0: e24bd004 sub sp, fp, #4
a4: e8bd8800 pop {fp, pc}

則不包含VFP指令。

且去調用 __aeabi_fadd

 

 

 

 

 

 

 

 

 

附錄1 :VFP 指令

可以查看arm的realView文檔。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Bcffbdga.html

 

附錄2:

-mfpu=name
-mfpe=number
-mfp=number

This specifies what floating point hardware (or hardware emulation) is available on the target. Permissible names are: fpa, fpe2, fpe3, maverick, vfp. -mfp and -mfpe are synonyms for -mfpu=fpenumber, for compatibility with older versions of GCC.

 

 

 

-mfloat-abi=name
Specifies which ABI to use for floating point values. Permissible values are: soft, softfp and hard.

soft and hard are equivalent to -msoft-float and -mhard-float respectively. softfp allows the generation of floating point instructions, but still uses the soft-float calling conventions.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM