EDA365电子论坛网
标题:
arm neon 优化技巧
[打印本页]
作者:
haidaowang
时间:
2021-4-29 17:57
标题:
arm neon 优化技巧
+ E6 @. J! b$ E0 D
1. 去除数据依赖
O8 h( T- ^ P+ p% a; ~0 x
不要将当前指令的目的寄存器作为下一条指令的源寄存器!
, U: u j5 K5 d8 |7 C: C
原因:arm架构采用的是多级流水线技术,如果下一条指令的源寄存器是当前指令的目的寄存器,就需要当前指令执行完之后,下一条指令才能取指执行,这样会产生很大的延迟,影响性能。
; N1 m6 L/ `8 X* d r: J1 d+ C8 c
( z# C& k3 u/ p8 J
2. 减少分支跳转
, v1 a9 c) |; ]2 S' i5 C7 N
ARM处理器中广泛使用分支预测技术。但是一旦分支预测失败,性能就会损失很大。所以,
- A' I, U3 W; t) T8 ^; l
尽量不要用分支跳转!可以采用逻辑运算指令替代分支跳转!
( A: C8 n" q8 W% o. \% F
比如:
3 m4 n, @$ J" }9 C# E m0 S5 d' _
VCEQ, VCGE, VCGT, VCLE, VCLT……
e2 W: l1 }* U2 {% Q- W9 V, H% }! {
VBIT, VBIF, VBSL……
8 @: v. B" z5 D ^
另外,可以使用条件执行指令,比如addgt,suble等减少分支跳转!
3 H; e) {5 U! _8 x% V
建议一次性多处理几行数据,从而减少循环跳转的次数,提升性能。
8 [4 \3 x" `) B; G! I
# `; y1 g& |, z `# Z
3. 建议使用预载指令PLD
. O( Q; I& _8 b) U
PLD允许处理器告知内存系统在不久的将来会从指定地址读取数据,若数据提取加载到cache中,将会提高cache hit,从而提升性能。
5 _6 ?' o6 M5 R2 w
风险:不过最新架构对PLD指令的支持并不好,在不确定的情况下使用,可能会损失性能!
- J+ Z A0 z' d& k" f: M
: t* l6 I+ x: ~
PLD syntax:
PLD{cond} [Rn {, #offset}]
PLD{cond} [Rn, +/-Rm {, shift}]
PLD{cond} label
Where:
Cond - is an optional condition code.
Rn - is the register on which the memory address is based.
Offset - is an immediate offset. If offset is omitted, the address is the value in Rn.
Rm - contains an offset value and must not be PC (or SP, in Thumb state).
Shift - is an optional shift.
Label - is a PC-relative expression.
5 c X" y2 w- c& j! ~
( \5 U4 _* G5 B5 y+ h5 D+ C7 X$ z
0 y, S2 U$ C! s& G1 J X7 Y5 m: J
4. 关注指令周期延迟
; x! _$ E8 K& j5 R0 ?
VMLA指令可以替代VMUL+VADD,但是由于VMLA的指令延迟比较大,在后面没有并行指令时,可能性能并不如VMUL+VADD。
5 b* h5 S& v: o8 r, w
; O" T1 R9 I: b7 ^8 z! @5 \$ a
5. NEON assembly and NEON intrinsic Performance Contrast
+ Z5 ^" r4 X; Z; f3 z; k
NEON assembly:
3 ~+ [3 ^8 T2 a8 A6 B1 `
Always shows the best performance for the specified platform for an experienced developer.
0 L5 I0 T4 f& B8 n- X
NEON intrinsic:
4 j- g4 A! ~" `9 P. S; o
Depends heavily on the toolchain that is used.
作者:
Anda
时间:
2021-4-30 09:48
减少分支跳转
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2