NEON簡單介紹


“ARM Advanced SIMD”,nick-named “NEON”, it provides:(1)、A set of interesting scalar/vectorinstructions and registers(the latter are mapped to the same chip area as theFPU ones), comparable to MMX/SSE/3DNow! in the 86 world;(2)、VFPv3-D32 as a requirement(i.e 32 hardware FPU 64-bit registers,instead of the minimum of 16).

NEON technology as it is used on ARM Cortex-A seriesprocessors that implement the ARMv7-A or ARMv7-R architectures profiles.

The ARMv8 architectural architecture extends theNEON support, and provides backwards compatibility with ARMv7 implementations.

ARM ENON技術可加速多媒體和信號處理算法(如視頻編碼/解碼、2D/3D圖形、游戲、音頻和語音處理、圖像處理技術、電話和聲音合成),其性能至少為ARMv5性能的3倍,為ARMv6 SIMD性能的2倍。NEON技術是ARM Cortex-A系列處理器的128位SIMD架構擴展,旨在為消費性多媒體應用程序提供靈活、強大的加速功能。

從ARMv7開始ARM提供高級單指令多數據(SIMD)擴展亦稱NEON技術,它是一種由ARM開發的64/128位混合SIMD體系結構,能夠提升多媒體和信號處理應用程序的性能。

NEON的寄存器:有16個128位四字寄存器Q0-Q15,32個64位雙字寄存器D0-D31,兩個寄存器是重疊的,在使用的時候須要特別注意,不小心就會被覆蓋掉。

NEON的數據類型:無符號整數、有符號整數、未指定類型的整數、浮點數、{0,1}上的多項式。數據類型針對的是操作數,而不是目標數。NEON中的數據類型說明符由一個指示數據類型的字母構成,該字母通常后跟一個指示寬度的數字。

NEON指令可處理:(1)、由下面內容構成的雙字向量:八個8位元素、四個16位元素、兩個32位元素、一個64位元素;(2)、由下面內容構成的四字向量:十六個8位元素、八個16位元素、四個32位元素、兩個64位元素。

NEON中的正常指令、寬指令、窄指令、飽和指令、長指令:(1)、正常指令:生成大小同樣且類型通常與操作數向量同樣的結果向量;(2)、長指令:對雙字向量操作數運行運算,生成四字向量的結果。所生成的元素通常是操作數元素寬度的兩倍,並屬於同一類型;(3)、寬指令:一個雙字向量操作數和一個四字向量操作數運行運算,生成四字向量結果。所生成的元素和第一個操作數的元素是第二個操作數元素寬度的兩倍;(4)、窄指令:四字向量操作數運行運算,並生成雙字向量結果,所生成的元素通常是操作數元素寬度的一半;(5)、飽和指令:當超過數據類型指定的范圍則自己主動限制在該范圍內。

NEON標量:有些NEON指令可處理與向量組合使用的標量。NEON標量能夠為8位、16位、32位或64位。除乘法指令之外,訪問標量的指令也可訪問寄存器組中的不論什么元素。指令語法通過在雙字向量中使用索引來引用標量,從而使Dm[x]表示Dm中的第x個元素。乘法指令僅同意使用16位或32位標量,而且僅僅能訪問寄存器組中的前32個標量。這在乘法指令中意味着:(1)、16位標量限定為寄存器D0-D7,當中x位於范圍0-3內;(2)、32位標量限定為寄存器D0-D15,當中x為0或1。

{0,1}上的多項式算法:使用布爾算法規則處理系數0和1:(1)、0+0=1+1+0;(2)、0+1=1+0=1;(3)、0*0=0*1=1*0=0;(4)、1*1=1. 也就是說,將兩個{0,1}上的多項式相加與按位異或的運算同樣,而將兩個{0,1}上的多項式相乘則與整乘的運算同樣,但部分積運行的是異或運算,而不是相加運算。

NEON注意事項:(1)、load數據的時候,第一次load會把數據放在cache里面,僅僅要不超過cache的大小,下一次load同樣數據的時候,則會比第一次load要快非常多,會直接從cache中load數據;(2)、在做NEON乘法指令的時候會有大約2個clock的堵塞時間,假設你要馬上使用乘法的結果,則就會堵塞在這里。乘法的結果不能馬上使用,能夠將一些其它的操作插入到乘法后面而不會有時間的消耗;(3)、使用飽和指令的時候,如乘法飽和的時候,在做乘法后會再去做一次飽和,所用時間要比直接做乘法要慢;(4)、在對16位數據進行load或者store操作的時候,須要注意的是字節移位。

NEON指令僅僅適用於支持NEON的系統。ARMv7-M不支持NEON。

    NEON的指令集僅僅是ARM和THUMB指令集中的子集。NEON的指令都是以V字母開頭。使用intrinsics(內聯函數)不如使用匯編優化效率高。這些函數在編譯的時候會直接轉化成NEON的匯編指令。為了支持這些內聯函數必須要包含頭文件arm_neon.h , 使用NEON技術還要通過在編譯的時候加入-mfpu=neon才干起到效果。使用intrinsics沒法控制寄存器分配和內存對齊等。

    NEON技術僅僅適用於ARM Cortex-A系列處理器。Cortex-A系列處理器:ARMCortex-A系列的CPU處理器內核包含ARMCortex-A5、ARM-A7、ARM Cortex-A8、ARM Cortex-A9 MPCore、ARM Cortex-A9 單核處理器、ARM Cortex-A15 MPCore。ARM Cortex-A系列是一系列用於復雜操作系統和用戶應用程序的應用程序處理器。Cortex-A系列處理器支持ARM、Thumb和Thumb-2指令集。

    ARM Cortex系列處理器核包含Cortex-A系列(高性能、具備MMU、能夠同意如Symbian、Linux、Android、Windows CE等操作系統)、Cortex-R系列(高端嵌入式滿足高性能高可靠性的實時需求)、Cortex-M(嵌入式單片機、低功耗、低成本)。

    基於ARMv7-A架構的ARM Cortex-A系列處理器(Cortex-A5,Cortex-A7,Cortex-A8,Cortex-A9,Cortex-A15)的基本特性,基本上都能夠支持ARM、Thumb-2、Thumb指令集,支持Java加速擴展的Jazelle技術、ThustZone的安全擴展以及針對浮點FPU的VFP硬件擴展和並行多數據的SIMD的NEON多媒體處理器擴展、支持主流的嵌入式OS(Symbian、Linux、Android、WindowsMobile、Windows Phone)、支持分支預測branchprediction.但各處理器在VFP/NEON的類型、半精度浮點(16-bit half precision floating-point)的支持、多核MPcore、流水線pipeline、單MHz處理性能、L1/L2cache控制器、亂序運行、指令dual-issue並發等方面略有不同。

    Cortex-A處理器共性:(1)、ARMv7-A體系結構;(2)、對全部操作系統的支持:A、Linux完整分配----Android、Chrome、Ubuntu和Debian;B、Linux第三方----MontaVista、QNX、Wind River;C、Symbian;D、Windows CE;F、須要使用內存管理單元的其它操作系統支持;(3)、指令集支持:ARM、Thumb-2(提供最佳代碼密度和性能混用)、Thumb、Jazelle、DSP;(4)、TrusZone安全擴展;(5)、VFP高級單精度和雙精度浮點支持;(6)、NEON媒體處理引擎;(7)、支持分支預測branch prediction。

    Cortex-A5 ARM核處理器:Cortex-A5處理器支持ARMv7-A架構的特性,包含TrustZone安全擴展NEON多媒體處理引擎,芯片面積和功耗特性非常好,但處理性能性對於其它Cortex-A略差,如僅僅相當於Cortex-A8的80%性能,Cortex-A15的一半性能。Cortex-A5能夠支持多核。Cortex-A5處理器支持雙發dual issue以及分支預測branch prediction。NEON和VFP的硬件可選。Cortex-A5支持ARM和Thumb指令集,並能夠包含Jazelle-DBX和Jazelle-RCT的Java加速技術。Cortex-A5 處理器是尺寸最小、功耗最低(能夠低至0.08mw~0.12mw/MHz)的 ARM 多核處理器,能夠向最廣泛的設備提供 Internet 訪問:包含超低成本手機、特色手機和智能移動終端以及普遍採用的嵌入式、消費類和工業設備。Cortex-A5 處理器的應用與 Cortex-A8、Cortex-A9 和 Cortex-A15 處理器全然兼容,能夠馬上訪問已得到認可的開發平台和軟件體系,包含 Android、Adobe Flash、Java Platform Standard Edition (Java SE)、JavaFX、Linux、Microsoft Windows Embedded、Symbian 和 Ubuntu。Cortex-A5與 Cortex-A8、Cortex-A9 和 Cortex-A15 處理器的全然應用兼容性, 為大量現有 ARM926EJ-S和 ARM1176JZ-S處理器授權使用方提供了高價值的遷移途徑。Cortex-A5功耗和面積僅僅有 Cortex-A9 的 1/3,且具有全然的指令集兼容性。特性keyword:VFP, NEON, Jazelle RCT, Thumb/Thumb-2, 1–4 cores,Variable (L1+L2)Cache, MMU+TrustZone。

    Cortex-A7 ARM核處理器:Cortex-A7 處理器的功耗和面積與超高效 Cortex-A5 類似,但性能提升 15~20%,Cortex-A7是ARM的大小核設計中的小核部分,而且與高端 Cortex-A15 CPU 體系結構全然兼容。Cortex-A7處理器包含了高性能處理器Cortex-A15的一切特性,包含虛擬化(virtualization)、大容量物理內存地址擴展(Large Physical Address Extensions (LPAE),能夠尋址到1TB的存儲空間)、NEON、VFP以及AMBA 4 ACE coherency(AMBA4 CacheCoherent Interconnect (CCI))。Cortex-A7支持多核MPCore的設計以及Big+Little的大小核設計。小型高能效的 Cortex-A7 是最新低成本智能手機和平板電腦中獨立 CPU 的理想之選,並可在big.LITTLE 處理配置中與 Cortex-A15 結合。特性keyword:VFPv4 FPU, NEON, Thumb-2, JazelleRCT/DBX, out-of-order speculative issue superscalar, Large Physical AddressExtensions(LPAE), Hardware virtualization, 1–4 SMP cores, 32KB/32KB L1, up to4MB L2, MMU+TrustZone

    Cortex-A8 ARM核處理器Cortex-A8處理器是第一個使用ARMv7-A架構的處理器。非常多應用處理器以Cortex-A8為核心,如S5PC100(Samsung),OMAP3530(TI,Texas Instruments),i.MX515(Freescale)。Cortex-A8 處理器是一個雙指令運行的有序超標量處理器,針對高度優化的能效實現可提供 2.0 Dhrystone MIPS(每 MHz),這些實現可提供基於傳統單核處理器的設備所需的高級別的性能。Cortex-A8在市場中構建了ARMv7體系結構,可用於不同應用,包含智能手機、智能本、便攜式媒體播放器以及其它消費類和企業平台。分開的L1指令和數據cache大小能夠為16KB或者32KB,指令和數據共享L2 cache,容量能夠到1MB。L1和L2 cache的cache數據寬度為128比特,L1cache是虛擬索引,物理上連續,而L2全然使用物理地址。Cortex-A8的L1 cache行寬度為64byte,L2cache在片內集成。另外和Cortex-A9相比,由於Cortex-A8支持的浮點VFP運算非常有限,其VFP的速度非常慢,往往同樣的浮點運算,其速度是Cortex-A9的1/10。Cortex-A8能並發某些NEON指令(如NEON的load/store和其它的NEON指令),而Cortex-A9由於NEON位寬限制不能並發。Cortex-A8的NEON和ARM是分開的,即ARM核和NEON核的運行流水線分開,NEON訪問ARM寄存器非常快,可是ARM端須要NEON寄存器的數據會非常慢。特性keyword:VFP, NEON, Jazelle RCT, Thumb-2, 13-stage superscalarpipeline,Variable(L1+L2)Cache, MMU+TrustZone。使用Cortex-A8的設備:包含Apple的ipad1(apple A4處理器),BeagleBoard (TI OMAP3530 or TI DM 3730)。HTCDesire, SBM7000, Oregon State University OSWALD, Gumstix Overo Earth, Pandora,Apple iPhone 3GS, Apple iPod touch (3rd and 4th Generation), Apple iPad (A4),Apple iPhone 4 (A4), Archos 5, BeagleBoard, Motorola Droid, Motorola Droid X,Motorola Droid 2, Motorola Droid R2D2 Edition, Palm Pre, Samsung Omnia HD,Samsung Wave S8500, Samsung i9000 Galaxy S, Sony Ericsson Satio, Touch Book,Nokia N900, Meizu M9, Google Nexus S, Sharp PC-Z1 "Netwalker。

    Cortex-A9 ARM核處理器:Cortex-A9 MPCore或者單核處理器單MHz性能比Cortex-A5 或者Cortex-A8高,支持ARM, Thumb, Thumb-2, TrustZone, JazelleRCT,Jazelle DBX技術。L1的cache控制器提供了硬件的cache一致性維護支持多核的cache一致性。核外的L2 cache控制器(L2C-310, or PL310) 支持最多8MB的cache。Cortex-A9的L1cache行寬度為32byte,L2 cache由於多核的原因在核外集成,即通過SCU來訪問多核共享的L2 cache。特性keyword:Application profile, VFPv3 FPU, NEON, Thumb-2, Jazelle RCT/DBX,out-of-order speculative issue superscalar, 1–4 core SMP, 32KB/32KB L1, up to4MB L2, MMU+TrustZone。使用Cortex-A9的設備:包含nVidia's 雙核Tegra-2, 以及TI's OMAP4平台,Apple的ipad2(appleA5處理器),LG Optimus 2X(nVidiaTegra-2),Samsung Galaxy S II(Samsung Exynos 4210),Sony NGP PSP2,PandaBoard(TI OMAP4430 or TIOMAP 4460),Motorola Atrix 4G,Motorola DROID BIONIC,Motorola Xoom。

    Cortex-A15ARM核處理器:Cortex-A15 MPCore處理器是眼下Cortex-A系列中性能最高的處理器,一個突出的特性是其硬件的虛擬化技術(Hardware virtualization)以及大物理內存的擴展(Large Physical Address Extension(LPAE), 能尋址到1TB的內存)。特性keyword:Application profile, VFPv4 FPU,NEON, Thumb-2, Jazelle RCT/DBX, out-of-order speculative issue superscalar, LargePhysical Address Extensions(LPAE), Hardware virtualization, 1–4 SMP cores,32KB/32KB L1, up to 4MB L2, MMU+TrustZone。使用Cortex-A15的設備:眼下集成Cortex-A15的處理器量產的僅僅有Samsung的Exynos 5系列處理器,但TI的OMAP5系列處理器也採用Cortex-A15的核。

    NEON的流水線在Cortex-A8和Cortex-A9的處理器上不同,NEON的指令一般都是在一個周期內發出,可是運行結果可能若干個周期才干有效,僅僅有簡單的如VSUB、VADD和VMOV指令才干在下一個周期能夠用。從NEON的寄存器把數據保存到ARM寄存器非常耗時,須要至少20個周期的延時,因而盡量避免這類操作。盡量避免ARM和NEON處理器訪問同樣的數據區域。

Not all ARMv7-based Android devices will support NEON.

    Define LOCAL_ARM_NEONto 'true' in your module definition, and theNDK will build all its source files with NEON support. This can be useful ifyou want to build a static or shared library that specifically contains NEONcode paths.

用gcc編譯器編譯帶有neon的文件(ARM NEON Intrinsics),須要加入 -mfpu=neon。

The NDK supports the compilation of modules or evenspecific source files with support for NEON. What this means is that a specificcompiler flag will be used to enable the use of GCC ARM Neon intrinsics andVFPv3-D32 at the same time.

Neon support only works when targeting the'armeabi-v7a' ABI, otherwise the NDK build scripts will complain and abort. Itis important to use checks like the following in your Android.mk:

    # define a static library containing ourNEON code

    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

        include $(CLEAR_VARS)

        LOCAL_MODULE    := mylib-neon

        LOCAL_SRC_FILES := mylib-neon.c

        LOCAL_ARM_NEON  := true

        include $(BUILD_STATIC_LIBRARY)

endif #TARGET_ARCH_ABI == armeabi-v7a

NOT ALL ARMv7-BASED ANDROID DEVICES WILL SUPPORT NEON ! Itis thus crucial to perform runtime detection to know if the NEON-capablemachine code can be run on the target device.To do that, use the 'cpufeatures'library that comes with this NDK.You should explicitly check thatandroid_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, and thatandroid_getCpuFeatures() returns a value that has theANDROID_CPU_ARM_FEATURE_NEON flag set, as in:

      #include <cpu-features.h>

      ...

      ...

      if (android_getCpuFamily() ==ANDROID_CPU_FAMILY_ARM &&

          (android_getCpuFeatures() &ANDROID_CPU_ARM_FEATURE_NEON) != 0)

      {

          // use NEON-optimized routines

          ...

      }

      else

      {

          // use non-NEON fallback routinesinstead

          ...

      }

 

     ...

Android 版本號不同,arm_neon.h也略有不同,版本號越高,包含的內聯函數有可能越多。

Intel Atom processor能夠應用到Android,為x86,支持TBB,支持SSE2、SSE3等。

Neon libraries:(1)、projectne10;(2)、OpenMAX;(3)、ffmpeg;(4)、Eigen3;(5)、Pixman;(6)、x264;(7)、Math-neon;(8)、libjpeg-turbo;(9)、Android Skia.

NEON C/C++ intrinsics are available in armcc, GCC/g++,and llvm.

When you compile a file, the compiler must know  what processor you want the code to runon.The primary option for doing this is –mcpu=cpu-name,where cpu-name is the nameof the processor.If you do not specify the processor to use,GCC will use itsbuilt-in default. The default can vary depending on how the compiler wasoriginally built and the generated code might not execute or might executeslowly on the CPU that you have.

There is no support for NEON instructions inarchitectures before ARMv7.

Load and store addresses must be aligned to cachelines to allow more efficient memory access. This requires at least 16-wordalignment on Cortex-A8. If it is not possible to align the start of the inputand output arrays, then it is better to process the unaligned elements assingle elements. This means some of the elements at the beginning of the arrayand some of the elements at the end of the array can be processed as singleelements.

Neon內聯函數包含:加法、乘法、取整、減法、比較、絕對差、最大、最小、邏輯運算、獲取lane值、設置lane值、合並、分離、類型轉換、查表、Load、Store等運算,總共近1900條指令。

參考文獻:

1、《NEON Programmer’s Guide》

2、 http://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html

3、 http://hilbert-space.de/?p=22

4、http://www.in189.com/thread-727738-1-1.html

5、《ARM NEON support in the ARM compiler》

6、https://software.intel.com/en-us/blogs/2012/12/12/from-arm-neon-to-intel-mmxsse-automatic-porting-solution-tips-and-tricks

7、http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/BABDFJCI.html



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM