|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' J( ^5 O9 L' Y' @ [- W
1. 去除数据依赖 . \( K1 N' O) T9 O8 Z
不要将当前指令的目的寄存器作为下一条指令的源寄存器!
2 D' B" R# N6 g, B0 H& H原因:ARM架构采用的是多级流水线技术,如果下一条指令的源寄存器是当前指令的目的寄存器,就需要当前指令执行完之后,下一条指令才能取指执行,这样会产生很大的延迟,影响性能。
' b2 Z# V# }7 h' Z: A, s9 P5 `9 h- F& a8 a2 B! F
2. 减少分支跳转
. E0 C5 j- q+ ZARM处理器中广泛使用分支预测技术。但是一旦分支预测失败,性能就会损失很大。所以, - {9 U1 T+ j+ Q6 n
尽量不要用分支跳转!可以采用逻辑运算指令替代分支跳转! ( U8 A: @( {4 l: ]7 k
比如: ; F, L' D. N3 P: |2 Z
VCEQ, VCGE, VCGT, VCLE, VCLT……
/ s3 M+ {# g+ i2 t; NVBIT, VBIF, VBSL…… ! a6 C( x$ b7 v7 R& [% i" q7 E
另外,可以使用条件执行指令,比如addgt,suble等减少分支跳转! . h0 e' w. W. M9 e5 a7 z, g
建议一次性多处理几行数据,从而减少循环跳转的次数,提升性能。; S0 Y g8 ^: K) y0 P0 e1 l0 P! k
. X9 {! K1 ]' u0 O3. 建议使用预载指令PLD & y5 @. ^1 d/ a% Z4 L' }" L
PLD允许处理器告知内存系统在不久的将来会从指定地址读取数据,若数据提取加载到cache中,将会提高cache hit,从而提升性能。 7 w D& d7 f5 v; Z4 C
风险:不过最新架构对PLD指令的支持并不好,在不确定的情况下使用,可能会损失性能!8 y( I0 H6 T7 n) l2 t7 c' [
' k, S7 Q. a: m0 V, x2 U0 ^- 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.
0 I/ h" Q. ?* d4 G( T
9 G) S; S, q# \2 Y q1 s& ^- n7 _
2 t" M5 O: M; ^3 C6 c4. 关注指令周期延迟
( z$ H$ n; b5 IVMLA指令可以替代VMUL+VADD,但是由于VMLA的指令延迟比较大,在后面没有并行指令时,可能性能并不如VMUL+VADD。
/ R% p- a I0 K% q F+ }0 ~& e% @2 V( i4 z
5. NEON assembly and NEON intrinsic PeRFormance Contrast $ |% G; C* i4 F; `
NEON assembly:
' J4 `- F2 E/ b* U: n* j' gAlways shows the best performance for the specified platform for an experienced developer.
0 Q: j+ J: ^: U$ v& |; i' G% E4 ANEON intrinsic:
" Q# o& D* I: {3 a) M7 v7 pDepends heavily on the toolchain that is used. |
|