|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、首先考虑从系统结构上优化,比如尽量减少待处理数据的无谓搬移,考虑你DSP片内存储量和每次处理数据量对系统结构优化,这部分的优化应该最早做;
% j+ Y6 h4 ]; y& t
" t7 P7 E; p) L: Y3 `
' w8 u; i8 ?9 y' B; A二、其次从算法层面上着手,看采用的算法有没有更好更简单的计算方法,算法是否有某种对称性,可否采用更合适的数据结构等等,这方面的优化比程序上的优化更明显;! u8 k8 i6 h& X% q7 S# C$ r
9 U+ q: r" J1 N4 {4 Y
, v4 R, T3 Y& I% [# z
C& J# I. ^% U3 E+ H+ h& P3 H2 J) X* N8 k" }( m+ V/ H9 c
三、如果算法层面暂时无更好的优化办法,看看软件结构能否优化。$ G1 E. w2 m3 m/ [& O
5 V# y$ U5 z9 x6 P/ R7 h比如:
$ k4 T! G( w& i j4 q 1)多层的循环结构能否减层。我经常看到这样的程序:
1 n. {+ v( l/ Z5 c2 J for(i = 0; i++; i< A)
8 }3 a6 ~1 o. z/ x/ u' W% T for(j = 0; j++ j< B)! Q2 ^3 h2 K4 V( o* w/ D
{( q G# O$ U& a x
E[j] = C[j] - D[j];! \" v) V( \- @+ c' J0 \7 d
}
0 m/ L C: `0 p' D 这个可以优化成:. d3 A- Z% F% M7 C- f2 V2 c) m
for(i = 0; i++; i<A*B)9 z( Z% K5 t9 v3 H1 t
{
- l ~9 M7 X' n" } E = C - D;0 q. U/ [4 R9 l/ _( {) t4 F7 q
}+ G& `% V+ E: ~8 w' E# M ~1 d
2) 关键循环结构中的条件、跳转指令应尽量避免,哪怕会增加一些循环次数,循环中没有条件指令优化器更容易优化;. o8 p! M% y( g7 f' O; f
3)关键循环不要调用子函数' o4 B K3 K8 v& [* ^+ c# ?
其它还有一些,具体可以看看手册,手册上讲的很清楚。
/ f) \9 p7 I( g! Z% ]2 g
( p+ k; a! I A, x3 b; d l: v5 Z9 {' K
1 D$ p2 ?; ?" {" Z! g0 v
* X+ f7 i' S/ v& [
四、结合DSP系统的硬件结构优化" W4 z3 @, B. O4 ?; M
) T! O1 q: I( G) Z3 ]1 A; l5 t% |( _$ n& L8 [4 i( x3 a+ X( y: _! U$ V! x
1)看你处理的数据是放在片内还是片外,如果放在片外的话这个建议将数据分块分批倒入片内处理,类似于流水结构;+ ?/ h* Z C/ \5 Z+ k8 v
: k* Y- K+ F- Q0 y
2 u; Q7 J) x0 ~7 C$ P. C 2)针对外部数据可对L2 cache优化/ A9 S. e7 B& }+ n- ]
2 R0 J6 l$ M) h& f
7 l& k. W& D- E" ?0 B; G! H+ {! t7 ~
五、结合DSP优化器、指令系统等进行优化+ s2 j' Y* M8 G7 @0 `
6 _, F! |% w1 b# K! j0 ]0 n
7 X1 I1 {7 U% ]) \0 x' ? 这部分可以详细的看TI的手册,大概有这几个方法:' E5 _# C& |2 t/ g
3 N6 K+ x, y% M. W8 t; y0 h; u' J( f! I2 @" N. y. m9 T/ t
1)优化选项,-o3 -pm 取消-g 等等这些选项,如果你的软件结构很好,那么它们的优化效果很明显;; W1 T$ ]" G" h$ y( @* d8 L
2)加一些优化指示符指导优化,这部分看手册,包括存储地址无关性,SIMD(单指令多数据处理)等等;
% P% d- k6 j7 P, V, |% K 3)用一些专用指令,比如6000提供饱和加、溢出减指令,可以不必用条件判断;
+ Y- I- ^, ?& ?3 o0 A 4)如果效果还是不好,用线性汇编改写你的程序,将你的优化思想用线性汇编表述出来,一般到地步就可以了;
3 L! E$ e0 F Y5 u* N0 _! L 5)如果线性汇编优化未能尽显你的优化思想,那就汇编吧,优化器不会再帮助你优化,完全是你自己控制程序了;$ J) z$ J |0 x; x
这部分需要有比较丰富的优化经验和扎实的优化功底,多多积累,多看资料。0 A1 }; G( ^' j. w+ v
ps:2 k/ f: e5 o% K- a' i7 h
系统结构上的优化这个需要在方案阶段考虑,主要是硬件和数据流这些方面的!
) p9 a% h' p) i, w v 算法这个东西很重要,做优化的最好对算法有大致地了解才行,有时一个实现思路的改变会帮你优化很多。# l5 H+ S& c$ s: S' P
就算你不对算法本身做优化,对算法了解对你做程序优化也是有帮助的。+ M/ T9 ~2 ^- r; _) @1 _ Z
我是从汇编转到C上来的,后来对C做优化的时候发现对汇编指令的了解非常有助于做优化,3 a0 @( A6 |. Q. v9 W& }4 Q
你有空的话可以看看汇编指令,尤其是64核的dsp,很多打包指令和SIMD指令对程序级优化帮助很大。9 R4 ~% K$ H, Z: q& {. h# {( {
你不用写汇编,写写线性汇编就行了,不用安排并行,这点比汇编省很多功夫。# Q2 R( \6 U9 B% [8 A5 y: `
我现在做优化都是试着用c做,然后看看反汇编的指令,不满意的话用线性汇编写个,一般到这步都差不多了。
6 G1 _3 @9 I$ p' \- m 还有可以多看看ti imglib的优化代码,ti提供了,多看看你会有收获的!8 b% Z' o; L( J5 V- ]
# l5 o5 h5 x$ V$ T7 T
# X, V- A% L8 @4 b% S8 ^1 X4 S) r/ v+ J& N2 D$ n$ y: P3 e
! {" a4 I, S$ ~) A0 _" L, H) x
最后要重点说下:
* A. \ e: a# N: H$ ?+ J4 V5 K5 C 优化是没有止境的,在对程序对细致优化前要对程序每个部分测试下时间,要对非常耗时的部分做优化,一但满足你的要求就可以,不要为了优化而优化,我们应该有更重要的东西要学,不要陷在优化上而不能自拔!
- O. D W3 d: L6 C) i! k' B/ v
8 C/ F# O' t" j9 T: G1 e' ~1 w9 e( s$ Y! a0 N, X. ^2 A: [6 P
+ b4 g$ m" X0 j' R6 B* r) B
- W. R$ s) R1 m8 g6 O; p
+ C! `: q% ]; T2 u
7 o: @4 Z, r4 o. B( b
( T# j: i6 J4 ?( B5 Q3 H% D4 A5 }
|
|