您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 左移 >

ARM处理器NEON编程及优化技巧—左移右移等移位操作

发布时间:2019-06-15 20:28 来源:未知 编辑:admin

  ARM的NEON协处理器技术是一个64/128-bit的混合SIMD架构,用于加速包括视频编码解码、音频解码编码、3D图像、语音和图像等多媒体和信号处理应用。本文主要介绍如何使用NEON的汇编程序来写SIMD的代码,包括如何开始NEON的开发,如何高效的利用NEON。首先会关注内存操作,即如何变更指令来灵活有效的加载和存储数据。接下来是由于SIMD指令的应用而导致剩下的若干个单元的处理,然后是用一个矩阵乘法的例子来说明用NEON来进行SIMD优化,最后关注如何用NEON来优化各种各样的

  ,左移或者右移以及双向移位等。本节详述NEON提供的各种各样的移位操作,左右移位,移位插入以及移位限定符如饱和舍入等以及这些移位操作如何能有效的处理图像中的色深。

  NEON中的移位指令和ARM指令中的标量移位,把向量中的各个元素左移或者右移若干比特。那些移到临近元素的比特会被丢弃掉,不会影响到邻近元素的移位结果。移位操作的移位数可以直接编码到指令里,或者用 一个指定的移位比特向量,如果使用移位向量,每一个元素的移位比特值将取决于对应的移位向量里存储的值,移位向量里保存的移位值是有符号的,所以可能进行左移,右移或者不移位的操作。

  有符号数据的右移操作的类型可以根据指令来制定,如是否进行符号扩展(算术右移还是逻辑右移),这对应于ARM指令里的移位操作。对于无符号的右移而言,就不用进行符号扩展了。

  NEON还支持带插入的移位,即进行两个向量的比特位域的组合。比如VLSI指令左移并插入,会把向量进行左移,然后用 目标向量的右侧数据来填充。如下图所示:

  NEON支持把向量的各个元素右移然后累加结果到另外一个向量。这对于那些中间结果需要更高精度的情况非常适用,然后才把 结果保存到一个低精度的累加器里。

  每个移位指令都能包含一个或者多个修改符,这些修改符不会改变移位操作本身,但是输入和输出结果会去除基准或者饱和到一个有效范围,有5种移位限定符:

  变窄(narrow),使用N前缀,表示向量中所有元素的位宽变窄为一半,即源是128-bit的Q寄存器,而结果是64-bit的D寄存器;

  变长(long),使用L前缀,表示向量中所有元素的位宽变宽为两倍,即源是64-bit的D寄存器,而结果是128-bit的Q寄存器;

  饱和(saturate),使用Q前缀,把结果元素变成其能表示的最大和最小值范围内,位宽比特数和符号类型来表明该元素的有效范围;

  无符号的饱和(Unsigned Saturating),使用Q前缀,U后缀,类似于饱和限定符,但结果会饱和到无符号数据范围,不管输入是有符号还是无符号的;

  这些限定符的有些组合起来不能描述有用的操作,因而NEON并不包含这些指令。比如类似VQSHR的饱和右移并不需要,因为右移会让数据变小,不会超过有效范围。

  色深转换是图像处理中经常用到的。通常输入数据是RGB565 16-bit色度格式,需要转换成RGB888格式才更适合于NEON这种并行处理。 然而NEON还是能处理RGB565的数据的,这就需要用到前面提到的移位指令了。

  首先看如何从RGB565转换成RGB888,假设输入的8个16-bit的像素保存到寄存器Q0,我们想把分量分离成R通道,G通道和B通道,保存到d2到d4寄存器。

  这些指令的含义可以参考注释处,基本上完成的操作就是去除临近通道的不用的色度数据,然后继续移位把色度分量的值到最高位。

  你可能注意到,这样转换成RGB888格式后,原来的白就不是完全的白色了,这是因为R和B分量是左移3bit,而G分量则只左移两bit,因而如RGB565值(0x1F, 0x3F, 0x1F)变成RGB888 (0xF8, 0xFC, 0xF8),并不跟以前的表示颜色一致。

  从RGB888转换成RGB565,假设RGB888的输入是用上面代码表示的形式,单独通道的分量保存在从寄存器d0到d2,结果保存到16-bit的RGB565格式到q2寄存器。

  基本操作是把分量扩展成16-bit,然后右移插入指令把分量放到合适的位置;

http://ampguimods.com/zuoyi/46.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有