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

neon数据重排列及优化技巧

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
3 [* c! N1 u7 r& Y3 l/ D
通用算术指令:
$ ]1 o* Y, X. x+ w  s6 h6 t  x, _7 r1 I6 U2 d
VABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减) A1 P# e* P2 b
! h+ K4 a( K* O& D" W( h
VPADD:将两个向量的相邻元素相加
2 ]$ r1 d% H# z' M4 N# N1 V1 ~; b/ }2 v0 L/ Z) A3 b" E8 W
如VPADD.I16 {d2}, d0, d1" F# I! `) K8 Z/ }& F
2 D1 b  l; n4 V' B
1 R  D/ |' Q7 w* {  f( c" H
) U/ l$ l9 i/ K0 C2 I
VPADDL:VPADDL.S16 d0, d1
# a3 j% t! o9 A& P2 b
% s; D2 Z1 U1 q8 t; x" L
+ ?# q6 c1 `  G2 |7 s  s
) c$ x0 Q2 }. `5 `VMAX:最大值,VMIN:最小值
1 d4 k1 B+ Z9 Y3 J
% N  B% o6 O0 r1 I- U) o, n; uVMUL、VMULL、VMLA(乘加)、VMLS(乘减)、
+ u1 c, B& B/ ~5 G5 D
$ t& F: g9 u* o: g$ y& Q: h
7 m$ r: n2 ], e8 |9 A6 z& S1 Q+ r- F& K$ t2 y/ d" A% d
加载存储指令:
7 ~- d9 [  d7 P+ D( j, g% @8 K5 r
0 H0 X4 l9 D$ ^4 n9 u4 m; s+ ]VLD和VST( J2 W" {& ?8 ]; l+ j1 o
7 T3 D- e2 y; s) h* f7 _* @
. K" E" D( g6 e# n/ P
- C* J; y& U8 c; ]9 x. a. ]2 @
1 ]2 J0 f" k) X; r  {& U8 V
交叉存取的示意图:7 a- a8 u5 m4 k* L3 ~
( V( Y1 u- O; F

) q& e& t6 V8 K7 ?1 x1 |
0 n& G5 u- U# B8 GVREV反转元素指令:
1 f7 m0 L0 W, U" H, `- h
- z* B0 I0 m# S  T0 `
2 A9 C! k9 s# j! l3 f! a
/ B: J6 Z+ Q! I+ qVEXT移位指令:
9 {$ c2 K- W" c1 s) p/ f0 E- h* V) O! g4 I# l  x6 w+ y, v

( g& w6 g" s, H; a3 w4 u2 ~9 S5 q9 |7 i1 ^' H: M
VTRN转置指令:可以用于矩阵的转置
+ r( R: m( A- D# S% \
: l6 k; R2 }* A2 x ( [, d6 [0 x* x3 `
: `' Q8 [. J  Y3 u- i8 }$ ]# D

1 h9 L8 ?! F; g/ D* r
5 c  u5 c. I" E# C! ]2 b2 V3 JVZIP指令:压缩,类似交叉存取
2 ~' v" D  P" H; W3 g6 [3 _% O2 @& M6 K+ e) f/ m* b; K! o) p
) i+ L, ^; K- ?' S: v1 ~0 G& M

9 ~# L5 ?+ Y/ o1 EVUZP指令:解压操作,类似交叉存取6 ^0 F. N" S1 t  O, S1 v/ j: C7 ~

. `2 {. ]3 p& w, z3 B# z5 N, N
$ U5 U' S/ t/ q/ a1 ?8 e: B( j0 J% ^% x) r
VTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中
2 ~! t+ G# `) W; B) n$ t; u
9 j6 e4 J  n, G9 x& Z0 N # D& M- j; Z) a; a
0 z# i) T5 o3 l' J6 ?2 Z
% _0 }* i5 @4 V- z# D
三、需要注意的地方
- y& v2 l' w) x! K6 [" _3 ?" o0 Z8 O. x- }4 s: B  s. U3 K
    load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
' c8 N8 E  p: v& \7 Q2 Q3 ~' j1 W: g
6 w/ V% }6 a+ e6 x     如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。$ {* ^5 f6 ~% R4 s. l1 t
9 d$ f0 h- L% B/ [4 w6 h
   在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。
" T! }% y% _& P# F5 `& I
* z/ u+ k6 W- ]! L, P如:vmul.u16 q1, d3, d4 . W4 @/ d+ p% `& R) Z6 H: o
' w- y- O. h) a: M& @0 V9 W
         vadd.u32 q1, q2, q3
/ X9 B; {) u5 n8 {/ @1 x  W3 y* T. t) {2 L
此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间$ h! Z( p0 r% g' t3 C7 r% u6 d" L2 ?9 M, F

' K" j9 }( i0 W* |使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。
' i1 @: w1 n. U4 g' x* z% q$ m& `' e5 E
& G$ Z+ N8 _$ ^) H如:  vmul.u16 q1, d3, d43 |# g  ~6 n8 ^, J
# h6 @( V/ l+ T5 `% P
          vqmul.u32 q1, q2, q3
' J0 T# h/ T- l4 _3 ~- _
0 J. ?+ x+ J0 L  l; H& d后一个的时间要比第一个的时间要久。
# M& J- R* P9 F9 v; E* e6 O) g6 ?# w. q: J9 a0 d) \& ~# K
在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。7 |# f* r; E4 P
2 v+ g) [) N, n( Z; p: H; J, o
例如:vld1.64 {d0}, [r0], r1
' v3 J9 p. }: }8 x* N

该用户从未签到

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-6-22 22:43 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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