|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、首先考虑从系统结构上优化,比如尽量减少待处理数据的无谓搬移,考虑你DSP片内存储量和每次处理数据量对系统结构优化,这部分的优化应该最早做;
: O. ^$ o3 b1 ?% }
; o9 P1 c9 K4 V9 i3 a7 z# X! d
( W9 z D' f4 p4 b" ~( y$ n二、其次从算法层面上着手,看采用的算法有没有更好更简单的计算方法,算法是否有某种对称性,可否采用更合适的数据结构等等,这方面的优化比程序上的优化更明显;3 D7 S: d3 n2 L. X
1 V( g! Y! v6 c7 a. r7 A4 C- e( u# }# p% ~
* b6 ]( m3 h1 e* v" y7 f5 E+ W% G' s, q9 k. q- }9 Y
三、如果算法层面暂时无更好的优化办法,看看软件结构能否优化。
* h- K9 _2 G1 [. J3 \
; B6 _( \5 r# D比如:" m- Q( U! d. [2 S. Q# E
1)多层的循环结构能否减层。我经常看到这样的程序:
7 {6 j; n: ]7 ^# r% V for(i = 0; i++; i< A)& f, o# w% ^, j( H
for(j = 0; j++ j< B)% `, c2 w$ r1 j5 K! P) g4 P4 K2 `0 q
{' w2 I J5 L: f4 ?
E[j] = C[j] - D[j];
+ j8 W/ k% }3 l }
+ R) b2 E- A: d: l( T0 M 这个可以优化成:
# A( {6 }8 R, _4 m for(i = 0; i++; i<A*B). k$ W" D$ M1 v4 W/ N
{
. x' G7 ?( }3 q% j2 x4 N E = C - D;$ @3 X7 N M9 r) D" Y) l7 ]" D4 ]
}# y/ t3 \1 v/ ~% E% H8 ^4 L
2) 关键循环结构中的条件、跳转指令应尽量避免,哪怕会增加一些循环次数,循环中没有条件指令优化器更容易优化;
; k! Y3 x& G& K4 f8 G 3)关键循环不要调用子函数; s, c3 n) |' ^
其它还有一些,具体可以看看手册,手册上讲的很清楚。
* ~' B& w( D; }0 y* b9 x: J: r3 h2 X" e6 U4 s$ d+ P2 @ N
- j0 R9 w" S. M" @; k4 n
% \0 z. t: F9 g3 w5 f: ~+ y8 T; {) n* m% O
四、结合DSP系统的硬件结构优化
5 ?& R" |- B; b! u% k8 C; e$ v' c) O; D0 {% S+ X/ c7 A! p
% @6 V6 y( c; E8 T4 m
1)看你处理的数据是放在片内还是片外,如果放在片外的话这个建议将数据分块分批倒入片内处理,类似于流水结构;+ d- S( y( v. X; m" y5 ^% G
1 O& Z6 a! [8 x
' c* [4 w& L! W5 L3 }8 c0 p
2)针对外部数据可对L2 cache优化
- [3 i. ?5 z. O/ y5 b$ W; \5 r- K' D" ?7 j6 s2 W5 S0 o0 h! i
; _/ o5 d/ X0 h9 p五、结合DSP优化器、指令系统等进行优化
% t7 O8 B+ h$ T$ X
9 }1 Z T! l+ a1 _2 F5 q& m1 ~ K5 [+ J. \; v
这部分可以详细的看TI的手册,大概有这几个方法:+ P: F6 B7 R- X- p2 Q
2 I+ P' X' V. _( ?# ^ ]( Y' {7 I* o# V9 }, ?: g
1)优化选项,-o3 -pm 取消-g 等等这些选项,如果你的软件结构很好,那么它们的优化效果很明显;) b% H1 p0 G% [4 x
2)加一些优化指示符指导优化,这部分看手册,包括存储地址无关性,SIMD(单指令多数据处理)等等;
3 |4 U' R6 K6 r. U9 j2 T9 ^ 3)用一些专用指令,比如6000提供饱和加、溢出减指令,可以不必用条件判断;
: |! e2 w: d0 r* ]3 R 4)如果效果还是不好,用线性汇编改写你的程序,将你的优化思想用线性汇编表述出来,一般到地步就可以了;
9 W, e. }4 W4 W8 v5 O' m 5)如果线性汇编优化未能尽显你的优化思想,那就汇编吧,优化器不会再帮助你优化,完全是你自己控制程序了;) v& a( K* r& B+ b. j
这部分需要有比较丰富的优化经验和扎实的优化功底,多多积累,多看资料。
/ r$ ?$ @+ f" q$ F- Fps:
1 U' Y4 |" I5 Y4 Y+ P 系统结构上的优化这个需要在方案阶段考虑,主要是硬件和数据流这些方面的!
4 @) k+ c2 c" x1 C V* f5 l 算法这个东西很重要,做优化的最好对算法有大致地了解才行,有时一个实现思路的改变会帮你优化很多。/ b* }4 i Y$ x
就算你不对算法本身做优化,对算法了解对你做程序优化也是有帮助的。- ^& z0 \0 ^6 Z t$ B
我是从汇编转到C上来的,后来对C做优化的时候发现对汇编指令的了解非常有助于做优化,
2 I9 s1 a( n2 }) u8 X 你有空的话可以看看汇编指令,尤其是64核的dsp,很多打包指令和SIMD指令对程序级优化帮助很大。
/ U1 L: w3 |/ b 你不用写汇编,写写线性汇编就行了,不用安排并行,这点比汇编省很多功夫。
! g9 l; o9 I+ p5 O$ b4 Y 我现在做优化都是试着用c做,然后看看反汇编的指令,不满意的话用线性汇编写个,一般到这步都差不多了。. [- O# T: R- k
还有可以多看看ti imglib的优化代码,ti提供了,多看看你会有收获的!+ F/ ^6 E2 ]0 B- E. U; b6 y! Q$ i
2 A* Z# b" X- S' I3 I, f
5 E$ \/ \4 Y: ^) L. s- \; h% E8 H9 ^' j% Z
( L! e( m$ f' x: h6 y
最后要重点说下:2 v! U2 R) S3 }2 c
优化是没有止境的,在对程序对细致优化前要对程序每个部分测试下时间,要对非常耗时的部分做优化,一但满足你的要求就可以,不要为了优化而优化,我们应该有更重要的东西要学,不要陷在优化上而不能自拔!
3 y# ~: s# V& O- [) H8 T7 [: h* K7 ?( s
- h, n; K$ J; w, v, O: u+ ]5 F# F+ n6 {
/ g4 o3 E+ \# O! ?: x
$ p# K! M; n% r# n: F
% i" Y. i* l( Q* r: H. ^' J6 z5 n A# N' O, g- Z) @
. m e, V- @" ^" H$ Y
|
|