• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

NEON使用方法

开发技术 开发技术 2天前 6次浏览

NEON介绍

在移动平台上进行一些复杂算法开发,一般需要用到指令集来进行加速。NEON 技术是 ARM Cortex™-A 系列处理器的 128 位 SIMD(单指令,多数据)架构扩展,专门针对大规模并行运算设计的,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。

其本质上使用的是128位NEON SIMD寄存器,这意味着如果操作32位浮点数,可同时操作4个(变量可定义:float32x4_t);如果操作 16 位整数(short),可同时操作 8 个(变量可定义:int16x8_t);而如果操作 8 位整数,则可同时操作 16 个(变量可定义:int8x16_t)。

ARMv7 NEON 指令集架构具有 16 个 128 位的向量寄存器,命名为 q0~q15。这 16 个寄存器又可以拆分成 32 个 64 位寄存器,命名为 d0~d31。其中qn和d2n,d2n+1是一样的,故使用汇编编写代码时要注意避免产生寄存器覆盖。如下图所示:
NEON使用方法

 NEON数据类型

NEON的数据类型如下图:

 NEON使用方法

 

neon的数据类型float32x4_t 可以理解为vector< float32 > (4),同理typexN_t即为vector< type>(N)。在NEON编程中,对单个数据的操作可以扩展为对寄存器,也即同一类型元素矢量的操作,因此大大减少了操作次数。

NEON中指令分为正常指令、宽指令、窄指令、饱和指令、长指令这几类:

正常指令:数据宽度不变
NEON使用方法

 长指令:源操作数宽度相同 结果宽度扩展 L标记

NEON使用方法

 宽指令:源操作数宽度不同 结果宽度对齐 W标记

NEON使用方法

 窄指令:源操作数宽度相同 结果宽度变窄 N标记

NEON使用方法

饱和指令:结果溢出就是饱和指令 Q标记

NEON官方示例及详解

通过一个示例来解释如何利用NEON内置函数来加速实现统计一个数组内的元素之和。

NEON使用方法

 对于长度为N的数组,上述算法的时间复杂度为O(N)。

采用NEON函数进行加速:

NEON使用方法

 上述算法的时间复杂度为O(N/4),原因在于我们每次往寄存器加载4个float值,然后同时相加。相当于原来需要N次加法操作而现在只需要N/4即可。如果使用更多的寄存器,则可以完成更高倍数的加速。

上述用到的几个NEON指令解释为:

NEON使用方法

 除以上的操作外,NEON还支持很多的操作,如矢量相减、矢量相乘、矢量乘加、矢量类型转换等等。

NEON手册

以下链接为NEON内置函数的手册,当需要用到某些NEON操作时,可以通过手册查看使用方法。
NEON内置函数详细手册

 

 


程序员灯塔
转载请注明原文链接:NEON使用方法
喜欢 (0)