dsp編程優(yōu)化方法-基礎(chǔ)電子_第1頁
dsp編程優(yōu)化方法-基礎(chǔ)電子_第2頁
dsp編程優(yōu)化方法-基礎(chǔ)電子_第3頁
dsp編程優(yōu)化方法-基礎(chǔ)電子_第4頁
dsp編程優(yōu)化方法-基礎(chǔ)電子_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

精品文檔-下載后可編輯dsp編程優(yōu)化方法-基礎(chǔ)電子4)short型數(shù)據(jù)的int處理C64XDSP具有雙16bit擴(kuò)充功能,芯片能在一個(gè)周期內(nèi)完成雙16bit的乘法、加減法、比較、移位等操作。在設(shè)計(jì)時(shí),當(dāng)對連續(xù)的short型數(shù)據(jù)流操作時(shí),應(yīng)該轉(zhuǎn)化成對int型數(shù)據(jù)流的操作,這樣可以把兩個(gè)16位的數(shù)據(jù)讀入一個(gè)32位的寄存器,然后用內(nèi)部函數(shù)來對它們處理(如_sub2等),充分運(yùn)用雙16bit擴(kuò)充功能,可以進(jìn)行兩個(gè)16bit數(shù)據(jù)的運(yùn)算,速度將提升一倍。5)盡量少進(jìn)行函數(shù)調(diào)用函數(shù)調(diào)用的時(shí)候,要將PC和一些寄存器壓棧保存,函數(shù)返回時(shí),則將這些寄存器出棧返回,增加了一些不必要的操作。所以一些小的函數(shù),是用適當(dāng)?shù)膬?nèi)聯(lián)函數(shù)代替直接寫入主函數(shù)里,一些調(diào)用不多的函數(shù),也可以直接寫入主函數(shù)內(nèi),這樣可減少不必要的操作,提高速度。但是這樣往往會(huì)增加程序的長度,因此是一種利用空間換取時(shí)間的辦法。6)盡量使用邏輯運(yùn)算代替乘除運(yùn)算在DSP里,乘除運(yùn)算指令的執(zhí)行時(shí)間要遠(yuǎn)遠(yuǎn)超過邏輯移位指令,尤其是除法指令,在設(shè)計(jì)的時(shí)候,可以根據(jù)實(shí)際情況,進(jìn)行一些調(diào)整,盡量用邏輯移位運(yùn)算來代替乘除運(yùn)算,這樣可以加快指令的運(yùn)行時(shí)間。7)軟件流水線技術(shù)的使用軟件流水線技術(shù)用來對一個(gè)循環(huán)結(jié)構(gòu)的指令進(jìn)行調(diào)度安排,使之成為多重迭代循環(huán)并行執(zhí)行。在編譯代碼時(shí),可以選擇編譯器的-o2或-o3選項(xiàng),則編譯器將根據(jù)程序盡可能地安排軟件流水線。在DSP算法中存在大量的循環(huán)操作,因此充分地運(yùn)用軟件流水線方式,能極大地提高程序的運(yùn)行速度。但使用軟件流水線還有下面幾點(diǎn)限制:●循環(huán)結(jié)構(gòu)不能包含代碼調(diào)用,但可以包含內(nèi)聯(lián)函數(shù)?!裱h(huán)計(jì)數(shù)器應(yīng)該是遞減的?!裱h(huán)結(jié)構(gòu)不能包含break,if語句不能嵌套,條件代碼應(yīng)當(dāng)盡量的簡單?!裱h(huán)結(jié)構(gòu)中不要包含改變循環(huán)計(jì)數(shù)器的代碼?!裱h(huán)體代碼不能過長,因?yàn)榧拇嫫鳎?2個(gè))的數(shù)量有限,應(yīng)該分解為多個(gè)循環(huán)。在軟件流水線的運(yùn)用上,應(yīng)該盡量使復(fù)雜的循環(huán)分解成簡單的小循環(huán),以避免寄存器的數(shù)量不夠;對于過于簡單的循環(huán),應(yīng)該適當(dāng)?shù)恼归_,以增加代碼數(shù)量,增加流水線中的迭代指令。8)采用指令亂序技術(shù)程序中,有些指令的執(zhí)行順序沒有嚴(yán)格的要求,可以作出一些位置上的調(diào)整,因此可以適當(dāng)?shù)恼{(diào)整這些指令的位置,穿插于其他的指令之中,從而減小指令的相關(guān)性,增加運(yùn)行時(shí)的并行性。尤其在循環(huán)里,當(dāng)循環(huán)體較小的時(shí)候,可以把多個(gè)循環(huán)的代碼寫在一個(gè)循環(huán)體里,合并成一個(gè)循環(huán),從而減小循環(huán)內(nèi)指令的相關(guān)性,增加指令運(yùn)行的并行性。但是要注意不要使循環(huán)過于復(fù)雜,以至不能進(jìn)行軟件流水線的優(yōu)化。由于C語言編譯出來的程序,不是有效率的匯編語言,而沒有辦法達(dá)到實(shí)時(shí)播放。所以為了要使程序執(zhí)行的速度能夠加快,必須要做化,使其能夠達(dá)到實(shí)時(shí)播放的速度。然而C6x的編譯器也提供了化的指令,如在編譯時(shí)加上-o3的參數(shù),它可以用軟件來分析我們的程序是否有可以改進(jìn)的地方,如此一來,在產(chǎn)生組語的匯編語言檔案之前,編譯器會(huì)對我們寫的C語言程序不斷的進(jìn)行編譯,也會(huì)對程序中的循環(huán)部份重新編排,產(chǎn)生另一較有效率的循環(huán),以有效率的方式重新編排程序,來加快程序速度方法一把浮點(diǎn)運(yùn)算改成定點(diǎn)運(yùn)算因?yàn)镃6xDSP板并不支持浮點(diǎn)運(yùn)算,但我們的原始程序代碼是浮點(diǎn)運(yùn)算的格式,所以必須改成定點(diǎn)運(yùn)算,而其修改后的執(zhí)行速度也會(huì)加快很多。我們采用Q-format規(guī)格來表示浮點(diǎn)運(yùn)算。以下將介紹其相關(guān)原理。定點(diǎn)DSP使用固定的小數(shù)點(diǎn)來表示小數(shù)部份的數(shù)字,這也造成了使用上的限制,而為了要分類不同范圍的小數(shù)點(diǎn),我們必須使用Q-format的格式。不同的Q-format表示不同的小數(shù)點(diǎn)位置,也就是整數(shù)的范圍。表2呈現(xiàn)Q15數(shù)字的格式,要注意在小數(shù)點(diǎn)后的每一位,表示下一位為前一位的二分之一,而MSB(most-significant-bit)則被指定成有號(hào)數(shù)(Signbit)。由表2可以知道,當(dāng)有號(hào)數(shù)被設(shè)成0而其余位設(shè)成1時(shí),可得到的正數(shù)(7FFFH);而當(dāng)有號(hào)數(shù)被設(shè)成1而其余位設(shè)成0時(shí),可得到的負(fù)數(shù)(8000H)。所以Q15格式的范圍從-1到0.9999694(@1),因此我們可以藉由把小數(shù)點(diǎn)向右移位,來增加整數(shù)部份的范圍,如表3所示,Q14格式的范圍增為-2.0到1.9999694(@2),然而范圍的增加卻犧牲了度。方法二建立表格(table)原來程序的設(shè)計(jì)是除了要讀AAC的檔案外,在譯碼時(shí),還要再另外讀取一些C語言程序代碼的內(nèi)容再做計(jì)算,如讀取一些數(shù)值做sin、cos、exp的運(yùn)算,但是為了加快程序的執(zhí)行速度,故將這這些運(yùn)算的結(jié)果建成表格,內(nèi)建在程序中,可以不必再做額外的計(jì)算動(dòng)做,以加速程序。方法三減短程序的長度1.去除Debug的功能原本程序在Debug的階段時(shí),就加了許多用來偵測錯(cuò)誤的部份,程序Debug完后,已經(jīng)沒有錯(cuò)誤發(fā)生,所以就可以把這些部份給去除,以減少程序的長度,也可以減少程序執(zhí)行時(shí)的時(shí)脈數(shù),加快程序的速度。2.去除計(jì)算時(shí)脈(clock)功能原本程序可以計(jì)算執(zhí)行程序所需的時(shí)脈數(shù),我們也可以把這些部份給去除,如果有需要計(jì)算時(shí)脈時(shí),我們可以用C6x的工具軟件來作,功能更強(qiáng)大。方法四減少I/O過程原本在做譯碼的動(dòng)作時(shí),是先讀取AAC檔案的一部份做譯碼,譯碼完成后再讀取下一部份,再做譯碼。但是由于C6x的板子跟PC做檔案讀取時(shí)相當(dāng)?shù)木徛?,讀取的動(dòng)作占了大部份的時(shí)間,所以就將程序改成先將AAC檔案全部讀到C6x的內(nèi)存中,再做譯碼?;蚴菍AC建成表格(約1MB),以避免DSP板上的內(nèi)存不足。方法五減少子程序的呼叫在呼叫子程序時(shí),必須先將緩存器的內(nèi)容放到堆棧(stack)中,而從子程序返回時(shí),也要將這些緩存器原本的內(nèi)容從堆棧中取出來。但是有些子程序的長度很短,而且被呼叫的次數(shù)又很多,往往幾個(gè)時(shí)脈就可以完成卻浪費(fèi)時(shí)間在存取堆棧的內(nèi)容上,所以干脆將這些很短的子程序直接寫在主程序當(dāng)中,以減少時(shí)脈數(shù)。方法六寫匯編語言雖然由C語言所編譯出來的匯編語言可以正確無誤的執(zhí)行,但是這個(gè)匯編語言卻不是有效率的寫法,所以為了增加程序的效率,于是在某些地方,例如一些被呼叫很多次且程序代碼不長的函式(function),必須改以自己動(dòng)手寫匯編語言來取代。方法七利用平行處理的觀念C6x是一顆功能強(qiáng)大的處理器,它CPU的內(nèi)部提供了八個(gè)可以執(zhí)行不同指令的單元,也就是說多可以同時(shí)處理八個(gè)指令。所以如果我們可以用它來作平行處理,我們就可以大大的縮短程序執(zhí)行的時(shí)間,有效率的來利用它來作解碼的動(dòng)作。還要知道:第三級(jí)優(yōu)化(-O3),效率不高(經(jīng)驗(yàn)),還有一些諸如用一條讀32位的指令讀兩個(gè)相鄰的16位數(shù)據(jù)等,具體情況可以看看C優(yōu)化手冊。但這些效率都不高(雖然ti的宣傳說能達(dá)到80%,我自己做的時(shí)候發(fā)現(xiàn)沒有這個(gè)效率!65%還差不多),如果要提高效率只能用匯編來做了。還有要看看你的c程序是怎么編的,如果里面有很多中斷的話,6000可以說沒什么優(yōu)勢。還有,profiler的數(shù)據(jù)也是不準(zhǔn)確的,比實(shí)際的要大,大多少不好說。還有dsp在初始化的時(shí)候特別慢,這些時(shí)間就不要和pc機(jī)相比了,如果要比就比的部分。關(guān)于profile:C6x的Debug工具提供了一個(gè)profile界面。在圖9中,包括了幾個(gè)重要的窗口,左上角的窗口是顯示出我們寫的C語言,可以讓我們知道現(xiàn)在做到了哪一步。右上角的窗口顯示的是C6x所編譯出來的匯編語言,同樣的我們也可以知道現(xiàn)在做到了哪一步。左下角的窗口是命令列,是讓我們下指令以及顯示訊息的窗口。而中間的profile窗口就是在profile模式下重要的窗口,它顯示出的項(xiàng)目如下表:表5:profile的各項(xiàng)參數(shù)[8]字段意義Count被呼叫的次數(shù)Inclusive包含子程序的總執(zhí)行clock數(shù)Incl-Max包含子程序的執(zhí)行clock數(shù)Exclusive不包含子程序的總執(zhí)行clock數(shù)Excl-Max不包含子程序的執(zhí)行clock數(shù)利用這個(gè)profile模式我們可以用來分析程序中每個(gè)函數(shù)被呼叫的次數(shù)、執(zhí)行的時(shí)脈數(shù)等等。用這個(gè)分析的結(jié)果,我們就可以知道哪個(gè)函數(shù)所花費(fèi)的時(shí)脈多,是可以再改進(jìn)的,而針對它來作化。匯編代碼級(jí)的優(yōu)化在經(jīng)過C代碼的優(yōu)化之后,還不能滿足性能上的要求,則可以通過profileclock工具找出效率很低的部分,使用線性匯編重新改寫。再通過匯編優(yōu)化器編譯,匯編優(yōu)化器從輸入的線性匯編代碼中,完成以下功能:●尋找可以平行執(zhí)行的CPU指令?!裨谲浖魉€期間,處理流水線標(biāo)號(hào)。●分配寄存器的用法?!穹峙涔δ軉卧?。TI提供的匯編優(yōu)化器可以得到很高的效率,一般可以滿足性能上的要求。優(yōu)化中的問題、在優(yōu)化過程中,總是要對程序進(jìn)行一定的改動(dòng),這樣經(jīng)常會(huì)出現(xiàn)一些問題。1)優(yōu)化結(jié)果的驗(yàn)證、優(yōu)化過的程序往往不知道是否運(yùn)行正確,這就需要加以驗(yàn)證。一般采用的辦法就是通過測試序列來驗(yàn)證。測試序列指的是對于不同的算法所取的一組特殊的數(shù)據(jù),這些數(shù)據(jù)可以準(zhǔn)確的反映算法的特性。測試序列中每組數(shù)據(jù)包括輸入數(shù)據(jù)和輸出數(shù)據(jù),通過對輸入數(shù)據(jù)的運(yùn)算,把結(jié)果與輸出數(shù)據(jù)進(jìn)行比較,判斷程序的正確性。一些常見的算法,一般都提供了測試序列。還有一些,沒有測試序列。這時(shí)就需要根據(jù)算法的特點(diǎn),自己構(gòu)造測試序列,進(jìn)行驗(yàn)證。構(gòu)造的時(shí)候,注意序列有幾組,數(shù)據(jù)有一定的長度,這樣驗(yàn)證的更準(zhǔn)確。2)內(nèi)存泄漏的問題、C64X系列DSP的內(nèi)部存儲(chǔ)空間有1MB,其中程序和數(shù)據(jù)還有CPU的二級(jí)緩存將共享這片空間,因此當(dāng)程序的運(yùn)行不正常時(shí),很有可能就是內(nèi)存泄漏造成的。因此,在程序設(shè)計(jì)中,應(yīng)盡量不用指針,同時(shí)注意進(jìn)行邊界檢測。程序設(shè)計(jì)的一些方法程序設(shè)計(jì)時(shí),一切以滿足實(shí)際的要求為目標(biāo)。在實(shí)際的設(shè)計(jì)中,除了優(yōu)化能夠提高性能以外,還可以采取其他的辦法,利用DSP的特性,提高程序的運(yùn)行性能,滿足實(shí)際的設(shè)計(jì)要求。1)把程序和經(jīng)常要用的數(shù)據(jù)放入片內(nèi)RAM片內(nèi)RAM與CPU工作在同一時(shí)鐘頻率,比片外RAM性能高得多。因此把程序放在片內(nèi)可以大大提高運(yùn)行的速度。同時(shí)對于一些經(jīng)常要用到的數(shù)據(jù),放入片內(nèi)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論