初识neon指令

来源:互联网 发布:知乎中科大软件学院 编辑:程序博客网 时间:2024/06/14 17:08

1、neon指令是什么

NEON就是将增强性SIMD的扩展使用在ARM处理器上的实现也就是说NEON是指用一种特定的方式去实现的过程现在ARM Cortex-A8的系列是具有着NEON具有NEON技术的处理器都会配备了32个64位的寄存器和16个128位的寄存器它们分别被标识为(D0-D31)(Q0-Q15) 两种寄存器重叠。NEON的指令集只是ARM和THUMB指令集中的子集,ARM和THUMB要管理所有程序流和同步的问题NEON指令通常执行的就是:内存的访问 、在NEON寄存器和传统寄存器之间的数据拷贝、数据类型的转化、数据的处理。
SIMD又是什么呢,就是单指令多数据流。通常我们进行多媒体处理的时候,很多的数据都是16位或者8位的,如果这些程序运行在32位的机器上,那么计算机有一部分的计算单元是没有工作的,所以这是一种浪费。SIMD这种技术就是使用一条指令,但对多个相同类型和尺寸的数据进行并行处理。

2、neon的指令类型

(1)正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。
(2)长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度的两倍,并属于同一类型。L标记
(3)宽指令:一个双字向量操作数和一个四字向量操作数执行运算,生成四字向量结果。W标记
(4)窄指令:四字向量操作数执行运算,并生成双字向量结果,所生成的元素一般是操作数元素宽度的一半。N标记
(5)饱和指令:当超过数据类型指定到范围则自动限制在该范围内。Q标记

3、neon的指令

neon指令的一个显著特点就是都以v开头;在结尾以一个字母+一个数字的形式组成说明符,说明操作数的类型和长度。具体指令很多就不罗列了,参考这里。
举一个例子:
vmulq.I8 q12,q0,d15[0]
vmul是乘法指令,q表示这条指令为饱和指令,I8表示所要处理的数据为8位整型,q12,q0表示两个128bit寄存器,d15[0]表示d15寄存器的第一个数据。整条指令执行的命令就是将q0中的数据依次和d15[0]相乘,结果放入q12寄存器中。一条指令,就完成了16次乘法运算。
此外,使用neon指令就要在代码中加入头文件arm_neon.h;编译的命令也要变为arm-none-linux-gnueabi-gcc -mfpu=neon ***.cpp (用gcc编译的话)

4、neon指令在图像处理中的应用

目前我只能实现简单的矩阵相乘,还有很多问题要向前辈请教。
学习:http://blog.csdn.net/jaych/article/details/50346075、http://blog.csdn.net/jaych/article/details/50346225

参考文献:

http://blog.csdn.net/ccjjnn19890720/article/details/7291228#
http://www.cnblogs.com/xylc/p/5410517.html
原创粉丝点击