方法一 把浮點運算改成定點運算
因為C6x DSP板并不支持浮點運算,但我們的原始程序代碼是浮點運算的格式,所以必須改成定點運算,而其修改后的執(zhí)行速度也會加快很多。我們采用 Q-format 規(guī)格來表示浮點運算。以下將介紹其相關(guān)原理。
定點DSP使用固定的小數(shù)點來表示小數(shù)部份的數(shù)字,這也造成了使用上的限制,而為了要分類不同范圍的小數(shù)點,我們必須使用Q-format的格式。不同的Q-format表示不同的小數(shù)點位置,也就是整數(shù)的范圍。Q15數(shù)字的格式,要注意在小數(shù)點后的每一位,表示下一位為前一位的二分之一,而MSB (most-significant-bit ) 則被指定成有號數(shù) ( Sign bit )。當(dāng)有號數(shù)被設(shè)成0而其余位設(shè)成1時,可得到最大的正數(shù) (7FFFH ) ;而當(dāng)有號數(shù)被設(shè)成1而其余位設(shè)成0時,可得到最大的負(fù)數(shù) ( 8000H ) 。所以Q15格式的范圍從-1到0.9999694 (@1) ,因此我們可以藉由把小數(shù)點向右移位,來增加整數(shù)部份的范圍,Q14格式的范圍增為-2.0到1.9999694 (@2) ,然而范圍的增加卻犧牲了精確度。
方法二 建立表格 ( table )
原來程序的設(shè)計是除了要讀AAC的檔案外,在譯碼時,還要再另外讀取一些C語言程序代碼的內(nèi)容再做計算,如讀取一些數(shù)值做sin、cos、exp的運算,但是為了加快程序的執(zhí)行速度,故將這這些運算的結(jié)果建成表格,內(nèi)建在程序中,可以不必再做額外的計算動做,以加速程序。
方法三 減短程序的長度
1.去除Debug的功能
原本程序在Debug的階段時,就加了許多用來偵測錯誤的部份,程序 Debug完后,已經(jīng)沒有錯誤發(fā)生,所以就可以把這些部份給去除,以減少程序的長度,也可以減少程序執(zhí)行時的時脈數(shù),加快程序的速度。
2.去除計算時脈( clock ) 功能
原本程序可以計算執(zhí)行程序所需的時脈數(shù),我們也可以把這些部份給去除,如果有需要計算時脈時,我們可以用C6x的工具軟件來作,功能更強大。
方法四 減少I/O 過程
原本在做譯碼的動作時,是先讀取AAC檔案的一部份做譯碼,譯碼完成后再讀取下一部份,再做譯碼。但是由于C6x的板子跟PC做檔案讀取時相當(dāng)?shù)木徛x取的動作占了大部份的時間,所以就將程序改成先將AAC檔案全部讀到C6x的內(nèi)存中,再做譯碼。或是將AAC建成表格(約1 MB),以避免DSP板上的內(nèi)存不足。
方法五 減少子程序的呼叫
在呼叫子程序時,必須先將緩存器的內(nèi)容放到堆棧(stack) 中,而從子程序返回時,也要將這些緩存器原本的內(nèi)容從堆棧中取出來。但是有些子程序的長度很短,而且被呼叫的次數(shù)又很多,往往幾個時脈就可以完成卻浪費時間在存取堆棧的內(nèi)容上,所以干脆將這些很短的子程序直接寫在主程序當(dāng)中,以減少時脈數(shù)。
方法六 寫匯編語言
雖然由C語言所編譯出來的匯編語言可以正確無誤的執(zhí)行,但是這個匯編語言卻不是最有效率的寫法,所以為了增加程序的效率,于是在某些地方,例如一些被呼叫很多次且程序代碼不長的函式(function),必須改以自己動手寫匯編語言來取代。
方法七 利用平行處理的觀念
C6x是一顆功能強大的處理器,它CPU的內(nèi)部提供了八個可以執(zhí)行不同指令的單元,也就是說最多可以同時處理八個指令。所以如果我們可以用它來作平行處理,我們就可以大大的縮短程序執(zhí)行的時間,最有效率的來利用它來作解碼的動作。
最后還要知道:
第三級優(yōu)化(-O3),效率不高(經(jīng)驗),還有一些諸如用一條讀32位的指令讀兩個相鄰的16位數(shù)據(jù)等,具體情況可以看看C優(yōu)化手冊。但這些效率都不高(雖然ti的宣傳說能達(dá)到80%,我自己做的時候發(fā)現(xiàn)絕對沒有這個效率!65%還差不多),如果要提高效率只能用匯編來做了。還有要看看你的c程序是怎么編的,如果里面有很多中斷的話,6000可以說沒什么優(yōu)勢。還有,profiler的數(shù)據(jù)也是不準(zhǔn)確的,比實際的要大,大多少不好說。還有dsp在初始化的時候特別慢,這些時間就不要和pc機相比了,如果要比就比核心的部分。
關(guān)于profile:
C6x的Debug工具提供了一個profile界面。在圖9中,包括了幾個重要的窗口,左上角的窗口是顯示出我們寫的C語言,可以讓我們知道現(xiàn)在做到了哪一步。右上角的窗口顯示的是C6x所編譯出來的匯編語言,同樣的我們也可以知道現(xiàn)在做到了哪一步。左下角的窗口是命令列,是讓我們下指令以及顯示訊息的窗口。而中間的profile窗口就是在profile模式下最重要的窗口,它顯示出的項目如下:
Count被呼叫的次數(shù)
Inclusive 包含子程序的總執(zhí)行clock數(shù)
Incl-Max 包含子程序的執(zhí)行一次最大clock數(shù)
Exclusive 不包含子程序的總執(zhí)行clock數(shù)
Excl-Max 不包含子程序的執(zhí)行一次最大clock數(shù)
利用這個profile模式我們可以用來分析程序中每個函數(shù)被呼叫的次數(shù)、執(zhí)行的時脈數(shù)等等。用這個分析的結(jié)果,我們就可以知道哪個函數(shù)所花費的時脈最多,是可以再改進(jìn)的,而針對它來作最佳化。
匯編代碼級的優(yōu)化
在經(jīng)過C代碼的優(yōu)化之后,還不能滿足性能上的要求,則可以通過profile
clock工具找出效率很低的部分,使用線性匯編重新改寫。再通過匯編優(yōu)化器編譯,匯編優(yōu)化器從輸入的線性匯編代碼中,完成以下功能:
● 尋找可以平行執(zhí)行的CPU指令。
● 在軟件流水線期間,處理流水線標(biāo)號。
● 分配寄存器的用法。
● 分配功能單元。
TI提供的匯編優(yōu)化器可以得到很高的效率,一般可以滿足性能上的要求。
優(yōu)化中的問題
在優(yōu)化過程中,總是要對程序進(jìn)行一定的改動,這樣經(jīng)常會出現(xiàn)一些問題。
1) 優(yōu)化結(jié)果的驗證
優(yōu)化過的程序往往不知道是否運行正確,這就需要加以驗證。一般采用的辦法就是通過測試序列來驗證。測試序列指的是對于不同的算法所取的一組特殊的數(shù)據(jù),這些數(shù)據(jù)可以準(zhǔn)確的反映算法的特性。測試序列中每組數(shù)據(jù)包括輸入數(shù)據(jù)和輸出數(shù)據(jù),通過對輸入數(shù)據(jù)的運算,把結(jié)果與輸出數(shù)據(jù)進(jìn)行比較,判斷程序的正確性。一些常見的算法,一般都提供了測試序列。還有一些,沒有測試序列。這時就需要根據(jù)算法的特點,自己構(gòu)造測試序列,進(jìn)行驗證。構(gòu)造的時候,注意序列最好有幾組,數(shù)據(jù)最好有一定的長度,這樣驗證的更準(zhǔn)確。
2) 內(nèi)存泄漏的問題
C64X系列DSP的內(nèi)部存儲空間有1MB,其中程序和數(shù)據(jù)還有CPU的二級緩存將共享這片空間,因此當(dāng)程序的運行不正常時,很有可能就是內(nèi)存泄漏造成的。因此,在程序設(shè)計中,應(yīng)盡量不用指針,同時注意進(jìn)行邊界檢測。
程序設(shè)計的一些方法
程序設(shè)計時,一切以滿足實際的要求為目標(biāo)。在實際的設(shè)計中,除了優(yōu)化能夠提高性能以外,還可以采取其他的辦法,利用DSP的特性,提高程序的運行性能,滿足實際的設(shè)計要求。
1) 把程序和經(jīng)常要用的數(shù)據(jù)放入片內(nèi)RAM
片內(nèi)RAM與CPU
工作在同一時鐘頻率,比片外RAM性能高得多。因此把程序放在片內(nèi)可以大大提高運行的速度。同時對于一些經(jīng)常要用到的數(shù)據(jù),放入片內(nèi),也會節(jié)省處理時間。
2) 通過DMA技術(shù)搬移數(shù)據(jù)
對于C64X芯片,其片內(nèi)RAM有1MB,但是對于一些大型的圖像處理算法而言,仍可能是不夠的,因此經(jīng)常通過DMA技術(shù),把需要用到的數(shù)據(jù)搬入片內(nèi),把不需要的搬到片外,可以大大的提高程序的運行速度。
3) CACHE的使用
增大CACHE,可以明顯的提高性能。但是C64X系列DSP中程序和數(shù)據(jù)還有CACHE共享片內(nèi)RAM,因此增大CACHE,就減小了實際的片內(nèi)可用空間,設(shè)計中需要注意。
-
dsp
+關(guān)注
關(guān)注
555文章
8141瀏覽量
355092 -
C語言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140178 -
編程
+關(guān)注
關(guān)注
88文章
3679瀏覽量
94845
原文標(biāo)題:DSP代碼優(yōu)化方法
文章出處:【微信號:changxuemcu,微信公眾號:暢學(xué)單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【火熱帖子TOP10】DSP編程技巧——持續(xù)更新中
優(yōu)化DSP功率預(yù)算的方法
基于DSP的任意碼長RS編碼及算法優(yōu)化
EPROM優(yōu)化快速編程方法研究
dsp編程用什么語言_dsp編程如何實現(xiàn)的

超全使用串口對DSP進(jìn)行應(yīng)用可編程的方法
基于DSP的軟件流水優(yōu)化
SDAccel環(huán)境剖析和最優(yōu)化指南

評論