找回密码
 注册
关于网站域名变更的通知
查看: 682|回复: 3
打印 上一主题 下一主题

neon数据重排列及优化技巧

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-9 14:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

2 P+ I0 l6 u1 [* T1 R, u& R2 Z通用算术指令:6 G, q4 q& B$ n
1 o1 i- k+ U+ ?" @
VABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减- W7 N7 {( G! F9 ?6 ~: S7 y* d
$ M% @3 c! E: C
VPADD:将两个向量的相邻元素相加
5 L8 Q" V3 R0 p; |; d3 ^' C5 _7 d8 k* n7 W
如VPADD.I16 {d2}, d0, d1
4 C# w& E6 l  a; }% `7 t) C' A7 [: i, L$ I) D

; U; ~$ t' x, Z$ ~/ @$ t+ K0 V3 w2 [5 a$ _+ @* Y- |
VPADDL:VPADDL.S16 d0, d1. ]+ U; m, ^/ f, G( `; Y

* Q2 D" a7 c) f
0 W8 ]- k) K/ z" L- R4 F( W3 Q) Y4 r# |4 J
VMAX:最大值,VMIN:最小值
9 G8 u' s# \' V: H' {% y; I/ W) c0 h# j  ^' q+ t. C
VMUL、VMULL、VMLA(乘加)、VMLS(乘减)、
" `& i- t; Q: Y& i: {5 |* ]7 S* @3 K; ~6 P. f

7 ]5 S& v' @/ B* E/ l& a: b$ d2 |% i
, e$ ~1 v2 M+ `$ d4 Y8 S; H加载存储指令:
4 F4 w  I5 a0 g7 ]' G
' B( @) W5 g) L" V4 v- H9 oVLD和VST
( g% M* Y+ ]& _! P5 u& X; ~
/ o8 o) X# y1 z/ K  f : d  c& E$ k# x+ ?+ e- Z* A% ^
6 z  j/ D$ `6 b4 T; m8 q, m: O
, ^% N! g8 `3 U* z/ c" ?1 p! P  Z
交叉存取的示意图:. p: w" o3 R( h# S, z

$ |9 |6 e, P4 ~) l
" e8 |( K5 V% ]0 L8 V5 G( g$ u
- F6 G0 u! s0 t/ B3 i. X( J) WVREV反转元素指令:: J1 U  ^  \) i5 Y+ B' l$ [' G

1 [- C' z( ~$ v$ m8 m. ], b
- P1 }: g+ Q6 ~7 \
6 z1 m6 S6 q7 w4 O) b' m$ aVEXT移位指令:/ h2 k6 v! Z3 _! O$ h8 ]

/ ~: J; r: T+ S; G
7 w. k* \/ ~( g5 S
1 K: Q8 j( n, H, ^' DVTRN转置指令:可以用于矩阵的转置3 @; F, ?1 S! a6 K; b9 P. d
5 b8 f1 M% \) L/ m; ^" e
( d3 H: I# ~3 P* T7 y  I& ^  S# A. `( ^

$ j" k* m$ w) }9 w5 p% Q/ b- n , N/ J  y8 N$ V+ X* R
% O+ a  @9 |# d- W
VZIP指令:压缩,类似交叉存取/ b4 a& w* L  _9 b0 ^
7 C0 H& m9 V5 U- K

4 Q" U( q' ]2 c2 `  n: H6 S* ]0 |! M6 K9 O. r5 Q, C7 _9 @
VUZP指令:解压操作,类似交叉存取
0 }) \( Y1 j. @1 {4 b/ X
% Q4 h* B6 M- E2 d7 O , u) I$ ?+ A, a9 L+ N

6 G+ i2 ], Q) R& D( s+ BVTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中& Q7 ^; a7 E1 a6 u
; V% b$ K! j( t0 u- \  @! U

1 c& M- W5 k6 s8 ]: o
/ f/ c) x& ~% ^% t- A7 J1 f1 B1 ?
0 S9 ^. Q9 P* Z- R5 l1 Y6 J( C5 V三、需要注意的地方
0 k1 a( N4 J6 X/ @
$ b* b7 q: J- t* i    load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
5 N! o0 d; I& }) M% ]7 k4 C8 u( _" }/ `3 _
     如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。4 v+ D5 \# }+ j9 D/ B8 m

- m% U0 a" w( \% Z0 i" H' z   在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。
' F( a4 \: v, ?! B$ }5 w: V( ~/ @1 D  Y6 g
如:vmul.u16 q1, d3, d4
1 C$ m9 F$ ~% K, y* j- _! o) a7 f7 p$ L% B
         vadd.u32 q1, q2, q3
' l& m! t9 q) ^( L) Q3 b
+ H5 t* B6 U3 {- |) T. Z' ^) {此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间3 V! E' d  F) P* K8 p: d
: J$ [9 C% v  q6 ]7 h6 w) e
使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。7 F# P: ^; o: L$ w6 F

1 Y  B9 b/ [' N) Y如:  vmul.u16 q1, d3, d4& V5 Z1 t. w9 ^
/ j6 l: d1 L& C5 g0 i
          vqmul.u32 q1, q2, q3
# L$ X' f3 q6 l% d/ d# w
. J' [$ h% e  `% E( g3 h7 c后一个的时间要比第一个的时间要久。
3 p7 [9 d, ?% ^; d+ I& d1 t6 T
. E$ h# j5 t4 v* f在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。0 _" c. ?: O% j
2 [0 Q9 v1 Z. ^2 J3 g1 s
例如:vld1.64 {d0}, [r0], r1
& f7 _$ ^% t- @9 B3 G& K

该用户从未签到

2#
发表于 2021-6-9 15:06 | 只看该作者
neon数据重排列及优化技巧

该用户从未签到

3#
发表于 2021-6-9 15:09 | 只看该作者
neon数据重排列及优化技巧

该用户从未签到

4#
发表于 2021-6-9 15:09 | 只看该作者
neon数据重排列及优化技巧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 14:33 , Processed in 0.203125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表