arm neon介紹

一.介紹

       ARM NEON 是適用於ARM Cortex-A和Cortex-R52系列處理器的一種128位SIMD(single instruction multiple data, 單指令多數據)擴展結構。

      ARM CPU最開始只有普通的寄存器,可以進行基本數據類型的基本運算。自ARMv5開始引入了VFP(Vector Floating Point)指令,該指令用於向量化加速浮點運算。自ARMv7開始正式引入NEON指令,NEON性能遠超VFP,因此VFP指令被廢棄。類似於Intel CPU下的MMX/SSE/AVX/FMA指令,ARM CPU的NEON指令同樣是通過向量化來進行速度優化。使用場景包含但不侷限於:

  • 靈活的視頻轉碼(Flexible video transcoding)
  • 聲音識別,先進的語音處理(Speech Recognition,Advanced audio processing)
  • 視頻捕獲增強(Enhanced captured video)
  • 計算機視覺AR/VR(computer vision)
  • 機器學習及深度學習(Machine and deep learning)
  • 遊戲及先進的人機交互界面(Gaming,advanced user interface)

二.SIMD & SISD介紹

        關於SIMD(單指令多數據)和SISD(單指令單數據)。以加法指令爲例,單指令單數據(SISD)的CPU對加法指令譯碼後,執行部件先訪問內存,取得第一個操作數;之後再一次訪問內存,取得第二個操作數;隨後才能進行求和運算。而在SIMD型的CPU中,指令譯碼後幾個執行部件同時訪問內存,一次性獲得所有操作數進行運算。這個特點使SIMD特別適合於多媒體應用等數據密集型運算:

關於SISD,SIMD的詳細介紹將在neon programer中介紹。

三.neon技術介紹

  • NEON技術是從ARMv7-A和ARMv7-R指令集引入的,目前已經擴展到了ARMv8-A和ARMv8-R指令集。 
  • NEON技術旨在通過加速多媒體(video/audio)編解碼,用戶界面,2D/3D圖形及遊戲來提高人對多媒體的體驗度。
  • NEON也可以通過加速信號處理算法和函數來加快應用程序,比如音頻和視頻處理,語音和麪部識別,計算機視覺和深度學習。

        NEON是一個(packed)SIMD架構,NEON寄存器被視爲相同數據類型的向量元,並且支持多種數據類型的一種技術。 下表描述了不同架構下所支持的數據類型:

         ARMv7-A/R         ARMv8-A/R            ARMv8-A
           AArch32           AArch64
Floatin-point       32-bit       16-bit*/32-bit      16-bit*/32-bit/64-bit
Interger  8-bit/16-bit/32-bit  8-bit/16-bit/32-bit/64-bit  8-bit/16-bit/32-bit/64-bit

      NEON指令在所有向量通道上執行相同操作。執行操作數是由數據類型來決定的,Neon指令遵循如下的規則:

  • 16x8-bit, 8x16-bit, 4x32-bit, 2x64-bit integer operations
  • 8x16-bit*, 4x32-bit, 2x64-bit** floating-point operations

      在 Neon 技術上的實現還可以支持多個並行指令:

  • *Only in Armv8.2-A
  • **Only in Armv8-A/R

四.怎樣使用NEON

      有多種方式來使用NEON,其中包含了以使用Neon的庫文件,編譯器的自動矢量化(auto-vectorization),Neon內部函數(Neon intrinsics)和Neon彙編代碼(neon assembly code)。具體詳細信息參考:Neon Programmer’s Guide Version: 1.0

五.簡單使用介紹

5.1- library

        使用NEON最簡單的方式就是使用已經包含了NEON的開源庫.ARM計算庫用於機器學習和計算機視覺,ARM計算庫是基於ARM CPU和GPU架構且針對圖像處理,計算機視覺和機器學習的低層次的函數集合。更多信息可參考:https://developer.arm.com/technologies/compute-library 

       Ne10是一個基於C的開源庫,由ARM託管在github上,包含了一系列在ARM上重度優化的最常用的增強處理過程。Ne10是有幾個小型的庫構成的模塊化的開源庫。包含:

數學功能 信號處理功能  圖像處理功能 物理功能
Vector Add Floating & Fixed Point Image Resize Collision Detection
Matrix Add Complex-to-Complex FFT Image Rotate   
Vector Subtract Floating & Fixed Point    
Vector Subtract From Real-to-Complex FFT    
Matrix Subtract FIR Filters    
Vector Multiply FIR Decimator    
Vector Multiply-Accumulate FIR Interpolator    
Matrix Multiply FIR Lattice Filters    
Matrix Vector Multiply FIR Sparse Filters    
Vector Divide IIR Lattice Filters     
Vector Set      
Vector Length      
Vector Normalize      
Vector Absolute Value      
Vector Dot Product      
Vector Cross Product      
Matrix Determinant      
Matrix Inverse      
Matrix Transpose      
Matrix Identity      
  • Libyuv 是一個包含YUV數據的轉換和擴展功能的開源庫.
  • Skia 是一個開源的2D圖形庫,用作谷歌Chrome和Chrome OS、Android、Mozilla Firefox和Firefox OS以及其他許多產品的圖形引擎

5.2自動矢量化(AutoVectorization)

       自動矢量化功能由ARM編譯器支持,它們自動利用neon功能.特性支持以下:

5.3-Compiler Intrinsics

        neon intrinsics是編譯器用適當的neon指令或neon指令序列替換的函數調用。內部函數提供的控制幾乎和編寫彙編語言一樣多,但是把寄存器的分配留給編譯器,這樣開發人員就可以專注於算法了。它還可以執行指令調度以刪除指定目標處理器的管道暫停。這會導致比使用彙編語言更易於維護的源代碼。Neon內部函數由ARM編譯器、GCC和LLVM支持。具體參考:https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics

  • Neon intrinsic example
#include <arm_neon.h>
uint32x4_t double_elements(uint32x4_t input)
{
    return(vaddq_u32(input, input));
}

5.4-Assembly code

        對於非常高的性能,手工編碼的Neon彙編程序是經驗豐富的程序員的最佳方法。GNU彙編程序(GAS)和ARM編譯器工具鏈彙編程序(ARMASM)都支持Neno指令的彙編。

六.tools

        ARM DS-5 Development Studio是基於ARM平臺提供的C/C++軟件開發的端到端套件工具。DS-5完全支持Neon架構的編程和調試。

      DS-5 Debugger提供了Neon指令完整調試功能,以及其體系結構寄存器的可視化。DS-5調試器支持所有ARM體系結構配置文件和處理器。   

7.Neon ecosystem

  Neon在如下表格所示的領域內有廣泛的使用。其中包含了很多跨平臺的開源項目:

Video codecs: Audio codecs: Voice and speech codecs: Audio enhancement algorithms: Computer Vision Machine and deep learning
VP9 OTT encoder, VP9 Consumer encoder/decoder MP3 encoder/decoder G.711 Echo cancellation Canny Edge detection On-device object recognition
H.264 (AVC) encoder/decoder MPEG-2 layer I & II encoder/decoder G.722, G.722.1, G.722.2 Noise Reduction Harris Corner On-device scene recognition
MPEG4 SP/ASP encoder/decoder MPEG-1 layer III audio encoder G.723.1 Beam Forming ORB Human pose recognition
MPEG2 decoder

MPEG-1 layer III audio encoder/decoder

G.726 Comfort Noise Convolution filter Defect detection
H.263 decoder HE-AACv1, v2 encoder/decoder G.727 AudioZoom Erosion/Dilation  
  WMA Standard encoder/decoder G.728 Equalization Face detection  
  WMA Pro, WMA Lossless decoder G.729, G.279A, G.729B Wind noise reduction Pedestrian detection  
  SBC Bluetooth encoder/decoder G.729AB Automatic Gain Control Fast9/Fast12 corner detection  
  OggVorbis encoder/decoder AMR Narrowband, Wideband, Wideband+ Voice Activity Detection Object tracking  
  FLAC encoder/decoder GSM-HR, GSM-ER, GSM-EFR Key word spotting Lane departure  
  Dolby® Digital AC-3 encoder/decoder Opus Voice trigger Connected components  
  Dolby® Digital eAC-3 decoder iLBC Voice biometrics    
  Dolby® MS10/MS11 Multistream SILK Speaker verification    
  Dolby® Digital Plus 5.1/7.1 Consumer decoder SPEEX      
  Dolby® Digital 5.1 Creator Consumer encoder MELPe      
  Dolby® Pro Logic I & II encoder/decoder        
  iSAC encoder/decoder        
  CELT encoder/decoder        
  DTS core encoder/decoder        
  DAB+ encoder/decoder        
  Dolby® Mobile encoder/decoder        
  Dolby® TrueHD consumer decoder        
  Dolby® UDC encoder/decoder        

  更多的eco-system合作參考:https://developer.arm.com/architectures/instruction-sets/dsp-extensions/arm-dsp-ecosystem-partners

8.Resources

 8.1 video 

     網站:Taming Armv8 Neon: from theory to benchmark results 

8.2 Blogs

8.3 Arm Compilers

8.4 Software optimization Guides

       ARM爲某些處理器發佈軟件優化指南。這些指南提供有關管道、指令性能特徵和特殊性能考慮的高級信息。這些信息對使用Neon的程序員特別有用。

 

 

 

 

 

 

 

 

 

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