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

neon数据重排列及优化技巧

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
$ Y6 e! s2 `/ F
通用算术指令:* {& d0 k; I* g8 }5 Y

$ T* i* J8 j0 x- _2 T: q7 bVABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减
& y) N7 U$ z; W3 H- U) U
# n& B; m# _% H3 m+ U5 zVPADD:将两个向量的相邻元素相加6 k0 H, y( i9 E! t
  y: s) ~8 v0 e- Y4 ~8 _! q
如VPADD.I16 {d2}, d0, d1* h9 d2 d5 V( K0 S; m

  c9 ~0 E. W$ @( r
5 h0 u7 N7 W$ U# h% O. N% X% `* K& N. v  s  B- o/ U/ V# e$ E
VPADDL:VPADDL.S16 d0, d1  c! W) J( E6 U: ~

3 v, x+ y  b1 @8 [" P& _ / g% \; |% K" g) f

' D0 A+ w* b% M8 Z0 h7 `! Y% _VMAX:最大值,VMIN:最小值
6 q% \4 I8 ]) ~5 B- ?9 x" n9 S  H
7 m* F6 {& r9 w- r4 Q5 t" k! b$ k  TVMUL、VMULL、VMLA(乘加)、VMLS(乘减)、3 r( j7 e/ X  d) Q1 Q5 B4 ~* r! s) I
+ h8 u7 g7 y! j$ \$ r3 \; {

' F: [7 X# D9 H, ]) }1 W/ G% F
. T% Y6 H. T6 T- u加载存储指令:
0 B. {& A2 }% K: y% o% T, I5 |! X. U" T
VLD和VST
8 q5 C7 f) e. }
4 g: o: a- H" q
! u. e. ?# G1 R& P/ C$ d# t  h
% S3 h2 o+ u# |% W
+ j$ f2 X3 k; \2 P1 `* f  Z( n交叉存取的示意图:
2 X( z9 h; s: D- U3 Q8 p9 r
; |4 i% y* F2 o5 M$ c
2 C  u2 l6 u6 c& {  P
& j% F, |3 A* lVREV反转元素指令:
# p# d5 [  \; I, O0 E! v1 P$ I( o6 F1 N; r9 y4 {
. Q6 `" H; k8 x% L( g

" L$ B% k# H4 @VEXT移位指令:  P) J3 Z( B3 b  M
9 c5 s' n/ V" m, u& i
9 m- M7 X: V& p1 W/ w& s3 D% d

5 o$ A- h/ C" d8 b3 AVTRN转置指令:可以用于矩阵的转置
9 i) z$ ]. d7 o8 H5 V. z& Z( Y3 b& `3 X( b7 ~5 e

- {( g+ g: f7 X, ?3 |8 D4 D
  Q+ Z! ]/ R- N. l ! x  l! Y( m" a, z

, T& M  g' U( Y. l% S3 aVZIP指令:压缩,类似交叉存取
1 }+ M1 T+ m. |' w, `: q8 I4 X* c7 K2 M$ l& \. @6 F( l) \& B- N) |
: a2 ~& @& r  b; c7 W
. a# a/ M0 S5 r4 F! b
VUZP指令:解压操作,类似交叉存取' D: C5 B1 g' B* [
% q. v  j7 ?5 A: B, P$ B

& O# g$ [6 s8 z" B9 O4 V
& `7 H) U* R0 w$ h3 Z" N4 g3 HVTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中2 }9 C1 E  G0 P
( |' k0 k, r( _
2 y+ R; f; b6 M+ G) h
, a& L8 K4 T6 H+ S. D% w
& A% i9 Y; M0 j3 X  [
三、需要注意的地方/ x1 M( I- r  ], g' k$ n
0 c% Z9 e& `+ s9 ]- L$ m
    load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
+ G, Y3 X# D- b: r. x
% G" O9 O* }4 Y, u3 z4 r3 Z     如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。
2 L" [1 ]1 o+ U5 N1 _4 p6 G4 o0 S4 G+ c* U
   在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。) l% e# c/ X$ B" A
& ]: b+ W: ]. v7 _4 V& z3 V; h) \
如:vmul.u16 q1, d3, d4
" f. q! n- I! G1 M7 M6 u9 H* e# ]0 f& |4 c: Q+ f# t. H; g9 R! }
         vadd.u32 q1, q2, q3, R) l% [* S2 \5 p8 X4 v% X

$ g; x* B# l+ D3 H" r8 F7 @此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间1 K9 j! h8 S0 f: B8 \

5 r! ^2 p# N8 ?, e使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。! g0 ?4 Z9 j$ S/ Y. F5 S
, a* l0 S# y# ]
如:  vmul.u16 q1, d3, d4
  ?% j. u! E- n8 w1 G
. C* z" M2 {0 F% s6 j          vqmul.u32 q1, q2, q3# K( L6 }7 [2 ?  G% j1 n. K% Q

* y9 j/ D+ a7 C6 f后一个的时间要比第一个的时间要久。
+ Q9 m- w9 f2 P; f. w
6 G4 Y% b  S+ T; ?% b# n. w" F6 J在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。7 X) f8 }  P3 D# F9 s( {

, u1 f  ~' a7 }例如:vld1.64 {d0}, [r0], r1$ U6 I. n5 P2 c

该用户从未签到

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

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 04:39 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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