齊美彬, 陳俊峰
(合肥工業(yè)大學(xué)計算機(jī)與信息學(xué)院,安徽合肥 230009)
H.264實(shí)時視頻編碼系統(tǒng),輸入輸出的數(shù)據(jù)量大,對算法的實(shí)時性要求較高[1,2],DSP芯片被廣泛應(yīng)用于 H.264視頻編碼系統(tǒng)中[3]。繼以DM 642為代表的C64x系列DSP之后[4,5],TI公司推出了C64x+DSP內(nèi)核[6],并且在達(dá)芬奇系列和OMAP系列中廣泛使用。為了提高算法的實(shí)時性,可以從算法、指令、數(shù)據(jù)配置等方面對算法進(jìn)行優(yōu)化。文獻(xiàn)[7,8]采用了線性匯編、內(nèi)聯(lián)函數(shù)來提高編碼效率,但是未考慮數(shù)據(jù)分布在不同存儲器中對算法速度的影響;文獻(xiàn)[9]采用了EDMA且結(jié)合片內(nèi)資源有限的特點(diǎn),分批搬運(yùn)數(shù)據(jù),但未給出 QCIF、CIF、4CIF兼容的方案;文獻(xiàn)
[10]根據(jù)H.264算法特點(diǎn),將程序段拆分處理,提高了指令Cache命中率,該方法提高了L1P存儲器的使用效率,但是要新增加數(shù)據(jù)緩沖區(qū)。文獻(xiàn)[3-9]中,除文獻(xiàn)[7]外其它均采用C64x平臺,C64x+的優(yōu)化策略與其基本一致。
C64x+內(nèi)核因為采用了更為靈活的RAM和 Cache結(jié)構(gòu),因此對數(shù)據(jù)安排更為靈活,如何分配H.264編碼器中的源幀、重建幀、參考幀、內(nèi)插數(shù)據(jù)、預(yù)測數(shù)據(jù)等,對編碼速度有較大的影響。本文在文獻(xiàn)[8]工作的基礎(chǔ)上,圍繞RAM、Cache、緩存一致性3個方面進(jìn)行分析,指出了提高運(yùn)算速度的方法。
圖1所示為C64x+內(nèi)核存儲架構(gòu)示意圖[11],分為片上的L1(包括L1D和L1P)和L2以及片外(ex ternalmemory)的DDR2,L1、L2和DDR2速度依次降低,L1D、L1P和 L2又各自分為RAM和Cache。每一級Cache只對下級存儲器緩存,其中W rite Buffer的容量為4×128 bit。為了防止一些并發(fā)請求被堵塞,這些資源統(tǒng)一由Bandw idth M anagement(BWM)來管理,這些請求包括CPU、L1P、L1D、IDMA、EDMA等。
圖1 C64x+Cachememoy架構(gòu)
對存儲器中的數(shù)據(jù)訪問均需要E1、E2、E3、E4、E5這5步,其中E3環(huán)節(jié)耗費(fèi)的時間與存儲器位置有關(guān),數(shù)據(jù)在L1中需要1個周期,在L2中需要6~8周期,在DDR2中至少8個周期,因此數(shù)據(jù)所處位置應(yīng)按照L1、L2、DDR2的順序考慮。
L1D memory最多支持至 1 M可編址的RAM,其起始地址為1 M邊界對齊,長度為16 k的倍數(shù),L1D memory被分成區(qū)域0和區(qū)域1,其中區(qū)域0的大小可以是0,也可以是2的倍數(shù)且介于16~512 k中間。區(qū)域1起始于區(qū)域0末端,大小是16 k的倍數(shù)且介于16~512 k之間。若區(qū)域0非0,則區(qū)域1必須不大于區(qū)域0。L1D Cache是從部分或全部區(qū)域1轉(zhuǎn)換得到,轉(zhuǎn)換從最高地址開始到低地址。
L2 mem ory是為了連接較快的 L1 memory和較慢的externalmemory,其優(yōu)勢在于能夠提供較大于 L1的空間。L2 memory包括 port 0 (RAM/Cache)或port 1(RAM),前者支持將不多于256 k的空間轉(zhuǎn)換為Cache[12]。
C64x+內(nèi)核具有強(qiáng)大的 Cache控制模塊,Cache作為CPU(Core)和低速存儲器之間溝通的橋梁,有效彌補(bǔ)了CPU與存儲器之間的速度差異,基于代碼和數(shù)據(jù)的空間和時間相關(guān)性,以塊為單位由硬件控制器自動加載數(shù)據(jù)和代碼,同時維護(hù)緩存一致性。
圖2所示為CPU訪問存儲器內(nèi)容的操作流程,在這個流程中,CPU對存儲器的訪問總是從離CPU最近一級存儲器開始。如果命中,CPU可以直接得到數(shù)據(jù)/代碼,否則,代碼/數(shù)據(jù)會被加載到前幾級的Cache中。
圖2 CPU訪問儲存器內(nèi)容流程圖
L1D Cache屬于read-allocate、回寫、雙路組關(guān)聯(lián)結(jié)構(gòu),其原理如圖3所示(本文所指的緩存空間均為 32 k字節(jié))。L2 Cache屬于read-andw rite allocate,回寫,4路組關(guān)聯(lián)結(jié)構(gòu),本文重點(diǎn)分析L1D Cache。
雙路組關(guān)聯(lián)結(jié)構(gòu)Cache映射的規(guī)律是,凡16 k字節(jié)邊界對齊的地址均從其中一路第0行開始映射,每行64字節(jié),依此排列,因此是一行對應(yīng)多個地址的關(guān)系。對于32位的存儲地址,第6位代表一行中64字節(jié)的偏移,中間7位代表128行的偏移,高18位是 tag,tag是緩存的關(guān)鍵技術(shù),是地址的唯一標(biāo)志,此外還與Valid(是否有效)標(biāo)志、Dirty(該地址是否最近更新過)標(biāo)志、LRU(最近最少使用)標(biāo)志在一起共同組成Cache控制模塊的關(guān)鍵參數(shù)。這些參數(shù)的確定過程比較復(fù)雜,且在不同情況下使用不同的參數(shù)。本文只分析CPU讀緩存命中和寫緩存命中這2種最期望發(fā)生的情況,以及讀緩存缺失和寫緩存缺失這2種不期望發(fā)生的情況。
圖3 L1D Cache結(jié)構(gòu)
(1)讀緩存命中。CPU取指令得到數(shù)據(jù)地址后,對此地址的32位經(jīng)過拆分,若能找到匹配的某一路的某一行,且此行的V位有效,則為讀命中。
(2)寫緩存命中。CPU在得到將要寫出去的數(shù)據(jù)的地址后,對其拆分,若匹配成功,則為寫命中,再判斷若Dirty位為無效則直接寫入數(shù)據(jù);反之,先將對應(yīng)的數(shù)據(jù)回寫到下級存儲器中,再寫入數(shù)據(jù)(此操作是為了維護(hù)緩存一致性)。
(3)讀緩存缺失。與(1)類似,此時發(fā)現(xiàn)匹配不正確,則從下級存儲器中取得數(shù)據(jù),然后再根據(jù)地址和LRU將數(shù)據(jù)寫到緩存中,LRU為0表示0路是最近最少使用,則寫到way0,然后CPU再從緩存中取得數(shù)據(jù)送到寄存器。
(4)寫緩存缺失。與(2)類似,但此時發(fā)現(xiàn)匹配不正確,則直接將數(shù)據(jù)送入W rite Buffer。當(dāng)發(fā)生讀缺失或W rite Buffer已滿等情況時,立即先執(zhí)行將W rite Buffer的內(nèi)容清空并寫到下級存儲器的操作(此操作也是為了維護(hù)緩存一致性)。
綜上所述,讀和寫緩存缺失都會使效率降低。一般而言,理想情況是讀寫皆命中,最不利的情況是:讀緩存缺失重新往緩存寫入新數(shù)據(jù)時,將其中沒有使用的數(shù)據(jù)沖刷掉,導(dǎo)致新的缺失[13]。
在基于Cache的運(yùn)行機(jī)制下,如果所有的代碼和數(shù)據(jù)的存取都由CPU來完成,CPU始終能得到存儲器中最新的數(shù)據(jù),但當(dāng)有其它更改存儲器內(nèi)容的部件存在時(如不需要CPU干預(yù)的EDMA引擎),可能會出現(xiàn)由于Cache的存在而導(dǎo)致CPU或DM A不能得到最新數(shù)據(jù)的現(xiàn)象,也就是Cache一致性問題,這個問題多數(shù)情況會導(dǎo)致運(yùn)算結(jié)果的不正確。
在一個特定的時間范圍內(nèi),緩存和存儲器中內(nèi)容可能不一致,因為緩存的作用是將低速存儲器中的內(nèi)容自動搬運(yùn)到高速緩存中反復(fù)使用,當(dāng)其它數(shù)據(jù)發(fā)生讀缺失時,其空間才可能被占用,然后回寫?;貙懼埃彺嬷械膬?nèi)容和存儲器中臨時不一致是正常的。
有2種情況會影響對RAM訪問的效率:①存儲體內(nèi)部阻塞,同時讀或?qū)懙牡刂吩谕粋€存儲體內(nèi)會引起CPU阻塞,需要同時訪問的2個地址應(yīng)該位于不同的存儲體;②邊界沒有對齊,地址不對齊降低訪問效率,根據(jù)被Cache的級別不同,對齊的字節(jié)不小于上一級緩存的行寬的整數(shù)倍,即數(shù)據(jù)處于L2D RAM中為64字節(jié),在DDR2中則為128字節(jié)。
數(shù)據(jù)應(yīng)優(yōu)先放在L1 RAM中,若空間不足再根據(jù)算法需要把某些數(shù)據(jù)放在L2 RAM中。
(1)提高CPU讀緩存命中的方法。Cache控制器功能,即如果CPU訪問某一行某一個字節(jié)(地址)讀缺失,則會按照映射規(guī)律,將下級存儲器中對應(yīng)的所有64個字節(jié)(地址)都Cache到此行,因此每一行只有第1個字節(jié)是讀缺失,此行后續(xù)字節(jié)皆可讀命中。
若數(shù)組A和B同時參與運(yùn)算,數(shù)組A占用的長度小于16 k,要保證已經(jīng)Cache進(jìn)來的行不會被數(shù)組B占用,則數(shù)組B和A的長度之和不要超過16 k。若數(shù)據(jù)長度大于16 k,則應(yīng)盡量調(diào)整算法,使得數(shù)據(jù)分成若干個16 k以內(nèi)的邏輯塊,保證已經(jīng)Cache進(jìn)來的數(shù)據(jù)盡可能少地被替換掉。
(2)提高CPU寫緩存命中的方法。CPU寫緩存,即CPU需要將數(shù)據(jù)從寄存器寫到Cache,發(fā)生寫緩存命中的條件是:此地址已經(jīng)按照映射規(guī)則被Cache進(jìn)來了。由于L1D Cache是 readallocate的,有2種方法可以采用:①若此地址同時需要參與輸入運(yùn)算,即CPU需要先讀入地址,則采用(1)的方法;②若此地址不需要參與輸入運(yùn)算,即CPU僅需要向此地址寫數(shù)據(jù),則需要采用TI提供的touch函數(shù)[4]。
數(shù)據(jù)段除了硬件自動維護(hù)緩存一致性以外,有4種典型的需要人為維護(hù)的情形。
(1)其它m aster更新DDR2中的內(nèi)容后,在CPU讀取此內(nèi)容之前,需要將 L1D Cache、L2 Cache中此內(nèi)容無效。
(2)CPU更新數(shù)據(jù)到DDR2后,更新的數(shù)據(jù)可能只是被保存在了L1D Cache、L2 Cache中,在其它master讀取DDR2的被更新的內(nèi)容之前,需要將Cache回寫。
(3)在L2存儲器中開辟了緩沖區(qū)并且其它master對數(shù)據(jù)不斷進(jìn)行更新后,在CPU讀取此數(shù)據(jù)之前,需要將L1D Cache中的對應(yīng)數(shù)據(jù)進(jìn)行使無效操作。
(4)在L2存儲器中開辟了緩沖區(qū)并且CPU對數(shù)據(jù)進(jìn)行循環(huán)更新后,在其它m aster讀取此數(shù)據(jù)之前,需要將L1D Cache中的此內(nèi)容回寫。
第(3)、(4)種的情形通常在編碼中比較常見,即單幀數(shù)據(jù)不斷寫到DDR2上,但是需要EDM A分塊搬運(yùn)到L2存儲器固定的乒乓結(jié)構(gòu)中。
結(jié)合上述思想,本文采用H.264編碼器作為實(shí)驗,H.264數(shù)據(jù)分類見表1所列。
實(shí)驗平臺為SPECTRUM DIGITAL公司的TMS 320DM 6437EVM板,時鐘周期600 MH z,具有128M DDR2空間、32 k L1P Cache/RAM、80 k L1D Cache/RAM、128 k L2 Cache/RAM。采用下列劃分方法,即32 k L1PCache、48 k L1D RAM、32 k L1D Cache、64 k L2 RAM、64 k L2 Cache。
表1 H.264數(shù)據(jù)分類表
為了充分發(fā)揮C64x+內(nèi)核的性能,本文充分利用L1 RAM和L2 RAM并且盡可能地提高L1D緩存命中率的方案,因此需要對關(guān)鍵數(shù)據(jù)在L1和L2 RAM中如何分布進(jìn)行實(shí)驗。以下實(shí)驗都是以第1個P幀作為代表測試CIF序列,P幀采用16×16分塊。共6種數(shù)據(jù),通過表2~表4所列的結(jié)果來確定最優(yōu)組合。
表2所列是對參考幀、重建幀、原始幀3種數(shù)據(jù)在L1、L2的不同組合進(jìn)行實(shí)驗,其條件是將預(yù)測數(shù)據(jù)、殘差數(shù)據(jù)、內(nèi)插數(shù)據(jù)置于L1,按照64字節(jié)對齊;表2中未列出的3種組合會導(dǎo)致L1或L2空間不夠,故予以排除。
表2 實(shí)驗方案1
表3所列是對預(yù)測數(shù)據(jù)、殘差數(shù)據(jù)、內(nèi)插數(shù)據(jù)3種數(shù)據(jù)(數(shù)據(jù)均為64字節(jié)對齊)在L1、L2中的不同組合進(jìn)行實(shí)驗,是實(shí)驗方案1的延續(xù),即在表2中耗費(fèi)時間最少的組合基礎(chǔ)上完成。
表3 實(shí)驗方案2
表4所列在實(shí)驗方案1、實(shí)驗方案2所決定的最優(yōu)組合的基礎(chǔ)上,對6種數(shù)據(jù)在不同存儲器中邊界對齊進(jìn)行實(shí)驗。
表4 邊界對齊不同時所耗費(fèi)的時間
對于原始幀數(shù)據(jù),其長度小于16 k,將其放在L2 RAM中,可以使L1D Cache的緩存讀命中率很高。對于預(yù)測數(shù)據(jù)、殘差數(shù)據(jù)、內(nèi)插數(shù)據(jù)、重建幀數(shù)據(jù),放在L2中會存在L1D Cache寫缺失的問題,在L1RAM中會使CPU阻塞的可能性增加,實(shí)驗表明后者更有利于效率的提升。對于參考幀、數(shù)據(jù)長度大于16 k,放在L2中不利于提高L1D Cache緩存讀命中率。從中可以看出,最優(yōu)組合的結(jié)果與本文分析的一致。
表2中最差的一種組合同樣按照表3、表4的方法去實(shí)驗,最后可得到一種最差結(jié)果,2種結(jié)果對比見表5所列。
表5 最優(yōu)組合和最差組合耗費(fèi)時間比較
由表5可以看出,最差結(jié)果比最優(yōu)結(jié)果有不同程度的時間增加。另外,在最優(yōu)結(jié)果下foreman可以更為流暢的實(shí)現(xiàn)4路CIF,相當(dāng)于同等復(fù)雜度的一路D1,而后兩者由于較為復(fù)雜只能實(shí)現(xiàn)約2~3路CIF,這與本工程實(shí)際測試結(jié)果相吻合。
本文針對C64x+內(nèi)核的存儲器結(jié)構(gòu)進(jìn)行詳細(xì)分析,給出了提高性能的策略,并在本文所采用的片上資源分配方案下,針對H.264編碼器所涉及的數(shù)據(jù)特點(diǎn),提出了一種最優(yōu)分配方法并經(jīng)實(shí)驗驗證,對于其它領(lǐng)域應(yīng)用C64x+內(nèi)核進(jìn)行開發(fā)有一定的參考價值。
[1] Telecommunication Standardization Sector of International Telecommunication Union(ITU-T).H.264:advanced video coding for generic audiovisual services[EB/OL].[2010-04-01].h ttp://www.itu.int/rec/dologin-pub.asp lang=e&id =T-REC-H.264-200503-S!!PDF-E&type=items.
[2] 竇建華,王 英,李長凱,等.基于CPLD和DSP的線陣CCD數(shù)據(jù)采集系統(tǒng)設(shè)計[J].合肥工業(yè)大學(xué)學(xué)報:自然科學(xué)版,2010,33(5):690-693.
[3] 李方慧,王 飛,何佩琨.TMS320 C 6000系列DSPs原理與應(yīng)用[M].第2版.北京:電子工業(yè)出版社,2003:315-326.
[4] Texas Instrumen ts Incorporated.TMS320C6000 DSP cache user'sguide(sp ru656)[EB/OL].[2010-04-01].h ttp://focus.ti.com/lit/ug/spru656a/spru656a.pdf.
[5] Texas Instruments Inco rporated.TMS320 C64x DSP tw olevel in ternalm emory reference guide(sp ru610)[EB/OL]. [2010-04-01].http://focus.ti.com/lit/ug/spru610c/spru610c.pdf.
[6] Texas Instrumen ts Inco rporated.TMS320C 64x/C64x+DSP CPU and istru ction set reference guide(spru732)[EB/ OL].[2010-04-01].http://focus.ti.com/lit/ug/spru732h/ spru732h.pdf.
[7] M ohammadnia M R,Taheri H,Motamedi SA.Im plementation and optim ization of real-time H.264/AVC main p rofile encoder on DM 648 DSP[C]//Proceedings of 2009 In ternational Conference on Signal Acquisition and Processing. New York:IEEE Press,2009:48-52.
[8] 李小紅,蔣建國,齊美彬,等.基于DSP的H.264關(guān)鍵模塊技術(shù)的研究及實(shí)現(xiàn)[J].儀器儀表學(xué)報,2006,27(10): 1330-1333.
[9] Zhuo L,W ang Q,F(xiàn)eng D D,et al.Optim ization and im plementation of H.264 encoder on DSP platform[C]//Proceeding of IEEE In ternational Conference on Multim edia and Expo.New York:IEEE Press,2007:232-235.
[10] 宋立鋒,戴青云.H.264實(shí)時編碼的指令Cache優(yōu)化[J].電子學(xué)報,2008,36(8):1615-1619.
[11] Texas Instruments Incorporated.TMS320DM 643x DMP DSP subsystem reference guide(spru978)[EB/OL]. [2010-04-01].h ttp://focus.ti.com/lit/ug/sp ru978e/spru978e.pdf.
[12] Texas Instrum en ts Inco rporated.TMS320C64x+DSP megamodule reference guide(spru871)[EB/OL].[2010-04-01].http://www.ti.com/litv/pdf/spru871j.
[13] Texas Instrum ents Incorporated.TMS320C64x+DSP cache user's guide(spru862)[EB/OL].[2010-04-01].http://focus.ti.com/lit/ug/spru862b/spru862b.pdf.