宋 娜,牛麗君,張 剛
(太原理工大學(xué)信息工程學(xué)院,山西太原 030024)
AVS熵解碼在OMAP3530上的實現(xiàn)及優(yōu)化
宋 娜,牛麗君,張 剛
(太原理工大學(xué)信息工程學(xué)院,山西太原 030024)
結(jié)合DSP硬件結(jié)構(gòu),首先對指數(shù)哥倫布碼算法的實現(xiàn)進(jìn)行結(jié)構(gòu)上的調(diào)整,其次對熵解碼部分的手工匯編實現(xiàn)高效的流水編排,最后結(jié)合熵解碼數(shù)據(jù)的存儲訪問對cache進(jìn)行優(yōu)化。仿真結(jié)果與傳統(tǒng)的C語言相比,程序運(yùn)行周期降低了約21.49%,碼率也顯著提高。
AVS;熵解碼;OMAP3530;優(yōu)化
AVS標(biāo)準(zhǔn)(Audio Video Coding Standard)是我國擁有自主知識產(chǎn)權(quán)的標(biāo)準(zhǔn),具有計算復(fù)雜程度低、專利費(fèi)用低、應(yīng)用前景廣闊等特點(diǎn)。OMAP3530是由TI公司推出的一款基于DSP TMS320C64X內(nèi)核的視頻處理器平臺,由于功耗低、高性能、高并行等優(yōu)點(diǎn),已經(jīng)成為實現(xiàn)智能手機(jī)首選的理想平臺,為其增添實時圖像編解碼功能具有明顯的應(yīng)用價值。其中DSP內(nèi)核有8個獨(dú)立的功能單元,每個時鐘周期內(nèi)最多可并行處理8條32位指令[1]。體系結(jié)構(gòu)上采用了超長指令結(jié)構(gòu),具有雙16 bit擴(kuò)充功能,可以在一個周期內(nèi)完成雙16 bit的加、乘、比較或移位等操作。本文結(jié)合AVS熵解碼算法的特點(diǎn),首先調(diào)整了k階指數(shù)哥倫布碼算法的結(jié)構(gòu),然后通過比較、跳轉(zhuǎn)指令實現(xiàn)了ce(v)語法元素解析的碼表切換,進(jìn)而采用流水技術(shù)優(yōu)化手工匯編,最后對cache進(jìn)行優(yōu)化,解碼速度顯著提高[2]。
AVS熵解碼包括對語法元素的解析和殘差數(shù)據(jù)的解碼。解碼過程中,兩者均以指數(shù)哥倫布碼的形式映射成二進(jìn)制比特流。AVS標(biāo)準(zhǔn)中采用ce(v)映射方式描述殘差數(shù)據(jù),采用0到3階指數(shù)哥倫布碼進(jìn)行解析,再通過查表得到run和level值。最后通過level值比較判斷,更新碼表解析下一個殘差系數(shù)。
指數(shù)哥倫布碼比特流由前綴、后綴及分隔符“1”三部分組成。前綴是n個連續(xù)的0,后綴為n+k(其中k為指數(shù)哥倫布碼的階數(shù))個比特,分隔符“1”介于前綴與后綴之間[3]。解碼時,首先從比特流的當(dāng)前位置開始查找以0開頭的比特位,直到找到第一個非0位置,并把0的個數(shù)記為n,根據(jù)下式計算出codenum值。
其中,read_bits(n+k)返回(n+k)比特碼流對應(yīng)的實際值。
如果trans_coeff<59,則trans_coeff=codenum;否則,解析下一個ce(v)語法元素,得到一個新的codenum。在AVS標(biāo)準(zhǔn)中熵解碼部分規(guī)定了19個碼表,其中亮度塊部分幀內(nèi)幀間各7個,色度塊部分5個,不同的碼表中ce(v)語法元素解析采用不同階數(shù)(0、1、2、3階)的指數(shù)哥倫布碼[4]。k規(guī)定如下:
1)trans_coeff<59時:
(1)以abslevel為索引按照以下方法查找得到碼表的tabnum:
(2)以tabnum為索引查找最終得到k值:
2)trans_coeff≥59時:
需要解析下一個ce(v)語法元素,此時需要根據(jù)不同的k值來解析得到一個新的codenum(<59)和escape_level_diff,其中escape_level_diff與k值有關(guān)
最終結(jié)合1)查找碼表。
解碼過程中以k階指數(shù)哥倫布碼返回值codenum作為索引查找碼表,最終生成run和level數(shù)組。解碼流程如圖1所示。
圖1 解碼流程圖
如果trans_coeff<59,則以該值作為索引在當(dāng)前碼表中查找run、level值;如果trans_coeff≥59,解析下一個ce(v)語法元素,得到新的codenum值和escape_level_diff值,由此可以根據(jù)以下式子計算出run、level值
其中,refabslevel值由run值確定,如果run>Maxrun,refabslevel=1;否則,以run為索引查找當(dāng)前碼表得到;escape_level_diff由ce(v)語法元素解析得到。
最后,保存run、level值,更新當(dāng)前碼表及指數(shù)哥倫布碼階數(shù),解析下一個殘差系數(shù),直到trans_coeff=EOB跳出循環(huán),最終返回生成的run、level數(shù)組。
式(1)是實現(xiàn)AVS指數(shù)哥倫布碼的算法。由于指數(shù)哥倫布碼的碼長由碼字內(nèi)容決定,而在AVS碼流中一次讀取碼流位數(shù)不超過32 bit,因此在讀取碼字時需要逐位讀出,會導(dǎo)致過多的函數(shù)調(diào)用,容易打斷處理器的流水操作,不利于編譯器對程序的優(yōu)化。本文結(jié)合指數(shù)哥倫布碼的結(jié)構(gòu)特點(diǎn),并充分利用DSP資源,提出了以下實現(xiàn)方案:
由式(1)可知:2n+k即為分隔符“1”所在比特位置的實際值,因此可以將式(1)變形為
其中,read_bits(n+k+1)返回n+k+1比特碼流的實際值,稱其為哥倫布碼字值。即最終的碼字值codenum為哥倫布碼字值與2k之差。由式(6)可得指數(shù)哥倫布碼實現(xiàn)方法:
1)確定階數(shù)k和需要解碼的二進(jìn)制碼流;
2)求出分隔符“1”與后綴部分比特流的實際值,即哥倫布碼字值,然后計算出2k;
3)將2)中兩個值作差,求得碼字值codenum。
結(jié)合DSP的硬件結(jié)構(gòu),本文的算法可一次性讀取多個比特碼流,拼接并返回待處理的32位碼,放入緩存區(qū)。然后利用式(5)進(jìn)行計算。與傳統(tǒng)AVS算法相比,減小了算法復(fù)雜程度,指令占用的CPU周期也大幅度減少,且便于調(diào)試。
在OMAP3530上實現(xiàn)AVS熵解碼采用的是TI公司提供的用C/C++和匯編語言開發(fā)的CCS軟件平臺,其中算法的實現(xiàn)部分主要是評估測試代碼,進(jìn)而優(yōu)化得到實時解碼的要求[5]。結(jié)合AVS熵解碼的原理與TMS320C64x+硬件結(jié)構(gòu)特點(diǎn),算法實現(xiàn)模塊主要從手工匯編和cache性能入手。首先采用手工匯編優(yōu)化,最后結(jié)合cache性能進(jìn)行優(yōu)化,提高命中率。
2.2.1 手工匯編優(yōu)化
手工匯編代碼的實現(xiàn)主要是利用軟件流水技術(shù)對指令進(jìn)行調(diào)度安排,使其能夠在不同部件內(nèi)交迭處理。結(jié)合C64x+DSP的結(jié)構(gòu),本文主要做了以下優(yōu)化:
1)減小寄存器相關(guān)性
只有不相關(guān)的指令才可以并行執(zhí)行,即在同一個指令周期內(nèi)寄存器調(diào)用不能過于頻繁。手工匯編中寄存器不是隨機(jī)分配的,而是在程序執(zhí)行前人為地將寄存器分配到各個變量中,因此減小寄存器相關(guān)性可以提高手工匯編的并行效率,降低程序執(zhí)行周期。
2)減少多周期指令
在C64x+DSP指令集中,乘法指令延遲為1個周期,讀取與轉(zhuǎn)移指令分別為4、5個延遲周期。本文中用左移指令SHL代替乘法指令,成對使用傳送指令MVKL、MVKH代替讀取指令,將碼表中的碼字值用傳送指令賦值給已分配好的寄存器。這樣可以大大減少所占用的周期,而且方便了寄存器間各變量的調(diào)用。
3)并行指令
CPU運(yùn)行時,在一個指令周期內(nèi)可以獨(dú)立運(yùn)行8條指令。在根據(jù)codenum作為索引查找run、level值過程中,由于二者的值無任何關(guān)聯(lián)性,可以分別分配到A組、B組寄存器中,由此在同一個周期中便可以采用不同的功能單元并行執(zhí)行含有run、level變量的指令。
4)使用打包、解包指令
查找出run、level值后,分別將其保存到2個不同的寄存器數(shù)組中,增加了寄存器存儲時間的消耗。可以先將二者打包后放在一個32位的寄存器中,逆掃描模塊再進(jìn)行解包處理,節(jié)省了寄存器存儲所用的時間,而后續(xù)讀取所需時間基本沒變。
5)使用具有函數(shù)功能的指令
在C64x+DSP指令集中,使用匯編指令LMBD就可以很容易獲得當(dāng)前的寄存器在第一個非0系數(shù)前含有0的個數(shù),可以迅速查找出前綴0的個數(shù),快速確定n值,簡化了程序,提高了執(zhí)行效率。
6)填充NOP延遲間隙
使用多周期指令會出現(xiàn)延遲間隙,在數(shù)值上等于指令原操作數(shù)讀取到執(zhí)行的結(jié)果可以被訪問所需的周期數(shù)。本文涉及到碼表的選擇與切換,有大量的條件轉(zhuǎn)移指令含有5個周期的指令延遲間隙,系統(tǒng)自動安排NOP指令,造成浪費(fèi)。所以使用轉(zhuǎn)移指令后,盡量填充有用指令確保這5個周期的間隙不被浪費(fèi)。
2.2.2 cache 優(yōu)化
cache是介于主內(nèi)存與CPU之間的高速緩存器,優(yōu)化cache可以發(fā)揮CPU的高速度,提高內(nèi)存訪問與外部存儲器訪問的速度。本文采用OMAP3530 EVM主板存儲,內(nèi)部存儲包括分別用于數(shù)據(jù)處理和程序處理的一級數(shù)據(jù)存儲器L1D、一級程序存儲器L1P,大小分別為80 kbyte、32 kbyte,且二者都可以配置成普通存儲器SRAM和高速緩存 cache或者二者的結(jié)合;二級緩存 L2,大小為96 kbyte,作為程序和數(shù)據(jù)的共享空間[6]。工作原理是:CPU處理數(shù)據(jù)是從cache里查找數(shù)據(jù),若cache命中,直接把數(shù)據(jù)從cache中取出,否則為cache miss,從下一級存儲器中取出需要的數(shù)據(jù),CPU處于等待狀態(tài)時幾乎不進(jìn)行任何操作,為cache缺失停頓時間,等待CPU恢復(fù)工作后將后續(xù)相關(guān)數(shù)據(jù)裝入cache中。本文主要采用的方法是合理分配數(shù)據(jù)和程序的內(nèi)存,調(diào)整代碼的存放,改變CPU的訪問順序,從而提高cache命中率。
1)數(shù)據(jù)cache優(yōu)化主要是從調(diào)整算法結(jié)構(gòu)的數(shù)據(jù)存儲入手,避免數(shù)據(jù)的重復(fù)使用。優(yōu)化時,將亮度和色度數(shù)據(jù)分開解碼,且將兩者的原始數(shù)據(jù)分別單獨(dú)傳輸,待數(shù)據(jù)傳出并存放在DDR中,最后集中處理。此外,對cache字節(jié)重新定義,確保解碼階段數(shù)據(jù)需求保持在32 kbyte內(nèi)。最后利用TMS320C64X提供的編譯指令#pragma DATA_SECTION,對解碼數(shù)據(jù)進(jìn)行合理分配存儲。
2)程序cache優(yōu)化與數(shù)據(jù)優(yōu)化是一樣的,亮度和色度解碼的數(shù)據(jù)分開獨(dú)立進(jìn)行,將熵解碼循環(huán)體所在宏塊層改為幀層,幀內(nèi)、幀間解碼程序分開,盡量把程序分段,使每段能夠控制在32 kbyte內(nèi)。最終,每個循環(huán)體的指令數(shù)不超過cache容量,所以只有剛進(jìn)入循環(huán)體初次執(zhí)行時才會使主存裝載指令到cache中,從而大幅度減少cache缺失和cache指令執(zhí)行的次數(shù),在優(yōu)化的基礎(chǔ)上也使開支降到最低。
在CCS3.3中用Profile Setup工具設(shè)置cache選項,然后用Cache Tune顯示cache效率問題出現(xiàn)的區(qū)間,使之可視化,得到圖2、圖3仿真圖。
用Profile性能分析工具可測出:一級緩存中數(shù)據(jù)cache命中率為97.28%,程序cache命中率為99.41%。
在OMAP3530上正確實現(xiàn)熵解碼的條件下,本文在XD560 Emulator上進(jìn)行了仿真,并利用CCS3.3提供的Profile性能分析工具對選用的1~15 Mbit/s不同碼率的標(biāo)清尺寸AVS碼流進(jìn)行測試。解碼測試條件有:幀率為25 Hz,解碼50幀??紤]到圖像大小不影響指數(shù)哥倫布解碼的效率,本文選擇CIF大小的系列進(jìn)行測試,其中包括
圖2 L1Dcache命中仿真圖(截圖)
圖3 L1Pcache命中仿真圖(截圖)
ice,soccer,football,highway,news,flower六個 YUV 系列。經(jīng)過比較計算得出表1結(jié)果。
表1 不同碼率序列測試結(jié)果
由表1可知,用匯編實現(xiàn)的熵解碼程序周期較C語言平均降低約21.49%,碼率也顯著提高,進(jìn)而提高了熵解碼的解碼效率。
本文在研究指數(shù)哥倫布碼數(shù)學(xué)特性的基礎(chǔ)上提出了一種新的指數(shù)哥倫布解碼算法,又高效利用手工匯編的優(yōu)化方法及提高cache命中率,最終實現(xiàn)了對AVS熵解碼的優(yōu)化。在保證正確解碼的前提下進(jìn)行解碼效率的測試,結(jié)果表明,本文針對AVS熵解碼的優(yōu)化方法不僅縮短了解碼周期,且顯著提高了解碼速度。
:
[1]宋建斌,詹舒波,馬麗.基于通用DSP的視頻解碼器的優(yōu)化實現(xiàn)[J].電信科學(xué),2011,27(8):84-88.
[2]雷濤,周進(jìn),吳欽章.DSP實時圖像處理軟件優(yōu)化方法研究[J].計算機(jī)工程,2012,38(14):177-180.
[3]劉小成,曹默.H.264解碼器設(shè)計與算法優(yōu)化[J].微計算機(jī)信息,2011(5):90-92.
[4]李輯,陳穎琪,王慈.基于PC的AVS視頻解碼器軟件優(yōu)化[J].電視技術(shù),2010,34(11):40-42.
[5]魏曉君.AVS解碼器環(huán)路濾波的優(yōu)化及實現(xiàn)[J].電視技術(shù),2013,37(5):23-25.
[6]李方慧,王飛,何佩琨.TMS320C600系列DSPs原理與應(yīng)用[M].2版.北京:電子工業(yè)出版,2003.
張 剛(1953— ),博士生導(dǎo)師,主研音視頻編解碼和計算機(jī)通信等。
Implementation and Optimization of AVS Entropy Decoding on OMAP3530
SONG Na,NIU Lijun,ZHANG Gang
(College of Information Engineering,Taiyuan University of Technology,Taiyuan 030024,China)
In this paper,combining DSP hardware architecture,the implementation of Exp-Golomb code algorithm is firstly adjusted in structure.Then highly efficient pipeline arrangement is achieved on the hand assembly of entropy decoding part.Finally the cache is optimized combining the storage and access of entropy decoding data.The results demonstrate that the program operation cycle reduces by about 21.49%compared with traditional C code,and the code rate also improves significantly.
AVS;entropy decoding;OMAP3530;optimization
TN919.8
A
【本文獻(xiàn)信息】宋娜,牛麗君,張剛.AVS熵解碼在OMAP3530上的實現(xiàn)及優(yōu)化[J].電視技術(shù),2014,38(3).
國家自然科學(xué)基金項目(60772101)
宋 娜(1989— ),女,碩士生,主研視頻解碼;
牛麗君(1987— ),女,碩士生,主研視頻圖像編解碼;
責(zé)任編輯:魏雨博
2013-05-30