neon 数据重排列及优化技巧

通用算术指令:

VABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减

VPADD:将两个向量的相邻元素相加

如VPADD.I16 {d2}, d0, d1


VPADDL:VPADDL.S16 d0, d1


VMAX:最大值,VMIN:最小值

VMUL、VMULL、VMLA(乘加)、VMLS(乘减)、

 

加载存储指令:

VLD和VST



交叉存取的示意图:

VREV反转元素指令:

 

VEXT移位指令:

 

VTRN转置指令:可以用于矩阵的转置



VZIP指令:压缩,类似交叉存取

VUZP指令:解压操作,类似交叉存取


 

VTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中

 

三、需要注意的地方

    load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。

     如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。

   在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。

如:vmul.u16 q1, d3, d4 

         vadd.u32 q1, q2, q3

此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间

使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。

如:  vmul.u16 q1, d3, d4

          vqmul.u32 q1, q2, q3

后一个的时间要比第一个的时间要久。

在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。

例如:vld1.64 {d0}, [r0], r1

### DCT8_1D NEON 实现与解析 在ARM架构下,NEON技术提供了强大的SIMD(单指令多数据)处理能力,特别适合于多媒体和信号处理应用中的密集型计算任务。对于一维离散余弦变换(DCT),特别是长度为8的一维DCT (DCT8_1D),可以利用NEON指令集来加速其执行效率。 #### 1. 数据准备阶段 为了有效地使用NEON寄存器,在输入数据加载到这些宽向量之前通常会先进行一些预处理工作。这可能涉及到排列原始数组以匹配NEON加载模式的要求[^2]。 ```c // 假设input是一个float类型的数组,表示要转换的数据点 float32x4_t input_low = vld1q_f32(&input[0]); // 加载前四个浮点数 float32x4_t input_high = vld1q_f32(&input[4]); // 加载后四个浮点数 ``` #### 2. 执行蝶形运算 核心部分涉及多个蝴蝶操作(butterfly operations)以及乘法累加(MACs)[^3]。通过精心设计算法流程并充分利用NEON提供的专用指令,可以在减少循环次数的同时提高吞吐率。 ```assembly vmul.f32 q8, q0, d16[0] @ Multiply by cosine coefficients stored in d16 vmla.f32 q9, q1, d17[0] @ Accumulate results into accumulator registers ... ``` 这里展示的是汇编级别的例子;实际编程实践中更推荐采用内联ASM或者intrinsics函数形式编写代码以便移植性和可读性的提升。 #### 3. 结果存储 完成所有必要的计算之后,最终的结果会被保存回内存中供后续步骤调用。考虑到缓存友好性等因素的影响,合理的访存顺序同样要[^4]。 ```c vst1q_f32(output_ptr, result); // 将结果写回到output指针指向的位置 ``` 值得注意的是,上述描述仅涵盖了基本概念和技术要点,并未深入探讨具体实现细节或优化技巧。不同应用场景下的需求差异可能导致具体的编码方式有所变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值