天天看點

海思支援NEON(FPU)

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,那麼編譯會使用硬體浮點指令集

海思支援NEON(FPU)

 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

  • 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/

繼續閱讀