- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NEON指令优化
Tidied by celery
线性加载RGB数据
首先看一个实例,24-bit的RGB图像,像素在内存里的组织方式是R, G, B, R, G, B...,如果你想做一个简单的图像处理,比如把R和B通道互换,你该如何高效的使用NEON协处理器呢?首先从存储空间线性加载RGB数据到D寄存器,然后交换R和B数据。 但是这种线性加载的数据进行R和B通道的数据交换非常麻烦,需要首先掩码mask,然后移位并合并掩码数据。这种复杂的运算显然并不高效。
结构化的加载指令加载RGB数据
NEON提供了各种结构的加载和存储指令来处理这种情况,这些指令能把数据从存储区加载的同时还能把这些值分开存储到不同的寄存器中,如下图2所示,你可以使用VLD3加载来把RGB数据分开存储。
交换指令VSWP
使用VLD3分开加载的数据就能方便的使用指令(VSWP d0, d2)来进行R和B通道的交换了,然后把结果再写入内存,当然也要使用interleave交织模式的存储,即VST3存储指令。
结构化加载和存储语法和具体指令
NEON结构化加载会读取内存内容到64-bit的NEON寄存器,使用可选的deinterleave选项,同样加载指令也可以采用这种reinterleave的方式把寄存器的内容写到内存空间。
结构化加载和存储语法和具体指令
加载VLD或者存储VST指令助记符:instruction mnemonic
一个表示interleave模式的数字,表示每个结构体元素间的间隔:interleave pattern
表示每次访问单元的位宽比特数,即结构体内元素类型:element type
读写的64-bit的NEON寄存器集合,最多可以列出4个寄存器,取决于interleave模式:NEON registers
表示内存访问地址的ARM寄存器,该地址可以在每次访问时更新: ARM address register
结构化加载和存储语法和具体指令
交织模式:Interleave Pattern
加载和存储指令可以用从1到4个相同大小的元素的交织结构体,这些元素可以是NEON指令通常支持的8,16或者32比特。
VLD1是最简单的形式,从内存加载1~4个寄存器的数据,没有deinterleave,即线性加载;
VLD2加载2或者4个寄存器的数据,解交织奇偶元素到各自的寄存器,这样很容易的把交织的立体声音频数据分解为左右声道的数据;
VLD3加载3个寄存器的数据,很方便的把RGB的数据分为R、G、B通道;
VLD4加载4个寄存器的数据,解交织,用于分解ARGB图像数据;
存储和加载类似,只是把寄存器的数据interleave然后写到内存。
结构化加载和存储语法和具体指令
元素类型 Element Types
加载和存储interleave的数据的基本元素可以为8,16或者32比特的数据。比如NEON指令VLD2.16将加载4个16-bit元素到第一个寄存器,然后4个16-bit元素到第二个寄存器,把临近的奇偶对分开保存到每个寄存器。
结构化加载和存储语法和具体指令
把元素大小变成32-bits还是加载相同大小的数据,但是只有2个元素来构成一个向量,同样分成奇偶元素部分。
元素大小还会影响大小端的处理。如果你指定了正确的加载和存储指令的元素大小,从存储空间读取和存储的字节都会按照正确的次序排列,因而相同的代码会在大端和小端系统里适用。最后元素大小还会影响指针的数据对齐,把数据对齐到元素大小的边界能带来更好的性能,当然这也是一般的操作系统OS要求的。如,加载32位元素数据,通常要把第一个元素的地址对齐到32位边界。
单个或者多个元素 Single or Multiple Elements
除了加载多个元素,结构读取还能从内存用deinterleave的模式读取一个元素到NEON寄存器的多个通道或者一个通道而保存其他通道不变。
单个或者多个元素 Single or Multiple Elements
加载到单一通道对于从分散的内存空间的数据读取来构建一个向量非常有用。存储数据到内存也是一样,也可以采用通道的模式进行存储。
寻址模式Addressing
NEON的加载和存储指令支持3种格式的寻址模式:
寄存器 [ {,:}]:数据将会从指定寄存器的地址加载或者存储;
带自动加减地址更新的寄存器[{,:}]!:在数据从指定寄存器的地址加载或者存储后会更新地址,更新的地址大小等于读取或者存储的数据元素大小;
带后索引的寄存器[{,:}],:存储空间访问后,会根据制定的寄存器Rm来更新地址,当需要读取或者存储一组具有固定间隔的数据时非常有用。
其他的加载和存储
NEON还支持以下的数据加载和存储:
文档评论(0)