精华内容
下载资源
问答
  • Neon

    2019-10-25 08:11:35
    Neon
  • NEON

    千次阅读 2016-07-09 16:56:21
    原文链接:... “ARM Advanced SIMD”,nick-named “NEON”, it provides:(1)、A set of interesting scalar/vectorinstructions and registers(th

    原文链接: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技术可加速多媒体和信号处理算法(如视频编码/解码、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,且具有完全的指令集兼容性。特性关键字: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 结合。特性关键字: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寄存器的数据会非常慢。特性关键字: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。特性关键字: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的内存)。特性关键字: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


    展开全文
  • Neon Lights

    2019-10-28 19:35:24
    Neon Lights
  • eclipse neon

    2017-07-22 08:46:04
    eclipse neon
  • neon-crypto:Neon的加密绑定
  • Neon Error

    2020-12-30 14:01:48
    <p>arm_neon.h:65:24: error: 'neon_vector_type' attribute is not supported for this target. <p>In build.gradle, I have the following line: "-DANDROID_ARM_NEON=ON" // cryptopp ...
  • neon-cli, [MOVED] 这里知识库已经合并到neon绑定/neonNeon命令行工具 自动创建和构建 Neon插件模块。 正在启动将 neon-cli 安装为全局软件包:npm install -g neon-cli要创建一个新的Neon项目,请使用 neon n
  • Neon-like

    2019-10-28 19:23:03
    Neon-like
  • NEON support

    2020-12-01 20:19:31
    <div><p>Neon simd instructions for arm cpus are in nightly now I believe, someone could make a new branch and start implementing the simd trait for neon <p>I'm happy to help anyone get started, ...
  • Neon Microblocks

    2020-12-01 17:43:00
    <div><p>Support microblock mining in neon nodes: <ul><li>On winning a sortition, a miner will attempt to assemble one microblock (if <code>mine_microblocks</code> is set to true)</li><li>Neon miners ...
  • Neon Support

    2020-12-30 11:45:11
    <div><p>Provide neon support for Sloeber.</p><p>该提问来源于开源项目:Sloeber/arduino-eclipse-plugin</p></div>
  • NEON functions

    2020-12-05 04:56:43
    <div><ul><li><a href="https://developer.arm.com/technologies/neon/intrinsics">ARM NEON Intrinsics Reference</a></li><li><a href="http://infocenter.arm.com/help/index.jsp?topic=/...
  • 适用于Python的NEON NEON与YAML非常相似。 主要区别在于NEON支持“实体”(因此可用于解析phpDoc注释)和制表符以进行缩进。 NEON语法要简单一些。 霓虹灯代码示例: # neon example name : Homer address : ...
  • neon support

    2020-12-05 05:59:35
    <div><p>Adding support for ARM NEON instruction set!</p><p>该提问来源于开源项目:xtensor-stack/xsimd</p></div>
  • neon笔记

    2020-06-24 14:20:57
    一个sse2neon:https://github.com/DLTcollab/sse2neon neon指令的使用介绍与范例:https://blog.csdn.net/EmSoftEn/article/details/51718763 Neon Intrinsics各函数介绍

    一个sse2neon:https://github.com/DLTcollab/sse2neon

    neon指令的使用介绍与范例:https://blog.csdn.net/EmSoftEn/article/details/51718763

    Neon Intrinsics各函数介绍

     

    这里提到了一些样例如yuvbgr转换,转置,矩阵相乘,以及寄存器分块, l1分块,可以进行仿照尝试:

    arm neon指令优化

     

     

    可以查询手机处理器参数:https://nanoreview.net/en/soc-list/rating

    看上去865应该是

    l1 每个核都有32K+32K

    l2 也是每个核独享,不过大小不一样

    l3应该都是所有核共有一个缓存

    处理器基本是这个模式?暂时没有更好的信息查询

     

    https://www.7-cpu.com/cpu/Skylake.html

     

    展开全文
  • NEON简介

    2018-11-12 22:01:25
    NEON简介

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    “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,且具有完全的指令集兼容性。特性关键字: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 结合。特性关键字: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寄存器的数据会非常慢。特性关键字: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。特性关键字: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的内存)。特性关键字: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


               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • Neon optimizations

    2021-01-06 07:37:38
    <div><p>alg_locate_center_size, alg_diff_standard, vid_uyvyto420p, vid_yuv422to420p are implemented in neon intrinsics. Speedup is 2x-10x depends on architecture. Tested on both, armv7 and arm64.</p>...
  • Opera Neon

    2020-12-01 16:35:29
    <div><p>Opera Neon is detected like Chrome UA: <code>Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.21 Safari/537.36 MMS/1.0.2459.0</code></p>该提问来源于...
  • Dliriume Neon字体

    2019-10-23 03:51:35
    Dliriume Neon字体是一款用于条形设计方面的字体
  • <p>Also, apparently, <code>__ARM_NEON__</code> is legacy, since it is not defined in the ARM C language extensions. (Seems to be confirmed by https://gcc.gnu.org/ml/gcc-patches/2015-01/msg02717.html)....
  • NEON加速

    2020-03-07 18:07:21
    NEON加速 NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图...

    NEON加速


    NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图为 16 个寄存器,128 位宽。)
    目前主流的iPhone手机和大部分android手机都支持ARM NEON加速,因此在编写移动端算法时,可利用NEON技术进行算法加速,以长度为4的寄存器大小为例,相应的提速倍数约是原始的4倍。

    NEON 指令可执行“打包的 SIMD”处理:

    1 寄存器被视为同一数据类型的元素的矢量
    2 数据类型可为:签名/未签名的 8 位、16 位、32 位、64 位单精度浮点
    3 指令在所有通道中执行同一操作
    

    如下图所示:
    在这里插入图片描述
    本文主要介绍float32x4_t相关的结构及函数,
    float32x4_t 可以理解为vector (4),同理typexN_t即为vector(N)。

    在NEON编程中,对单个数据的操作可以扩展为对寄存器,也即同一类型元素矢量的操作,因此大大减少了操作次数。
    这里以一个小例子来解释如何利用NEON内置函数来加速实现统计一个数组内的元素之和。

    以C++代码为例:
    原始算法代码如下:

    #include <iostream>
    using namespace std;
    
    float sum_array(float *arr, int len)
    {
        if(NULL == arr || len < 1)
        {
            cout<<"input error\n";
            return 0;
        }
        float sum(0.0);
        for(int i=0; i<len; ++i)
        {
            sum += *arr++;
        }
        return sum;
    }
    

    对于长度为N的数组,上述算法的时间复杂度时O(N)。
    采用NEON函数进行加速:

    #include <iostream>
    #include <arm_neon.h> //需包含的头文件
    using namespace std;
    
    float sum_array(float *arr, int len)
    {
        if(NULL == arr || len < 1)
        {
            cout<<"input error\n";
            return 0;
        }
        
        int dim4 = len >> 2; // 数组长度除4整数
        int left4 = len & 3; // 数组长度除4余数
        float32x4_t sum_vec = vdupq_n_f32(0.0);//定义用于暂存累加结果的寄存器且初始化为0
        for (; dim4>0; dim4--, arr+=4) //每次同时访问4个数组元素
        {
    		float32x4_t data_vec = vld1q_f32(arr); //依次取4个元素存入寄存器vec
    		sum_vec = vaddq_f32(sum_vec, data_vec);//ri = ai + bi 计算两组寄存器对应元素之和并存放到相应结果
        }
        float sum = vgetq_lane_f32(sum_vec, 0)+vgetq_lane_f32(sum_vec, 1)+vgetq_lane_f32(sum_vec, 2)+vgetq_lane_f32(sum_vec, 3);//将累加结果寄存器中的所有元素相加得到最终累加值
        for (; left4>0; left4--, arr++)
            sum += (*arr) ;   //对于剩下的少于4的数字,依次计算累加即可
        return sum;
    }
    

    上述算法的时间复杂度时O(N/4)
    从上面的例子看出,使用NEON函数很简单,只需要将依次处理,变为批处理(如上面的每次处理4个)。

    上面用到的函数有:
    float32x4_t vdupq_n_f32 (float32_t value)
    将value复制4分存到返回的寄存器中

    float32x4_t vld1q_f32 (float32_t const * ptr)
    从数组中依次Load4个元素存到寄存器中

    相应的 有void vst1q_f32 (float32_t * ptr, float32x4_t val)
    将寄存器中的值写入数组中

    float32x4_t vaddq_f32 (float32x4_t a, float32x4_t b)
    返回两个寄存器对应元素之和 r = a+b

    相应的 有float32x4_t vsubq_f32 (float32x4_t a, float32x4_t b)
    返回两个寄存器对应元素之差 r = a-b

    float32_t vgetq_lane_f32 (float32x4_t v, const int lane)
    返回寄存器某一lane的值

    其他常用的函数还有:

    float32x4_t vmulq_f32 (float32x4_t a, float32x4_t b)
    返回两个寄存器对应元素之积 r = a*b

    float32x4_t vmlaq_f32 (float32x4_t a, float32x4_t b, float32x4_t c)
    r = a +b*c

    float32x4_t vextq_f32 (float32x4_t a, float32x4_t b, const int n)
    拼接两个寄存器并返回从第n位开始的大小为4的寄存器 0<=n<=3
    例如
    a: 1 2 3 4
    b: 5 6 7 8
    vextq_f32(a,b,1) -> r: 2 3 4 5
    vextq_f32(a,b,2) -> r: 3 4 5 6
    vextq_f32(a,b,3) -> r: 4 5 6 7

    float32x4_t sum = vdupq_n_f32(0);
    float _a[] = {1,2,3,4}, _b[] = {5,6,7,8} ;
    float32x4_t a = vld1q_f32(_a), b = vld1q_f32(_b)  ;
    float32x4_t sum1 = vfmaq_laneq_f32(sum, a, b, 0);
    sum + a**b[0]
    (0,0,0,0) + (1*5, 2*5, 3*5, 4*5) = (5, 10 ,15 ,20)
    float32x4_t sum2 = vfmaq_laneq_f32(sum1, a, b, 1);
    float32x4_t sum3 = vfmaq_laneq_f32(sum2, a, b, 2);
    

    其他常用的函数可以参考开发网站
    https://developer.arm.com/technologies/neon/intrinsics
    NEON函数介绍:
    https://blog.csdn.net/fengbingchun/article/details/38085781
    总之,NEON学习入门很快,但如果想要更精深,就需要多花些时间和功夫在上面。

    展开全文
  • neon programmers guide

    2017-12-23 10:57:51
    ARM官方发布的NEON指令集(SIMD)开发指南。 This book introduces NEON technology as it is used on ARM Cortex ™ -A series processors that implement the ARMv7–A or ARMv7–R architectures profiles. It ...
  • NEON优化

    千次阅读 2019-02-28 20:08:27
    本文介绍了ARM平台基于ARM v7-A架构的ARM Cortex-A系列处理器(Cortex-A5, Cortex-A7,Cortex-A8, Cortex-A9, Cortex-A15)上的NEON多媒体处理硬件加速器针对C/C++语言、汇编语言和NEON intrinsics如何编译和优化,包含...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,478
精华内容 2,991
关键字:

neon