EDA365电子论坛网

标题: 聊一聊 TI DSP 6000系列的优化经验 [打印本页]

作者: ulppknot    时间: 2019-7-19 14:54
标题: 聊一聊 TI DSP 6000系列的优化经验
一、首先考虑从系统结构上优化,比如尽量减少待处理数据的无谓搬移,考虑你DSP片内存储量和每次处理数据量对系统结构优化,这部分的优化应该最早做;" A% I& q9 c1 h' A

6 `/ M8 J% K$ @/ h# B8 t" v
; q! P3 |7 I: A" I" V# I5 k二、其次从算法层面上着手,看采用的算法有没有更好更简单的计算方法,算法是否有某种对称性,可否采用更合适的数据结构等等,这方面的优化比程序上的优化更明显;( V" W/ `4 j3 v
7 H, B6 [7 G& C" _/ k" N

1 l1 w7 H( T0 t( H+ J
1 x% D! P- F9 \5 d" A, D$ P
) S1 L; A: Z/ u$ X4 l
三、如果算法层面暂时无更好的优化办法,看看软件结构能否优化。
, E7 H) c0 M4 Y4 ?, j7 ]$ a5 L( j( ?9 M0 n0 V- @
比如:
& `. b: \: K: M; c0 u; e/ c      1)多层的循环结构能否减层。我经常看到这样的程序:
. p5 X& S; Y, {8 V         for(i = 0; i++; i< A)
/ @- u5 C( j% j5 P+ \+ w; m                for(j = 0; j++ j< B)' {( Q1 [, N! b- J
                {
9 u3 z! \( X# Z1 w                      E[j] = C[j] - D[j];" Z) ]- ]) L: D+ _/ B
                }3 {; A3 z- L4 n* U2 N
         这个可以优化成:$ L+ {9 O& p- H, p2 T1 |+ T
         for(i = 0; i++; i<A*B)' F: j7 l# ]; z
         {" `% W( ~- z$ K' i6 \
                  E = C - D;1 E1 U8 R- W+ W  o
             }3 A7 W: e6 N3 Z0 w, M. A
         2) 关键循环结构中的条件、跳转指令应尽量避免,哪怕会增加一些循环次数,循环中没有条件指令优化器更容易优化;2 y. J6 U# F4 ^/ D; K0 ]3 i+ L
         3)关键循环不要调用子函数
# H# x) \7 K) \# f; u/ H         其它还有一些,具体可以看看手册,手册上讲的很清楚。" R( Y) H& n7 p* }( f$ I3 T* t
& e! w8 H, F  J4 H7 \" x

, p' |' e8 f! S9 z2 F
" O8 N+ s4 D4 l6 \5 l1 u" u
) G& j8 u  J  J) R
四、结合DSP系统的硬件结构优化6 a: u4 y: v0 ]# i; k  k7 o
7 I% w7 L$ M, ]. ^3 W" x# u% B1 R: L1 z
* l; A( p- Z; ^8 w+ R: g* S2 v
         1)看你处理的数据是放在片内还是片外,如果放在片外的话这个建议将数据分块分批倒入片内处理,类似于流水结构;
* l& x* l1 [( Y2 U
$ k+ A+ M" Q$ f7 n
2 t* R1 |' L" S
         2)针对外部数据可对L2 cache优化3 S0 ~7 c* `  }7 W- d# G+ x) q/ R
9 u" f; K  w; L4 o2 \
; V0 [1 a1 S, F$ p9 u$ W6 J! s+ Q
五、结合DSP优化器、指令系统等进行优化+ M& y' P# G9 y, ?
5 X4 `+ r- D. g) B- W2 c
+ F1 ]3 K: u7 H- ~$ V. Q
          这部分可以详细的看TI的手册,大概有这几个方法:
  V0 x# N, W$ |1 ^6 |/ K  i7 k
# T0 T) u$ }8 r0 N  e
         1)优化选项,-o3 -pm 取消-g 等等这些选项,如果你的软件结构很好,那么它们的优化效果很明显;
  s# c7 ^3 P) D8 P( R/ c5 o3 y         2)加一些优化指示符指导优化,这部分看手册,包括存储地址无关性,SIMD(单指令多数据处理)等等;0 x( {9 y6 K& k2 G
         3)用一些专用指令,比如6000提供饱和加、溢出减指令,可以不必用条件判断;6 s7 }. [) a. D; {2 K# X' S
         4)如果效果还是不好,用线性汇编改写你的程序,将你的优化思想用线性汇编表述出来,一般到地步就可以了;; h) T9 B: }' T7 X7 V
         5)如果线性汇编优化未能尽显你的优化思想,那就汇编吧,优化器不会再帮助你优化,完全是你自己控制程序了;
' H2 F6 [. p5 \& M: A" E          这部分需要有比较丰富的优化经验和扎实的优化功底,多多积累,多看资料。
/ h% N5 j- v, o( `: y" hps:# A: t% p& ^  c- `/ H
      系统结构上的优化这个需要在方案阶段考虑,主要是硬件和数据流这些方面的!
  i! h/ O/ Q1 f0 x4 H3 e      算法这个东西很重要,做优化的最好对算法有大致地了解才行,有时一个实现思路的改变会帮你优化很多。
! W% G4 b. {* G1 q- N7 _, v      就算你不对算法本身做优化,对算法了解对你做程序优化也是有帮助的。( E9 G7 _: g8 M" Q* p
      我是从汇编转到C上来的,后来对C做优化的时候发现对汇编指令的了解非常有助于做优化,
, D% P$ o1 m0 D9 o  Y6 X      你有空的话可以看看汇编指令,尤其是64核的dsp,很多打包指令和SIMD指令对程序级优化帮助很大。. ]+ P# V. H+ G7 ~* a
      你不用写汇编,写写线性汇编就行了,不用安排并行,这点比汇编省很多功夫。
* b- X. L& q/ p" T      我现在做优化都是试着用c做,然后看看反汇编的指令,不满意的话用线性汇编写个,一般到这步都差不多了。6 S1 j" w1 j2 G
      还有可以多看看ti imglib的优化代码,ti提供了,多看看你会有收获的!
3 V2 K1 e1 @  |) Z; v
* U( c( p) G( d* W3 h

. k  w1 w6 L- R) Z
7 c  i( w, ?: A1 L/ c, M
5 ?6 R2 n- b, j5 @8 n
最后要重点说下:
6 c* A) X8 |+ Q% n- k          优化是没有止境的,在对程序对细致优化前要对程序每个部分测试下时间,要对非常耗时的部分做优化,一但满足你的要求就可以,不要为了优化而优化,我们应该有更重要的东西要学,不要陷在优化上而不能自拔!- X: z2 w9 S, \% h2 c2 c

0 u" k/ H3 E. z2 X8 |
8 Y" }7 U- A( _; b# F
" s" L: v3 b% v) \" S
, {* T  v/ Z# y: t/ _1 i7 f! F# J

6 _* r% R4 J5 l# j# E
" F) Q3 E  D* k: [8 v( d6 R/ R
8 A( o7 V* l9 U! N  o" D2 W; V9 d
. i9 X0 o/ i* B; N3 Q1 Z

作者: 姗姗的shanshan    时间: 2019-7-19 18:32
TI DSP 6000系列的优化经验




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2