1、前言
NEON:SIMD(Single Instruction Multiple Data 單指令多重資料) 指令集, 其針對多媒體和訊号處理程式具備标準化的加速能力。
VFP: (Vector Float Point), 向量浮點運算單元,arm11(s3c6410 支援VFPv2),Cortex-A8(s5pv210)支援VFPv3.
NEON和VFPv3 浮點協處理器共享寄存器組,是以在彙編時,指令是一樣的。
編譯選項:
-mfpu = name(neon or vfpvx)指定FPU 單元
-mfloat-abi = name(soft、hard、 softfp):指定軟體浮點或硬體浮點或相容軟浮點調用接口
如果隻指定 -mfpu,那麼預設編譯不會選擇選擇硬體浮點指令集
如果隻指定 -mfloat-abi = hard或者softfp,那麼編譯會使用硬體浮點指令集
2、gcc編譯選項不同
針對cpu為aarch64好像沒有-mfpu選項,參見另一篇文章https://blog.csdn.net/xclshwd/article/details/90713747
好文http://www.voidcn.com/article/p-sjtnjhug-rx.html
3、使用
使用NEON主要有四種方法:
a、NEON優化庫(Optimized libraries)
b、向量化編譯器(Vectorizing compilers)
c、NEON intrinsics
d、NEON assembly
根據優化程度需求不同,第4種最為底層,若熟練掌握效果最佳,一般也會配合第3種一起使用。本文将會重點介紹第3、4 種方法。先簡要介紹前兩種。
- Libraries:直接在程式中調用優化庫
- OpenMax DL:支援加速視訊編解碼、信号處理、色彩空間轉換等;
- Ne10:一個ARM的開源項目,提供數學運算、圖像處理、FFT函數等。
- Vectorizing compilers:GCC編譯器的向量優化選項
- 在GCC選項中加入向量化表示能有助于C代碼生成NEON代碼,如
。-ftree-vectorize
- 在GCC選項中加入向量化表示能有助于C代碼生成NEON代碼,如
- NEON intrinsics:提供了一個連接配接NEON操作的C函數接口,編譯器會自動生成相關的NEON指令,支援ARMv7-A或ARMv8-A平台
- 所有的intrinsics函數都在GNU官方說明文檔;
- NEON assembly:
- Assembly檔案。純彙編檔案,字尾為”.S”或”.s”。注意對寄存器資料的儲存。具體對通用寄存器的詳解不是本文的重點,有興趣的讀者請 自行補充該部分知識
- inline assembly内聯彙編
優點:在C代碼中嵌入彙編,調用簡單,無需手動存儲寄存器;
缺點:有較為複雜的格式需要事先學習,不好移植到其他語言環境
參考博文:http://zyddora.github.io/2016/02/28/neon_1/ https://zyddora.github.io/2016/03/16/neon_2/