新聞中心

EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > 基于ADSP-BF561處理器的視頻編碼器平臺(tái)

基于ADSP-BF561處理器的視頻編碼器平臺(tái)

作者: 時(shí)間:2011-02-15 來(lái)源:網(wǎng)絡(luò) 收藏

4 DSP上的代碼優(yōu)化

在VisualDSP開(kāi)發(fā)環(huán)境下對(duì)代碼進(jìn)行優(yōu)化的主要方法有C語(yǔ)言級(jí)優(yōu)化和匯編級(jí)優(yōu)化。

4.1 C語(yǔ)言級(jí)優(yōu)化

通過(guò)VC6的profile分析工具發(fā)現(xiàn):移植與優(yōu)化的重點(diǎn)應(yīng)在運(yùn)動(dòng)估計(jì)部分。筆者通過(guò)比較各種算法后選擇了菱形(DS)搜索法。DS算法可采用兩種搜索模板,分別是有9個(gè)檢索點(diǎn)的大模板LD-SP(LargeDiamondSearchPattern)和有5個(gè)檢索點(diǎn)的小模板SDSP(SmallDiamondSearchPattern)。其菱形搜索示意圖如圖3所示。搜索時(shí),先用大模板計(jì)算,當(dāng)最小塊誤差SAD點(diǎn)出現(xiàn)在中心點(diǎn)處時(shí),再將大模板LDSP換為SDSP進(jìn)行匹配運(yùn)算,這時(shí),5個(gè)點(diǎn)中具有最小SAD者若為中心點(diǎn),則該點(diǎn)即為最優(yōu)匹配點(diǎn),然后結(jié)束搜索,否則將繼續(xù)以此點(diǎn)為搜索中心進(jìn)行SPSS搜索。

經(jīng)JM實(shí)驗(yàn)證實(shí),采用此種方法,可以節(jié)約大約10%的運(yùn)行時(shí)間,且代碼量無(wú)太大增長(zhǎng)。

針對(duì)DSP的特點(diǎn)和相關(guān)的硬件指令,設(shè)計(jì)時(shí)可對(duì)代碼進(jìn)行如下優(yōu)化:

◇對(duì)程序結(jié)構(gòu)進(jìn)行調(diào)整。對(duì)不適合DSP執(zhí)行的語(yǔ)句進(jìn)行改寫(xiě),以提高代碼的并行性。

◇宏的使用。也就是將有些較短,執(zhí)行單一、調(diào)用次數(shù)多的函數(shù)改為宏。

◇循環(huán)優(yōu)化是將C語(yǔ)言中的for循環(huán)打開(kāi),排流水線,提高并行性。

◇計(jì)算表格化是將運(yùn)行時(shí)計(jì)算的參數(shù)做成便于查找的表格常數(shù)數(shù)值,從而將運(yùn)行計(jì)算轉(zhuǎn)化為編譯運(yùn)算。如在量化和反量化程序中進(jìn)行移位位數(shù)的處理時(shí),可先計(jì)算出所有可能的值,而后來(lái)的運(yùn)算就可以通過(guò)查表得到數(shù)值。

◇浮點(diǎn)數(shù)定點(diǎn)化。因?yàn)锽lackfin561并不支持浮點(diǎn)運(yùn)算,但原始程序代碼卻是浮點(diǎn)運(yùn)算的格式,所以必須改成定點(diǎn)運(yùn)算,而其修改后的執(zhí)行速度也會(huì)加快很多。

◇盡量用邏輯運(yùn)算代替乘除運(yùn)算。由于乘除運(yùn)算指令的執(zhí)行時(shí)間要遠(yuǎn)遠(yuǎn)大于邏輯移位指令,尤其是除法指令,故應(yīng)盡量用邏輯移位運(yùn)算來(lái)代替乘除運(yùn)算,以加快指令的運(yùn)行速度。

◇盡量少進(jìn)行函數(shù)調(diào)用。對(duì)一些小的函數(shù),最好是用適當(dāng)?shù)膬?nèi)聯(lián)函數(shù)將其直接寫(xiě)入主函數(shù)中進(jìn)行替代,而對(duì)于一些調(diào)用不多的函數(shù),也可以直接寫(xiě)入主函數(shù)內(nèi),這樣可減少不必要的操作以提高速度。

◇減少判斷轉(zhuǎn)換。

◇盡量靜態(tài)分配內(nèi)存。

◇調(diào)用系統(tǒng)提供的豐富的內(nèi)聯(lián)函數(shù)。

此外,為了充分發(fā)揮DSP的運(yùn)算能力,還必須從它的硬件結(jié)構(gòu)出發(fā),最大限度地利用它的8個(gè)功能單元,使用軟件流水線盡量讓程序無(wú)沖突地并行執(zhí)行。也可將最耗時(shí)的函數(shù)抽取出來(lái),用線性匯編改寫(xiě),從而最大限度的利用DSP的并行性。

4.2 匯編級(jí)優(yōu)化

匯編級(jí)優(yōu)化主要指如下幾點(diǎn)操作:

(1)使用寄存器資源

Blackfin561提供了8個(gè)32位數(shù)據(jù)寄存器以及一系列的地址寄存器。使用寄存器代替局部變量時(shí),若局部變量用來(lái)保存中間結(jié)果,那么用寄存器代替局部變量可省掉很多訪問(wèn)內(nèi)存的時(shí)間。

(2)使用專(zhuān)用指令

Blackfin561提供有求最大值、最小值、絕對(duì)值、CUP及大量專(zhuān)用指令,應(yīng)可能用多位的指令來(lái)訪問(wèn)少位的數(shù)據(jù)。通過(guò)使用這些指令能大大提高代碼的執(zhí)行速度。如用int型(32位)訪問(wèn)2個(gè)short(16位)型數(shù)據(jù)時(shí),可將其分別放在32位寄存器的高16位和低16位字段。這樣,數(shù)據(jù)讀取效率可以提高1倍,從而減少內(nèi)存訪問(wèn)次數(shù)。

(3)使用并行指令和向量指令

中每條通用指令都可以和一條或兩條存儲(chǔ)器訪問(wèn)指令并列執(zhí)行,這樣有利于的流水線滿(mǎn)負(fù)荷運(yùn)行,更充分發(fā)揮的數(shù)據(jù)處理能力。

(4)合理存放反復(fù)調(diào)用的程序段

把被反復(fù)調(diào)用的程序段(如DCT變換和IDCT變換)放在片內(nèi)程序存儲(chǔ)區(qū)中,把頻繁用到的數(shù)據(jù)段(如編碼表)放在片內(nèi)數(shù)據(jù)存儲(chǔ)器中,而把不常用到的程序和數(shù)據(jù)段放在片外存儲(chǔ)器中,以避免對(duì)程序或數(shù)據(jù)進(jìn)行不必要的反復(fù)搬移。

(5)合理使用內(nèi)外存儲(chǔ)器

BF561片內(nèi)只有256KB的存儲(chǔ)空間,因此當(dāng)前幀、參考幀和當(dāng)前幀的重建幀都必須放至片外存儲(chǔ)器,壓縮碼流若被主機(jī)讀取,也可放至片外。其它數(shù)據(jù)如程序代碼、全局變量、VLC碼表、各編碼模塊產(chǎn)生的中間數(shù)據(jù)等均可放至片內(nèi)。

(6)DMA的使用

由于CPU訪問(wèn)片外存儲(chǔ)器的速度通常要比訪問(wèn)片內(nèi)慢幾十倍,片外數(shù)據(jù)的傳輸通常成為程序運(yùn)行時(shí)的瓶頸,這樣,即使代碼效率很高,流水線也會(huì)因?yàn)榈却龜?shù)據(jù)而被嚴(yán)重阻塞。解決這一問(wèn)題的有效方法是用DMA傳送數(shù)據(jù)。程序是逐個(gè)宏塊進(jìn)行編碼的,在編碼當(dāng)前宏塊的同時(shí),先由DMA將下一個(gè)宏塊的數(shù)據(jù)、用到的參考幀數(shù)據(jù)由片外傳送至片內(nèi),當(dāng)前宏塊做完運(yùn)動(dòng)補(bǔ)償后,DMA又將重建后的宏塊由片內(nèi)傳送至片外。這樣CPU只對(duì)片內(nèi)數(shù)據(jù)進(jìn)行操作,從而使流水線可以順利進(jìn)行,而壓縮碼流按逐個(gè)碼字有時(shí)間間隔地寫(xiě)入,可由CPU直接寫(xiě)至片外。

5 結(jié)束語(yǔ)

經(jīng)過(guò)用ADSP-BF561匯編語(yǔ)言改寫(xiě)的對(duì)應(yīng)函數(shù)的優(yōu)化程序經(jīng)調(diào)試運(yùn)行后,DCT,IDCT部分效率提高了大約15倍,去塊濾波部分效率提高了大約6~7倍。對(duì)于模塊中的其它部分函數(shù),也同樣取得了良好的優(yōu)化結(jié)果。說(shuō)明其優(yōu)化工作確實(shí)達(dá)到了良好的效果。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉