|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、首先考虑从系统结构上优化,比如尽量减少待处理数据的无谓搬移,考虑你DSP片内存储量和每次处理数据量对系统结构优化,这部分的优化应该最早做;! S3 M! o2 P) I% O
0 M9 b( S7 a/ L" b" p2 ]. K! |6 U
( L2 [7 X+ ~8 x1 i
二、其次从算法层面上着手,看采用的算法有没有更好更简单的计算方法,算法是否有某种对称性,可否采用更合适的数据结构等等,这方面的优化比程序上的优化更明显;
% [ b' [& q7 h( d5 n( V7 o' L) ]2 ]4 P
7 y6 H4 n9 d3 \# K. u( R
% f, h6 w t6 n( i" Q8 Z1 _' `8 P& u' o; p. i/ U4 i/ U: ^
三、如果算法层面暂时无更好的优化办法,看看软件结构能否优化。9 l9 k! q( r5 J) F* {
! s$ f! K$ e1 J$ }. `0 `6 O }比如:/ [! V: q5 i. X& b1 P# a' S
1)多层的循环结构能否减层。我经常看到这样的程序:
' O- y5 j' i0 W6 J for(i = 0; i++; i< A)
8 S3 ]7 s7 N- c" q0 F4 W for(j = 0; j++ j< B)
! ~, \) H1 i, c {& k2 c0 u. w# E$ V3 }
E[j] = C[j] - D[j];- o: v4 v, l5 W( t
}
7 p- K9 c; d8 M O" ?" I+ J 这个可以优化成:5 C! c8 W, }8 G3 {. T# i
for(i = 0; i++; i<A*B)% q& T6 ]+ `! Y- W4 ?
{
, ~& \6 V$ x5 r/ W E = C - D;+ B0 u G3 }2 j! T2 v
}
- l+ [) b0 r% [ l* s% e 2) 关键循环结构中的条件、跳转指令应尽量避免,哪怕会增加一些循环次数,循环中没有条件指令优化器更容易优化;% o# o7 @/ V l
3)关键循环不要调用子函数 ~( u. P) H! w) q* c# {
其它还有一些,具体可以看看手册,手册上讲的很清楚。' f8 \3 _# t! P
. F0 ~7 A. J/ v! t& B8 V
# a& D' x( G, A, J' V4 O E
1 E$ \ x3 p0 o0 ]+ V9 b6 y& z- t( ^4 @" b
四、结合DSP系统的硬件结构优化
9 f4 t% b/ Y3 ^! O, z7 z7 Q, A4 Z: Z7 F" W* A0 x& V+ s1 M
6 B8 U3 g/ k9 E$ I1 { 1)看你处理的数据是放在片内还是片外,如果放在片外的话这个建议将数据分块分批倒入片内处理,类似于流水结构;
2 Z# o$ b1 |+ @8 G( V, e! `7 T
: Q' H% W. w6 C, `0 a& H9 E% g
3 Y* D# E% o+ H) w) N 2)针对外部数据可对L2 cache优化, H! Z% N2 a3 X6 N- Z
2 C* @5 @; w3 W2 B) [( |5 b
) }+ a0 Y0 l4 [" j6 `, }( H4 D
五、结合DSP优化器、指令系统等进行优化# C- ^4 o8 Q+ ? T* }) i
, Q$ {; l7 X3 U# j/ b; m. t* Y% X5 ?) b/ B& f1 T$ [2 e4 q' ~
这部分可以详细的看TI的手册,大概有这几个方法:% [7 C+ M3 k/ L, K- |8 j5 E
5 b# A u8 v& }4 e
1 S. A( x, d! L P 1)优化选项,-o3 -pm 取消-g 等等这些选项,如果你的软件结构很好,那么它们的优化效果很明显;
) `1 H9 a8 f2 R) W$ r 2)加一些优化指示符指导优化,这部分看手册,包括存储地址无关性,SIMD(单指令多数据处理)等等;9 J" {9 I. b ~4 K6 ^
3)用一些专用指令,比如6000提供饱和加、溢出减指令,可以不必用条件判断;0 I7 Z9 I; x* p- p. Z2 B
4)如果效果还是不好,用线性汇编改写你的程序,将你的优化思想用线性汇编表述出来,一般到地步就可以了;
. Y1 f% k3 Y, V 5)如果线性汇编优化未能尽显你的优化思想,那就汇编吧,优化器不会再帮助你优化,完全是你自己控制程序了;
1 r* a; z( I- i$ x' H 这部分需要有比较丰富的优化经验和扎实的优化功底,多多积累,多看资料。
. f( ~4 c) H7 I# ~ps:0 R' {5 S3 ^- } r& Y% p2 R. G
系统结构上的优化这个需要在方案阶段考虑,主要是硬件和数据流这些方面的!
8 ]! j: w9 j. v4 b$ v& D; X 算法这个东西很重要,做优化的最好对算法有大致地了解才行,有时一个实现思路的改变会帮你优化很多。
" m! h. K% ?7 L8 Y A 就算你不对算法本身做优化,对算法了解对你做程序优化也是有帮助的。
6 t% f" K) p. Y7 g 我是从汇编转到C上来的,后来对C做优化的时候发现对汇编指令的了解非常有助于做优化,
2 y: _0 e* F1 t0 n# Z 你有空的话可以看看汇编指令,尤其是64核的dsp,很多打包指令和SIMD指令对程序级优化帮助很大。! Z- u5 V3 `2 e
你不用写汇编,写写线性汇编就行了,不用安排并行,这点比汇编省很多功夫。/ `; p ?5 w1 L4 e) y9 b
我现在做优化都是试着用c做,然后看看反汇编的指令,不满意的话用线性汇编写个,一般到这步都差不多了。. ^/ @- Q3 O9 s6 A4 W
还有可以多看看ti imglib的优化代码,ti提供了,多看看你会有收获的!$ U8 V( ?. Z. h4 l, s' n- v# v
5 j* x; ~: e6 f6 V% ^% |/ L2 K
/ Z9 e3 Q* f7 o3 _# Q% r6 Y
+ {) u6 N& T4 `7 r X/ T! C6 |3 D: X5 @
最后要重点说下:% k* J; j; I% Q1 n( P% M& h9 }& w
优化是没有止境的,在对程序对细致优化前要对程序每个部分测试下时间,要对非常耗时的部分做优化,一但满足你的要求就可以,不要为了优化而优化,我们应该有更重要的东西要学,不要陷在优化上而不能自拔!' m. A. A' k. }' _1 n8 }
+ y+ H7 c* y) i' U# U/ g' k* n' O1 u
X! l* F0 J6 S4 ^2 S. s9 o
" D% ^) M4 ` G% R
2 D/ o) J& u0 \% X' Q4 v/ ~2 O
, V. r$ U" P- O( R- r! }! J* S% s& O/ [7 M1 C; K" H
& x, c9 \" `. z } M, g2 }
( D( @" O, Y' b9 ~$ ^& X$ E& b7 v |
|