日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

neon浮点运算_ARM 浮点运算详解

發布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 neon浮点运算_ARM 浮点运算详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原標題: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 計算前后毫秒數的差值來看計算能力。

編譯:

-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 :

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

28: e3a03000 mov r3, #0

2c: e50b300c str r3, [fp, #-12]

30: ea00000d b 6c

34: e51b200c ldr r2, [fp, #-12]

38: e59f3064 ldr r3, [pc, #100] ; a4

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

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

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

74: e1520003 cmp r2, r3

78: daffffed ble 34

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

90: e1520003 cmp r2, r3

94: daffffe3 ble 28

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 :

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

28: e3a03000 mov r3, #0

2c: e50b300c str r3, [fp, #-12]

30: ea00000f b 74

34: e51b200c ldr r2, [fp, #-12]

38: e59f3068 ldr r3, [pc, #104] ; a8

3c: e7932102 ldr r2, [r3, r2, lsl #2]

40: e51b100c ldr r1, [fp, #-12]

44: e59f3060 ldr r3, [pc, #96] ; ac

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

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

7c: e1520003 cmp r2, r3

80: daffffeb ble 34

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

98: e1520003 cmp r2, r3

9c: daffffe1 ble 28

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.

責任編輯:

總結

以上是生活随笔為你收集整理的neon浮点运算_ARM 浮点运算详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。