EDA365电子论坛网

标题: neon数据重排列及优化技巧 [打印本页]

作者: haidaowang    时间: 2021-6-9 14:24
标题: neon数据重排列及优化技巧
, _9 {* f1 t9 Z8 e* X/ y0 t
通用算术指令:
( |/ \" a0 z: _5 `9 f
; T. p" B' |% N, g- g1 QVABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减- n7 f  x+ U: T, a  m2 T1 v3 P6 R
" i3 o, Z2 n8 @; u# ^
VPADD:将两个向量的相邻元素相加
* K5 P# B7 o5 k6 y8 b2 {9 w: w, E& A) K; \$ ~/ e0 W* E  w7 G
如VPADD.I16 {d2}, d0, d1* d. c& X: ?3 a3 A, b7 k

- }: Y/ P9 h6 p8 G 4 z7 _9 \. w/ m8 F7 P# o7 K% l1 [) f) p
7 \' G- c: Q, D
VPADDL:VPADDL.S16 d0, d1
: x' V$ W: J$ [
7 @. O& \* k; S6 A8 b , x& y; N* v( Z. r
( o0 u1 C& r; [" r) ?' B
VMAX:最大值,VMIN:最小值
: Z0 x' k9 |- ^3 Q( [5 o! N
0 D5 e1 v0 F; W' O+ VVMUL、VMULL、VMLA(乘加)、VMLS(乘减)、
8 v* C. ~9 ]1 n- G( _) b1 |  A
# g% L" F, k, o
$ }" R6 J1 }0 K; G  i- f2 |! }& u  j( o7 F& J3 \/ I
加载存储指令:7 r# k! h  {" Z9 b# k

! h$ r: u! H  e7 MVLD和VST
# M+ Y2 F+ o% i9 B
/ [8 @# R) u" k
) X/ @: U( K, u0 \7 ?/ x: n 8 g& l- J" d7 x7 C
: J* o  H% e  l
交叉存取的示意图:
! _- f- ?, ?( g- [- H: L: [1 z

; n) g9 r* o- N% [, X4 `8 k6 b7 I# B/ B" @2 ?. J
VREV反转元素指令:
! h7 k3 @: L* {% t/ @4 o# u
# Z& S8 _/ Q3 \! m$ O) k" C$ C 5 Y) H2 W" a* X
7 m5 |. J: m) x$ u' H: Y7 ~/ E
VEXT移位指令:* y( c. h. W1 U: {( \0 u: y* ]
# S, u% ~+ A6 H4 o/ ]7 ^! t2 z9 V( X% r
/ y8 l, ]" \2 y5 p; w# u

) E* R2 f+ x& y# ^VTRN转置指令:可以用于矩阵的转置
1 l: ?* G/ K& u5 A+ k  F3 m' `: j0 O4 s- b/ M# I

. l, t( K8 p! m0 e* Y4 N2 q0 v" N/ @& B  t# o
( v: P; b$ T+ Q. ^/ d! a2 ]
) j) l, A1 H3 {- ?) u6 {& `
VZIP指令:压缩,类似交叉存取
$ W( S! i* ~/ A8 f& l1 Y' \/ e2 S5 ^& J  w$ j: s
: V" B- W+ ]- n8 P; G7 W

7 o' Y! D) v! p5 @4 EVUZP指令:解压操作,类似交叉存取6 ^+ l1 R& P2 k1 J* w

3 H  g* Z" t  J& |: I' w% L! E ( I8 l- u8 z8 c3 T6 r- v
6 i! G# {# W) R5 e4 X1 ?5 G  u
VTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中
# C, y' E$ b3 P) N9 ~
" c, ~; ]7 L8 f* ?' Z. p # N4 R. W4 e7 v' [: B+ S0 Q8 }: l* t
- f' c6 L; _1 m+ Q

0 Y9 d8 T  E# \' m& `* h, Q4 C5 W三、需要注意的地方
1 Z3 |9 N! F; P% ]  z+ v: K/ K! _; i' H9 O3 K- J. \
    load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
# P# c7 x1 M; ?/ g1 g7 E
# x' I" U1 X' G" r1 S+ {& \% G# P     如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。& h3 l% t; {, b) x5 k7 I
3 c2 J1 Y1 ^0 ~' x
   在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。5 t: q% a1 V( P1 s4 a! v
/ ~7 G( s4 j) l% t+ D2 a% a
如:vmul.u16 q1, d3, d4 # R) b8 w. q7 r, G& o3 n: a
! \2 R2 _; n4 i  O. K) f/ z
         vadd.u32 q1, q2, q3: [5 X' q8 B$ z. v! X: o: U' t# M& u: |
. l* C# U% f, i! m( F
此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间
  _4 \7 n2 R  M1 X; j% P# L( v
2 |7 ?# P' g8 y4 l7 \3 R- b使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。
" D& w1 u+ w' H; r4 F" |5 P/ K! O: z: ]5 V1 L6 B8 E
如:  vmul.u16 q1, d3, d4
$ ?1 G+ X1 O! w9 d) p2 ^" u7 I: v6 T7 g7 M# M' H# W
          vqmul.u32 q1, q2, q3* y& d& r) H! v4 l4 d; B) T/ o# D% Z
. N1 _# c+ S( c5 s9 k8 B8 V
后一个的时间要比第一个的时间要久。( d3 [3 b% q4 `

4 `+ T. k. o4 g5 B7 o在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。
+ c& z/ d* M8 B' r3 {/ L4 p/ w5 w2 X9 Z3 Y0 r
例如:vld1.64 {d0}, [r0], r1
/ [; H) [/ g: ~- q( P# v+ x  a
作者: Hello_Mr.li    时间: 2021-6-9 15:06
neon数据重排列及优化技巧
作者: ExxNEN    时间: 2021-6-9 15:09
neon数据重排列及优化技巧
作者: SsaaM7    时间: 2021-6-9 15:09
neon数据重排列及优化技巧




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2