|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ m; M2 C) F& c( L) _9 N1. 去除数据依赖 + R7 u5 p9 e2 a5 t9 X
不要将当前指令的目的寄存器作为下一条指令的源寄存器! 1 b' k3 I+ H2 W& w: l A/ _
原因:ARM架构采用的是多级流水线技术,如果下一条指令的源寄存器是当前指令的目的寄存器,就需要当前指令执行完之后,下一条指令才能取指执行,这样会产生很大的延迟,影响性能。9 L& Q' b( B2 o+ {: s
+ X2 {( b: W0 v2. 减少分支跳转 1 i' @8 t% i+ x; k3 J7 p9 W
ARM处理器中广泛使用分支预测技术。但是一旦分支预测失败,性能就会损失很大。所以,
, N; ~7 U2 g6 @; s1 h! w尽量不要用分支跳转!可以采用逻辑运算指令替代分支跳转! ! `8 e( F* Z6 }0 d [' f. \/ v, [6 j
比如: + ]5 }8 |- r( j' U7 w
VCEQ, VCGE, VCGT, VCLE, VCLT…… % z O2 p4 q. X0 q
VBIT, VBIF, VBSL…… d9 c. j$ i0 X
另外,可以使用条件执行指令,比如addgt,suble等减少分支跳转! & C l! S4 w( P0 g
建议一次性多处理几行数据,从而减少循环跳转的次数,提升性能。
7 ?* W6 ?/ Y2 d2 @& E) }
) R w% @+ G2 \3 F5 h! [. X3. 建议使用预载指令PLD
9 |( I: u U2 {3 D6 @PLD允许处理器告知内存系统在不久的将来会从指定地址读取数据,若数据提取加载到cache中,将会提高cache hit,从而提升性能。 * s8 J/ c" m; k& l5 d6 f+ R
风险:不过最新架构对PLD指令的支持并不好,在不确定的情况下使用,可能会损失性能!
: }% L1 j( _: E, o, D0 g( q# {7 a" n6 g. M9 P
- 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.
7 u% C: p! ~/ Z: w" P& p, }! ~( ~0 v
3 e1 y' U% M: T* A- t9 \
( e" V1 h8 x7 x% f4. 关注指令周期延迟 2 L7 M, {, u0 a% o) x+ ?
VMLA指令可以替代VMUL+VADD,但是由于VMLA的指令延迟比较大,在后面没有并行指令时,可能性能并不如VMUL+VADD。
4 |5 C9 d( d% ~ ]( ?8 k# @7 d2 F- f. |- M
5. NEON assembly and NEON intrinsic PeRFormance Contrast ; C4 p2 Q: }! s
NEON assembly:
. ~$ b) p, Z, `4 FAlways shows the best performance for the specified platform for an experienced developer. 8 C' v: Z- c K9 z0 D
NEON intrinsic:
4 o3 k8 i8 o! M1 w+ [/ V5 L: bDepends heavily on the toolchain that is used. |
|