NEON简单介绍
个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》
7、http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/BABDFJCI.html
NEON简单介绍的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...
- yii2的权限管理系统RBAC简单介绍
这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...
- angular1.x的简单介绍(二)
首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
- iOS-iOS开发简单介绍
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
- iOS开发多线程篇—多线程简单介绍
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
随机推荐
- oschina jQuery 插件
jQuery 插件 jQuery自动完成插件(25) jQuery分页插件(20) jQuery 文件上传(21) jQuery 地图插件(14) jQuery对话框(109) jQuery图片展示/ ...
- 【 D3.js 入门系列 --- 8 】 对话操作(事件)
本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 这一节介绍怎样进行对话的操作,如鼠标单击,鼠标滑过等. 对一个被 ...
- Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架
Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 ...
- 西南民大oj(两园交求面积)
西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3 ...
- Linux+Apache+Mysql+Php
CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境 一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, My ...
- KISSY 库 demo
KISSY 是由淘宝前端project师们发起创建的一个开源 JS 类库. 它遵循的原则是 小巧灵活.简洁有用.愉悦编码.快乐开发. DEMO: <!DOCTYPE html> <h ...
- Nginx对某个文件夹或整个站点进行登录认证的方法
比方要对 站点文件夹下的 test 文件夹 进行加密认证 首先须要在opt 的主文件夹中 /opt/ 创建一个新文件 htpasswd 此文件的书写格式是 username:password 每行一个 ...
- 重构ConditionHelper
在上一篇日志写了ConditionHelper的具体实现方法和它的用法,但那时只是把心里所想的一个思路用代码记录下来,而没有经过实践检 验的,难免存在一些问题,但在最近的一个新项目中用到Conditi ...
- Tomcat6 Session建立机制简要
底: 测试部门做压力测试, 结果没多久新闻,出现OutOfMemory. 查找原因,通过监视工具,查找StandardSession(org.apache.catalina.session.Stan ...
- android中listview分页载入数据
前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...