NEON
原文鏈接:http://blog.csdn.net/fengbingchun/article/details/38020265#comments
“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技術(shù)可加速多媒體和信號(hào)處理算法(如視頻編碼/解碼、2D/3D圖形、游戲、音頻和語音處理、圖像處理技術(shù)、電話和聲音合成),其性能至少為ARMv5性能的3倍,為ARMv6 SIMD性能的2倍。NEON技術(shù)是ARM Cortex-A系列處理器的128位SIMD架構(gòu)擴(kuò)展,旨在為消費(fèi)性多媒體應(yīng)用程序提供靈活、強(qiáng)大的加速功能。
從ARMv7開始ARM提供高級(jí)單指令多數(shù)據(jù)(SIMD)擴(kuò)展亦稱NEON技術(shù),它是一種由ARM開發(fā)的64/128位混合SIMD體系結(jié)構(gòu),可以提升多媒體和信號(hào)處理應(yīng)用程序的性能。
NEON的寄存器:有16個(gè)128位四字寄存器Q0-Q15,32個(gè)64位雙字寄存器D0-D31,兩個(gè)寄存器是重疊的,在使用的時(shí)候需要特別注意,不小心就會(huì)被覆蓋掉。
NEON的數(shù)據(jù)類型:無符號(hào)整數(shù)、有符號(hào)整數(shù)、未指定類型的整數(shù)、浮點(diǎn)數(shù)、{0,1}上的多項(xiàng)式。數(shù)據(jù)類型針對(duì)的是操作數(shù),而不是目標(biāo)數(shù)。NEON中的數(shù)據(jù)類型說明符由一個(gè)指示數(shù)據(jù)類型的字母構(gòu)成,該字母通常后跟一個(gè)指示寬度的數(shù)字。
NEON指令可處理:(1)、由以下內(nèi)容構(gòu)成的雙字向量:八個(gè)8位元素、四個(gè)16位元素、兩個(gè)32位元素、一個(gè)64位元素;(2)、由以下內(nèi)容構(gòu)成的四字向量:十六個(gè)8位元素、八個(gè)16位元素、四個(gè)32位元素、兩個(gè)64位元素。
NEON中的正常指令、寬指令、窄指令、飽和指令、長(zhǎng)指令:(1)、正常指令:生成大小相同且類型通常與操作數(shù)向量相同的結(jié)果向量;(2)、長(zhǎng)指令:對(duì)雙字向量操作數(shù)執(zhí)行運(yùn)算,生成四字向量的結(jié)果。所生成的元素一般是操作數(shù)元素寬度的兩倍,并屬于同一類型;(3)、寬指令:一個(gè)雙字向量操作數(shù)和一個(gè)四字向量操作數(shù)執(zhí)行運(yùn)算,生成四字向量結(jié)果。所生成的元素和第一個(gè)操作數(shù)的元素是第二個(gè)操作數(shù)元素寬度的兩倍;(4)、窄指令:四字向量操作數(shù)執(zhí)行運(yùn)算,并生成雙字向量結(jié)果,所生成的元素一般是操作數(shù)元素寬度的一半;(5)、飽和指令:當(dāng)超過數(shù)據(jù)類型指定的范圍則自動(dòng)限制在該范圍內(nèi)。
NEON標(biāo)量:有些NEON指令可處理與向量組合使用的標(biāo)量。NEON標(biāo)量可以為8位、16位、32位或64位。除乘法指令之外,訪問標(biāo)量的指令也可訪問寄存器組中的任何元素。指令語法通過在雙字向量中使用索引來引用標(biāo)量,從而使Dm[x]表示Dm中的第x個(gè)元素。乘法指令僅允許使用16位或32位標(biāo)量,并且只能訪問寄存器組中的前32個(gè)標(biāo)量。這在乘法指令中意味著:(1)、16位標(biāo)量限定為寄存器D0-D7,其中x位于范圍0-3內(nèi);(2)、32位標(biāo)量限定為寄存器D0-D15,其中x為0或1。
{0,1}上的多項(xiàng)式算法:使用布爾算法規(guī)則處理系數(shù)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. 也就是說,將兩個(gè){0,1}上的多項(xiàng)式相加與按位異或的運(yùn)算相同,而將兩個(gè){0,1}上的多項(xiàng)式相乘則與整乘的運(yùn)算相同,但部分積執(zhí)行的是異或運(yùn)算,而不是相加運(yùn)算。
NEON注意事項(xiàng):(1)、load數(shù)據(jù)的時(shí)候,第一次load會(huì)把數(shù)據(jù)放在cache里面,只要不超過cache的大小,下一次load同樣數(shù)據(jù)的時(shí)候,則會(huì)比第一次load要快很多,會(huì)直接從cache中l(wèi)oad數(shù)據(jù);(2)、在做NEON乘法指令的時(shí)候會(huì)有大約2個(gè)clock的阻塞時(shí)間,如果你要立即使用乘法的結(jié)果,則就會(huì)阻塞在這里。乘法的結(jié)果不能立即使用,可以將一些其它的操作插入到乘法后面而不會(huì)有時(shí)間的消耗;(3)、使用飽和指令的時(shí)候,如乘法飽和的時(shí)候,在做乘法后會(huì)再去做一次飽和,所用時(shí)間要比直接做乘法要慢;(4)、在對(duì)16位數(shù)據(jù)進(jìn)行l(wèi)oad或者store操作的時(shí)候,需要注意的是字節(jié)移位。
NEON指令只適用于支持NEON的系統(tǒng)。ARMv7-M不支持NEON。
??? NEON的指令集只是ARM和THUMB指令集中的子集。NEON的指令都是以V字母開頭。使用intrinsics(內(nèi)聯(lián)函數(shù))不如使用匯編優(yōu)化效率高。這些函數(shù)在編譯的時(shí)候會(huì)直接轉(zhuǎn)化成NEON的匯編指令。為了支持這些內(nèi)聯(lián)函數(shù)必須要包含頭文件arm_neon.h?, 使用NEON技術(shù)還要通過在編譯的時(shí)候加入-mfpu=neon才能起到效果。使用intrinsics沒法控制寄存器分配和內(nèi)存對(duì)齊等。
????NEON技術(shù)只適用于ARM Cortex-A系列處理器。Cortex-A系列處理器:ARMCortex-A系列的CPU處理器內(nèi)核包括ARMCortex-A5、ARM-A7、ARM Cortex-A8、ARM Cortex-A9 MPCore、ARM Cortex-A9 單核處理器、ARM Cortex-A15 MPCore。ARM Cortex-A系列是一系列用于復(fù)雜操作系統(tǒng)和用戶應(yīng)用程序的應(yīng)用程序處理器。Cortex-A系列處理器支持ARM、Thumb和Thumb-2指令集。
??? ARM Cortex系列處理器核包括Cortex-A系列(高性能、具備MMU、可以允許如Symbian、Linux、Android、Windows CE等操作系統(tǒng))、Cortex-R系列(高端嵌入式滿足高性能高可靠性的實(shí)時(shí)需求)、Cortex-M(嵌入式單片機(jī)、低功耗、低成本)。
??? 基于ARMv7-A架構(gòu)的ARM Cortex-A系列處理器(Cortex-A5,Cortex-A7,Cortex-A8,Cortex-A9,Cortex-A15)的基本特性,基本上都可以支持ARM、Thumb-2、Thumb指令集,支持Java加速擴(kuò)展的Jazelle技術(shù)、ThustZone的安全擴(kuò)展以及針對(duì)浮點(diǎn)FPU的VFP硬件擴(kuò)展和并行多數(shù)據(jù)的SIMD的NEON多媒體處理器擴(kuò)展、支持主流的嵌入式OS(Symbian、Linux、Android、WindowsMobile、Windows Phone)、支持分支預(yù)測(cè)branchprediction.但各處理器在VFP/NEON的類型、半精度浮點(diǎn)(16-bit half precision floating-point)的支持、多核MPcore、流水線pipeline、單MHz處理性能、L1/L2cache控制器、亂序執(zhí)行、指令dual-issue并發(fā)等方面略有不同。
??? Cortex-A處理器共性:(1)、ARMv7-A體系結(jié)構(gòu);(2)、對(duì)所有操作系統(tǒng)的支持:A、Linux完整分配----Android、Chrome、Ubuntu和Debian;B、Linux第三方----MontaVista、QNX、Wind River;C、Symbian;D、Windows CE;F、需要使用內(nèi)存管理單元的其它操作系統(tǒng)支持;(3)、指令集支持:ARM、Thumb-2(提供最佳代碼密度和性能混用)、Thumb、Jazelle、DSP;(4)、TrusZone安全擴(kuò)展;(5)、VFP高級(jí)單精度和雙精度浮點(diǎn)支持;(6)、NEON媒體處理引擎;(7)、支持分支預(yù)測(cè)branch prediction。
????Cortex-A5 ARM核處理器:Cortex-A5處理器支持ARMv7-A架構(gòu)的特性,包括TrustZone安全擴(kuò)展NEON多媒體處理引擎,芯片面積和功耗特性很好,但處理性能性對(duì)于其他Cortex-A略差,如只相當(dāng)于Cortex-A8的80%性能,Cortex-A15的一半性能。Cortex-A5可以支持多核。Cortex-A5處理器支持雙發(fā)dual issue以及分支預(yù)測(cè)branch prediction。NEON和VFP的硬件可選。Cortex-A5支持ARM和Thumb指令集,并可以包含Jazelle-DBX和Jazelle-RCT的Java加速技術(shù)。Cortex-A5 處理器是尺寸最小、功耗最低(可以低至0.08mw~0.12mw/MHz)的 ARM 多核處理器,能夠向最廣泛的設(shè)備提供 Internet 訪問:包括超低成本手機(jī)、特色手機(jī)和智能移動(dòng)終端以及普遍采用的嵌入式、消費(fèi)類和工業(yè)設(shè)備。Cortex-A5 處理器的應(yīng)用與 Cortex-A8、Cortex-A9 和 Cortex-A15 處理器完全兼容,能夠立即訪問已得到認(rèn)可的開發(fā)平臺(tái)和軟件體系,包括 Android、Adobe Flash、Java Platform Standard Edition (Java SE)、JavaFX、Linux、Microsoft Windows Embedded、Symbian 和 Ubuntu。Cortex-A5與 Cortex-A8、Cortex-A9 和 Cortex-A15 處理器的完全應(yīng)用兼容性, 為大量現(xiàn)有?ARM926EJ-S和?ARM1176JZ-S處理器授權(quán)使用方提供了高價(jià)值的遷移途徑。Cortex-A5功耗和面積只有 Cortex-A9 的 1/3,且具有完全的指令集兼容性。特性關(guān)鍵字: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的大小核設(shè)計(jì)中的小核部分,并且與高端 Cortex-A15 CPU 體系結(jié)構(gòu)完全兼容。Cortex-A7處理器包括了高性能處理器Cortex-A15的一切特性,包括虛擬化(virtualization)、大容量物理內(nèi)存地址擴(kuò)展(Large Physical Address Extensions (LPAE),可以尋址到1TB的存儲(chǔ)空間)、NEON、VFP以及AMBA 4 ACE coherency(AMBA4 CacheCoherent Interconnect (CCI))。Cortex-A7支持多核MPCore的設(shè)計(jì)以及Big+Little的大小核設(shè)計(jì)。小型高能效的 Cortex-A7 是最新低成本智能手機(jī)和平板電腦中獨(dú)立 CPU 的理想之選,并可在big.LITTLE 處理配置中與 Cortex-A15 結(jié)合。特性關(guān)鍵字: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處理器是第一個(gè)使用ARMv7-A架構(gòu)的處理器。很多應(yīng)用處理器以Cortex-A8為核心,如S5PC100(Samsung),OMAP3530(TI,Texas Instruments),i.MX515(Freescale)。Cortex-A8 處理器是一個(gè)雙指令執(zhí)行的有序超標(biāo)量處理器,針對(duì)高度優(yōu)化的能效實(shí)現(xiàn)可提供 2.0 Dhrystone MIPS(每 MHz),這些實(shí)現(xiàn)可提供基于傳統(tǒng)單核處理器的設(shè)備所需的高級(jí)別的性能。Cortex-A8在市場(chǎng)中構(gòu)建了ARMv7體系結(jié)構(gòu),可用于不同應(yīng)用,包括智能手機(jī)、智能本、便攜式媒體播放器以及其他消費(fèi)類和企業(yè)平臺(tái)。分開的L1指令和數(shù)據(jù)cache大小可以為16KB或者32KB,指令和數(shù)據(jù)共享L2 cache,容量可以到1MB。L1和L2 cache的cache數(shù)據(jù)寬度為128比特,L1cache是虛擬索引,物理上連續(xù),而L2完全使用物理地址。Cortex-A8的L1 cache行寬度為64byte,L2cache在片內(nèi)集成。另外和Cortex-A9相比,由于Cortex-A8支持的浮點(diǎn)VFP運(yùn)算非常有限,其VFP的速度非常慢,往往相同的浮點(diǎn)運(yùn)算,其速度是Cortex-A9的1/10。Cortex-A8能并發(fā)某些NEON指令(如NEON的load/store和其他的NEON指令),而Cortex-A9因?yàn)镹EON位寬限制不能并發(fā)。Cortex-A8的NEON和ARM是分開的,即ARM核和NEON核的執(zhí)行流水線分開,NEON訪問ARM寄存器很快,但是ARM端需要NEON寄存器的數(shù)據(jù)會(huì)非常慢。特性關(guān)鍵字:VFP, NEON, Jazelle RCT, Thumb-2, 13-stage superscalarpipeline,Variable(L1+L2)Cache, MMU+TrustZone。使用Cortex-A8的設(shè)備:包括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技術(shù)。L1的cache控制器提供了硬件的cache一致性維護(hù)支持多核的cache一致性。核外的L2 cache控制器(L2C-310, or PL310) 支持最多8MB的cache。Cortex-A9的L1cache行寬度為32byte,L2 cache因?yàn)槎嗪说脑蛟诤送饧?#xff0c;即通過SCU來訪問多核共享的L2 cache。特性關(guān)鍵字: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的設(shè)備:包括nVidia's 雙核Tegra-2, 以及TI's OMAP4平臺(tái),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系列中性能最高的處理器,一個(gè)突出的特性是其硬件的虛擬化技術(shù)(Hardware virtualization)以及大物理內(nèi)存的擴(kuò)展(Large Physical Address Extension(LPAE), 能尋址到1TB的內(nèi)存)。特性關(guān)鍵字: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的設(shè)備:目前集成Cortex-A15的處理器量產(chǎn)的只有Samsung的Exynos 5系列處理器,但TI的OMAP5系列處理器也采用Cortex-A15的核。
????NEON的流水線在Cortex-A8和Cortex-A9的處理器上不同,NEON的指令一般都是在一個(gè)周期內(nèi)發(fā)出,但是執(zhí)行結(jié)果可能若干個(gè)周期才能有效,只有簡(jiǎn)單的如VSUB、VADD和VMOV指令才能在下一個(gè)周期可以用。從NEON的寄存器把數(shù)據(jù)保存到ARM寄存器非常耗時(shí),需要至少20個(gè)周期的延時(shí),因而盡量避免這類操作。盡量避免ARM和NEON處理器訪問相同的數(shù)據(jù)區(qū)域。
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也略有不同,版本越高,包含的內(nèi)聯(lián)函數(shù)有可能越多。
Intel Atom processor可以應(yīng)用到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內(nèi)聯(lián)函數(shù)包括:加法、乘法、取整、減法、比較、絕對(duì)差、最大、最小、邏輯運(yùn)算、獲取lane值、設(shè)置lane值、合并、分離、類型轉(zhuǎn)換、查表、Load、Store等運(yùn)算,總共近1900條指令。
參考文獻(xiàn):
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
總結(jié)
- 上一篇: TVB经典电视剧--《创世纪》回忆
- 下一篇: 为什么 1 KB = 1024 B? 1