neon基礎知識

neon介紹

       Neon是適用於ARM Cortex-A系列處理器的一種SIMD(Single Instruction, Multiple Data)擴展結構。NEON有自己的執行管道和寄存器組,neon寄存器組包含32個64位的寄存器16個128位的寄存器,它們分別被標識爲(D0-D31),(Q0-Q15)。 實際上D寄存器和Q寄存器是重疊的,如下圖所示。NEON 技術本質上是一種並行處理技術,通過並行處理可加速多媒體和信號處理算法(如視頻編碼/解碼、2D/3D 圖形等)。通過使用neon可極大的提高軟件的性能。

                                                                            


Neon關鍵概念

1、數據類型

       Neon寄存器可以存放大部分的基本數據類型,如int8、int16等。寄存器可以存放的數據個數跟寄存器大小和數據類型有關。比如64bit的寄存器可以存放8個int8類型數據。而128bit的寄存器則可以存放16個int8類型數據。

2、寄存器---向量(vector)

       在neon中一個寄存器可以看作是一個向量。比如一個64bit的寄存器D0,當這個寄存器存放4個int16類型數據時,可以把它看作是一個向量,它包含了4個類型爲int16的元素。
3、管道(lane)---元素

       在上例中,當D0存放4個int16數據時,則此時D0有4個管道,管道0到管道3。管道0位於寄存器的低bit位。這個管道實際就對應了向量的元素概念。

4、Neon的數據裝載順序

       假設一個uint16類型的數組爲{0x0201,0x0403,0x0605,0x0807},則它在內存中低地址到高地址存放的順序爲0x01,0x02,0x03````0x08(小端模式)。內存中的數據裝入neon寄存器時,是低地址內存數據放入neon寄存器的低地址上,高地址內存數據放入neon寄存器的高地址上。當neon寄存器數據裝入內存中時,同樣是neon寄存器的低地址數據放入的內存低地址上,neon寄存器的高地址數據放入的內存高地址上。所以內存中的數據經過neon處理後,數據的順序是不會發生變化的

如何使用Neon

1、intrinsics(內部函數)
       使用intrinsics不如使用匯編優化效率高。但是使用intrinsics較爲簡單,且容易維護。這些函數在編譯的時候會直接轉化成Neon的彙編指令。爲了支持這些內部函數必須要包含頭文件arm_neon.h ,還要通過在編譯的時候加入-mfloat-abi=softfp -mfpu=neon,同時需要打開-O2優化選項。使用intrinsics沒法控制寄存器分配和內存對齊等。

如:

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

2、開源庫:
       基於neon的開源庫如Project Ne10、OpenMAX DL
3、彙編:
       使用neon彙編優化的效果最好但是彙編移植性差,且難度較高。
4、自動向量化(Vectorizing Compilers):
       通過添加一些編譯選項來使能向量化編譯,讓編譯器自動生成優化代碼,但對於複雜算法就不行了。


Arm-neon網站http://www.arm.com/zh/products/processors/technologies/neon.php


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