謝曉燕,周金娜,朱 筠,劉新闖,雷 祥
1(西安郵電大學(xué) 計(jì)算機(jī)學(xué)院,西安 710121)2(西安郵電大學(xué) 電子工程學(xué)院,西安 710121)
HEVC是在視頻編碼專家組(Video Coding Experts Group,ITU-T VCEG)和運(yùn)動(dòng)圖像專家組(Moving Picture Experts Group,ISO/IEC MPEG)的共同協(xié)作下開發(fā)的最新視頻編碼標(biāo)準(zhǔn)[1].HEVC具有顯著的壓縮效果,在確保與H.264相同視頻質(zhì)量的同時(shí)降低了50%的比特率[2].其預(yù)測(cè)單元塊(Prediction Unit,PU)的大小從64×64到4×4不等[3].運(yùn)動(dòng)補(bǔ)償算法由于不同尺寸的編碼單元和插值操作,采用了8抽頭亮度濾波器和4抽頭色度濾波器.HEVC的內(nèi)插濾波器分別占編碼器和解碼器執(zhí)行時(shí)間的20%~30%和20%~40%,使得插值濾波器成為HEVC中最耗時(shí)的編碼工具之一[4],插值運(yùn)算的高復(fù)雜性增加了對(duì)硬件加速的需求.為了提高運(yùn)動(dòng)補(bǔ)償算法的計(jì)算效率,一些學(xué)者提出了多種解決方案.
文獻(xiàn)[5]提出了四行并行2維(2 Dimensional,2D)緩存機(jī)制,以減少61.86%的存儲(chǔ)器流量并支持更高的內(nèi)插器吞吐量,可以更高效地完成數(shù)據(jù)的更新,但是其硬件設(shè)計(jì)復(fù)雜,靈活性差.文獻(xiàn)[6]根據(jù)運(yùn)動(dòng)補(bǔ)償算法中8抽頭濾波器的系數(shù)設(shè)計(jì)出了21個(gè)加法器完成濾波操作,將A、B型濾波器合并為一個(gè)可重構(gòu)濾波器架構(gòu).雖然這種方法與H.264相比效率提高了0.043%,但是所需濾波器和寄存器的數(shù)量較多,占用硬件資源較大.文獻(xiàn)[7]設(shè)計(jì)了一種可重構(gòu)數(shù)據(jù)通路的亮度插值濾波器,擁有較高的設(shè)計(jì)效率,但是需要額外的存儲(chǔ)器和控制邏輯.文獻(xiàn)[8]提出了一種新的靈活的硬件結(jié)構(gòu),用于插值濾波器中使用的半像素和四分之一像素.該架構(gòu)可以在30個(gè)時(shí)鐘周期內(nèi)處理4×4 PU的整個(gè)分?jǐn)?shù)位置,但是卻僅能計(jì)算4×4塊.文獻(xiàn)[9]使用64個(gè)可重構(gòu)的濾波器來(lái)滿足不同的濾波器類型,該架構(gòu)雖然能夠?qū)崿F(xiàn)高吞吐量,但是設(shè)計(jì)復(fù)雜性較高,僅能計(jì)算8×8塊.文獻(xiàn)[10]提出了并行化和流水線結(jié)構(gòu)的分像素插值方案,采用高并行度的8輸入雙通道插值器,實(shí)現(xiàn)了視頻的實(shí)時(shí)傳輸,但所占資源較多.
綜上所述,動(dòng)態(tài)可重構(gòu)的并行化運(yùn)動(dòng)補(bǔ)償算法已成為視頻高計(jì)算性能有效的解決方案[11].本文采用動(dòng)態(tài)可編程可重構(gòu)的陣列處理器來(lái)實(shí)現(xiàn)運(yùn)動(dòng)補(bǔ)償算法的并行化實(shí)現(xiàn),基于該結(jié)構(gòu)即高效又靈活的特點(diǎn),又采用數(shù)據(jù)復(fù)用和并行操作的思想,動(dòng)態(tài)實(shí)現(xiàn)運(yùn)動(dòng)補(bǔ)償算法的可變塊模式切換.提高插值過(guò)程的計(jì)算效率,縮短了編碼時(shí)間,提高算法的靈活性.
運(yùn)動(dòng)補(bǔ)償算法采用8抽頭濾波器替換H.264中的6抽頭濾波器,新的8抽頭濾波器中使用了三種不同的插值系數(shù),使得分?jǐn)?shù)精度的樣本預(yù)測(cè)更加精確,插值系數(shù)如表1所示.
表1 分?jǐn)?shù)精度樣本位置對(duì)應(yīng)插值系數(shù)
Table 1 Fractional accuracy sample position corresponding
to interpolation coefficient
分?jǐn)?shù)精度樣本位置插值系數(shù) a、d、e、f、g{-1,4,-10,58,17,-5,1}/64 b、h、i、j、k{-1,4,-11,40,40,-11,4,-1}/64 c、n、p、q、r{1,-5,17,58,-10,4,-1}/64
圖1所示為亮度插值分?jǐn)?shù)精度樣本位置示意圖.整數(shù)樣本所在位置用大寫字母表示,分?jǐn)?shù)樣本所在位置用小寫字母表示.當(dāng)運(yùn)動(dòng)矢量(Motion Vector,MV)指向整數(shù)樣本所在位置時(shí),不進(jìn)行插值運(yùn)算,直接以此整數(shù)樣本值作為最后的預(yù)測(cè)結(jié)果輸出.當(dāng)運(yùn)動(dòng)矢量指向分?jǐn)?shù)位置時(shí),即1/2像素精度或1/4像素精度位置時(shí),運(yùn)動(dòng)補(bǔ)償插值模塊將利用插值濾波器進(jìn)行非整數(shù)樣本預(yù)測(cè).
圖1 亮度插值分?jǐn)?shù)精度樣本位置Fig.1 Luma interpolation score accuracy sample position
運(yùn)動(dòng)補(bǔ)償算法的數(shù)據(jù)相關(guān)性大部分來(lái)源于參考像素的讀取,插值操作需要用周圍的像素點(diǎn)作為參考.例如一個(gè)8×8編碼塊,最多需要15×15參考?jí)K,而對(duì)于下一個(gè)編碼塊,也需要15×15參考?jí)K.其中當(dāng)前參考?jí)K的數(shù)據(jù)和下一參考?jí)K的數(shù)據(jù)存在數(shù)據(jù)重疊現(xiàn)象,如果對(duì)參考數(shù)據(jù)分開做處理,則需要復(fù)雜的控制邏輯來(lái)完成.而針對(duì)更大的編碼塊,需要的參考?jí)K數(shù)據(jù)更多,可以根據(jù)數(shù)據(jù)復(fù)用思想來(lái)更新下一參考?jí)K數(shù)據(jù).并且PU塊越大,需要計(jì)算的插值像素點(diǎn)越多,需要處理的分像素位置情況也更復(fù)雜.如果每次只處理一個(gè)像素點(diǎn),只針對(duì)一種分像素位置進(jìn)行處理,耗時(shí)較長(zhǎng),算法的計(jì)算效率低下.運(yùn)動(dòng)補(bǔ)償算法在同一時(shí)間內(nèi)可以進(jìn)行相同的插值計(jì)算操作,比如執(zhí)行8×8像素塊,每個(gè)像素點(diǎn)的插值計(jì)算和其余63個(gè)像素點(diǎn)的插值計(jì)算并無(wú)數(shù)據(jù)相關(guān)性,所以插值計(jì)算過(guò)程可以采用并行的思想,在同一時(shí)刻處理多個(gè)像素.讀取參考?jí)K數(shù)據(jù)和插值計(jì)算數(shù)據(jù)存在相關(guān)性,所以參考?jí)K讀取與插值計(jì)算這兩個(gè)過(guò)程為串行執(zhí)行.
依照前面分析,本文提出一種基于動(dòng)態(tài)可重構(gòu)陣列處理器的運(yùn)動(dòng)補(bǔ)償并行插值計(jì)算方法,該結(jié)構(gòu)兼顧專用硬件的高效性和通用處理器的靈活性,充分滿足了運(yùn)動(dòng)補(bǔ)償算法插值計(jì)算的需求[12].同時(shí)采用數(shù)據(jù)復(fù)用的思想進(jìn)行參考?jí)K數(shù)據(jù)的動(dòng)態(tài)選取,進(jìn)行陣列和指令的可配置來(lái)實(shí)現(xiàn)可變塊模式的動(dòng)態(tài)選擇.
采用數(shù)據(jù)復(fù)用的思想進(jìn)行參考?jí)K數(shù)據(jù)的動(dòng)態(tài)選取,參考?jí)K更新以8×8的編碼塊為例進(jìn)行說(shuō)明.當(dāng)前一編碼塊處理完之后,就緊接著處理下一編碼塊,這涉及到了參考?jí)K數(shù)據(jù)的更新,如圖2所示.當(dāng)前參考?jí)K和下一個(gè)參考?jí)K數(shù)據(jù)重合的區(qū)域大小為7×15,則下一個(gè)參考?jí)K可以通過(guò)當(dāng)前參考?jí)K更新120個(gè)數(shù)據(jù)即可得到下一個(gè)參考?jí)K.該過(guò)程分為兩個(gè)步驟,執(zhí)行流程圖如圖2所示.
圖2 更新參考?jí)K數(shù)據(jù)Fig.2 Update reference block data
第一步:按列處理參考?jí)K像素:首先將處理元中15×15參考?jí)K的前8列像素值刪除.并把第9列像素作為重構(gòu)15×15參考?jí)K的第1列像素;然后把第10列像素作為重構(gòu)15×15的參考?jí)K的第2列像素;把第11列像素作為重構(gòu)15×15的參考?jí)K的第3列像素;把第12列像素作為重構(gòu)15×15的參考?jí)K的第4列像素;把第13列像素作為重構(gòu)15×15的參考?jí)K的第5列像素;把第14列像素作為重構(gòu)15×15的參考?jí)K的第6列像素;最后把第15列像素作為重構(gòu)15×15的參考?jí)K的第7列像素,即處理完成下一參考?jí)K的前7列數(shù)據(jù).
第二步:將剩余參考?jí)K數(shù)據(jù)從外存中按行加載,處理后8列像素:先將第一行8個(gè)像素從外存中加載進(jìn)來(lái),放在重構(gòu)15×15參考?jí)K的第1行像素位置;再將下一行8個(gè)像素從外存中加載進(jìn)來(lái),放在重構(gòu)15×15參考?jí)K的第2行像素位置;并將第3行8個(gè)像素從外存中加載進(jìn)來(lái),放在重構(gòu)15×15參考?jí)K的第3行像素位置;以此類推,最后將第15行8個(gè)像素從外存中加載進(jìn)來(lái),放在重構(gòu)15×15的參考?jí)K第15行像素的位置.
本文所采用的可重構(gòu)視頻陣列結(jié)構(gòu)由1024個(gè)同構(gòu)且規(guī)則的輕核處理元以鄰接互連的方式構(gòu)成,簇內(nèi)通過(guò)鄰接互連和共享存儲(chǔ)通信,簇間通過(guò)路由器和適配器進(jìn)行通信.可重構(gòu)陣列處理器由全局指令存儲(chǔ)器、輸入存儲(chǔ)器、輸出存儲(chǔ)器、陣列處理器和全局控制器五部分組成.全局指令存儲(chǔ)器用于存儲(chǔ)陣列處理器工作的操作指令和調(diào)用指令;輸入存儲(chǔ)器負(fù)責(zé)從外存中加載相應(yīng)的視頻序列;陣列處理器為核心計(jì)算部分由8×8個(gè)簇(Processing Element Group,PEG)組成.全局控制器為可重構(gòu)機(jī)制的核心部分,全局控制器用于實(shí)現(xiàn)對(duì)陣列計(jì)算資源的控制與管理,包括操作指令的廣播、調(diào)用指令的分發(fā)、計(jì)算資源信息的收集等.其上層為主機(jī)接口,下層為32×32個(gè)處理元(Processing Element,PE)組成的陣列處理器.主要功能是在主機(jī)接口和陣列處理器之間形成一個(gè)層次化編程網(wǎng)絡(luò),利用層次化編程網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)對(duì)陣列計(jì)算資源的控制與管理.為取址簡(jiǎn)單,尋址過(guò)程中的位寬可以逐級(jí)遞減以確保每一條指令都同時(shí)到達(dá)PE,層次化編程網(wǎng)絡(luò)設(shè)計(jì)通過(guò)H型網(wǎng)絡(luò)進(jìn)行指令加載.主處理器只需要向全局控制器發(fā)送任務(wù)指令和必要的數(shù)據(jù)或數(shù)據(jù)存儲(chǔ)地址,全局控制器便會(huì)控制指令傳輸網(wǎng)絡(luò)分配指令給不同PE執(zhí)行相應(yīng)的操作,如圖3所示.
圖3 動(dòng)態(tài)可重構(gòu)陣列處理器Fig.3 Dynamic reconfigurable array processor
在運(yùn)動(dòng)補(bǔ)償算法中,處理的編碼塊越大,需要計(jì)算的插值像素點(diǎn)也就越多,待處理的分像素位置情況越復(fù)雜.如果每次只處理一個(gè)像素點(diǎn),只針對(duì)一種分像素位置進(jìn)行處理,則耗時(shí)太長(zhǎng),算法計(jì)算效率低下.所以本文采用數(shù)據(jù)并行的思想,在同一時(shí)間處理多個(gè)像素點(diǎn),縮短數(shù)據(jù)讀取和計(jì)算時(shí)間從而提高算法的計(jì)算效率.以8×8塊大小為例,算法的映射圖如圖4所示,具體操作步驟如下:
Step 1.原始數(shù)據(jù)和參考數(shù)據(jù)加載.當(dāng)前幀的數(shù)據(jù)存儲(chǔ)在DIM中,參考幀的數(shù)據(jù)存儲(chǔ)在到DOM中的.PE00訪問(wèn)DIM,讀取原始像素值,并發(fā)送到PE03.同時(shí)PE01訪問(wèn)DOM,讀取相應(yīng)的參考像素值.并下發(fā)到PE00,PE11,PE02,PE03.其中PE00將數(shù)據(jù)下發(fā)給PE10,PE20,PE30;PE11將數(shù)據(jù)下發(fā)給PE21,PE31;PE02將數(shù)據(jù)下發(fā)給PE12,PE22,PE32;PE03將數(shù)據(jù)下發(fā)給PE13,PE23,PE33.為了提高數(shù)據(jù)傳輸效率,不需要等待PE00下發(fā)完后其他PE才下發(fā),只要某個(gè)PE接收到下發(fā)數(shù)據(jù)命令就立刻將數(shù)據(jù)下發(fā)給相對(duì)應(yīng)的PE.
Step 2.插值計(jì)算.各個(gè)PE接收到數(shù)據(jù)之后,開始進(jìn)行1/2或者1/4插值計(jì)算.由于運(yùn)動(dòng)補(bǔ)償算法在同一時(shí)間內(nèi)有大量相同的插值計(jì)算,每個(gè)像素點(diǎn)的插值計(jì)算和其他像素點(diǎn)的插值計(jì)算并無(wú)數(shù)據(jù)相關(guān)性,所以插值計(jì)算可以在16個(gè)PE中同時(shí)進(jìn)行.插值計(jì)算完成后再將預(yù)測(cè)值通過(guò)共享存儲(chǔ)傳輸?shù)絇E03中.
Step 3.將PE03中的預(yù)測(cè)值和當(dāng)前像素值進(jìn)行殘差計(jì)算,計(jì)算完后將殘差值傳輸?shù)絇E30中與預(yù)測(cè)值完成圖像重建.
圖4 運(yùn)動(dòng)補(bǔ)償算法的映射圖Fig.4 Map of motion compensation algorithm
運(yùn)動(dòng)補(bǔ)償算法支持所有可能的PU尺寸,其范圍從4×4像素塊到64×64像素塊,這對(duì)內(nèi)存訪問(wèn),控制和處理的并行性要求是一個(gè)重大挑戰(zhàn).為了應(yīng)對(duì)這一挑戰(zhàn),本文提出了一種運(yùn)動(dòng)補(bǔ)償算法的動(dòng)態(tài)可重構(gòu)實(shí)現(xiàn)方案,基于上下文切換的重構(gòu)機(jī)制,實(shí)現(xiàn)對(duì)可變塊算法的動(dòng)態(tài)映射.動(dòng)態(tài)重構(gòu)機(jī)制主要核心分為指令重構(gòu)和規(guī)模重構(gòu).主要用到指令下發(fā)網(wǎng)絡(luò)的指令廣播操作和指令下發(fā)操作.指令重構(gòu)是將不同塊的代碼下發(fā)到相應(yīng)簇中,實(shí)現(xiàn)PE功能單元的重構(gòu).規(guī)模重構(gòu)是基于上下文切換的方式將指令預(yù)先存放在陣列結(jié)構(gòu)中每個(gè)PE自帶的指令存儲(chǔ)器中,然后通過(guò)廣播操作同時(shí)開啟所需PE.規(guī)模重構(gòu)有256個(gè)PE(16個(gè)PEG),64個(gè)PE(4個(gè)PEG)和16個(gè)PE(1個(gè)PEG),當(dāng)執(zhí)行4×4至64×64塊大小時(shí),PEG00-PEG33的本地同時(shí)存儲(chǔ)指令,其規(guī)模重構(gòu)如圖5所示.若做64×64的塊大小,則通過(guò)指令廣播操作指令讓所有的簇(PEG00-PEG33)工作;若做32×32塊大小,則通過(guò)指令廣播操作指令讓所有的簇(PEG00-PEG11)工作;若做16×16塊大小,則通過(guò)指令廣播操作指令讓簇(PEG00-PEG01)工作;若做8×8塊大小,則通過(guò)指令廣播操作指令讓簇(PEG00)工作;若做4×4塊大小,則通過(guò)指令廣播操作指令讓簇(PEG01)工作.
圖5 4×4-64×64運(yùn)動(dòng)補(bǔ)償算法可重構(gòu)功能圖Fig.5 4×4-64×64 motion compensation algorithmreconfigurable function diagram
下面以4×4塊大小切換8×8塊大小為例具體說(shuō)明.在加載之前應(yīng)針對(duì)不同分辨率的測(cè)試序列進(jìn)行編碼塊首地址存放.首先將YUV測(cè)試序列通過(guò)Matlab軟件轉(zhuǎn)換成陣列結(jié)構(gòu)能識(shí)別的二進(jìn)制數(shù)值.并將該數(shù)據(jù)以陣列的格式分布在文檔中,存放到DIM中.當(dāng)執(zhí)行4×4塊大小,通過(guò)廣播操作指令讓PEG00工作,當(dāng)執(zhí)行完4×4塊大小之后,通過(guò)CALL調(diào)用指令切換到8×8塊大小,此時(shí)PEG01工作,其中簇內(nèi)具體映射方案如上圖4所示.4×4塊的映射方案和8×8映射方案相同,4×4塊大小每個(gè)PE計(jì)算一個(gè)像素,8×8塊大小每個(gè)PE計(jì)算4個(gè)像素.
為了驗(yàn)證運(yùn)動(dòng)補(bǔ)償算法可重構(gòu)實(shí)現(xiàn)的可行性,本文基于動(dòng)態(tài)可重構(gòu)陣列結(jié)構(gòu)進(jìn)行驗(yàn)證.方法如下:通過(guò)修改測(cè)試模型HM10.0的配置文件,獲取測(cè)試數(shù)據(jù)和塊劃分信息,存入片外存儲(chǔ),然后通過(guò)QuestaSim將可重構(gòu)方案映射到動(dòng)態(tài)可重構(gòu)陣列結(jié)構(gòu)上進(jìn)行仿真驗(yàn)證.圖6為不同陣列規(guī)模下處理不同塊大小所需的時(shí)間,其中串行處理時(shí)間為單PE處理結(jié)果,相比于串行執(zhí)行,并行處理縮短了約93%處理時(shí)間.在不同的陣列規(guī)模下,當(dāng)執(zhí)行4×4切換到8×8塊大小時(shí),執(zhí)行4個(gè)4×4既可切換到8×8;當(dāng)執(zhí)行8×8切換到16×16塊大小時(shí),執(zhí)行4個(gè)8×8塊大小即可切換到16×16塊;當(dāng)執(zhí)行16×16切換到32×32塊大小時(shí),執(zhí)行4個(gè)16×16塊大小即可切換到32×32塊;同理,執(zhí)行32×32塊切換到64×64塊大小時(shí),執(zhí)行4個(gè)32×32塊大小即可切換到64×64.
圖6 不同塊大小運(yùn)動(dòng)補(bǔ)償算法計(jì)算時(shí)間統(tǒng)計(jì)Fig.6 Calculation of time statistics for different block sizemotion compensation algorithms
采用CMOS90nm工藝對(duì)可重構(gòu)視頻陣列處理器進(jìn)行綜合,再通過(guò)BEE4平臺(tái)上的FPGA LX6V550T對(duì)設(shè)計(jì)進(jìn)行綜合,如表2所示為8×8編碼塊綜合結(jié)果,從頻率、資源占用率以及并行度分別進(jìn)行比較.根據(jù)能同時(shí)處理像素的多少,可以得出16個(gè)PE規(guī)模的陣列結(jié)構(gòu)并行度為16.文獻(xiàn)[6]設(shè)計(jì)了可重構(gòu)的濾波器,其頻率遠(yuǎn)遠(yuǎn)低于本文,而且設(shè)計(jì)的像素處理并行度也是其2倍.文獻(xiàn)[10]僅用于處理8×8編碼塊,雖然資源占用比本文低,但是工作頻率遠(yuǎn)遠(yuǎn)低于本文,并行度也僅為本文的一半.文獻(xiàn)[13]提出的高度并行的流水線設(shè)計(jì),可同時(shí)處理32個(gè)像素,頻率雖然略高,但是資源占用卻是本文的2倍之多.文獻(xiàn)[14]在頻率和本文相當(dāng)?shù)那闆r下,硬件資源是本文設(shè)計(jì)的4倍還要多.文獻(xiàn)[15]在頻率上略高于本文,但是其硬件資源卻差不多是本文設(shè)計(jì)的4倍.
表2 運(yùn)算性能比較
Table 2 Comparison of computing performance
本文文獻(xiàn)[6]文獻(xiàn)[10]文獻(xiàn)[13]文獻(xiàn)[14]文獻(xiàn)[15]FPGAZynq 7045///65nmFPGAZynq 7045ASIC90nm90nm65nm40nm//工作頻率ISE綜合156MHz///150MHz180MHzDC綜合300MHz171 MHz34.2MHz342 MHz//LUT38.345k///126k74200ALM?+341DSP+113KGate137.425k32.49K64.8K297.3K//并行度168832//
本文基于可重構(gòu)視頻陣列處理器結(jié)構(gòu),針對(duì)可變塊的運(yùn)動(dòng)補(bǔ)償算法,提出了一種新的高并行度的可重構(gòu)方案.該方案能夠通過(guò)動(dòng)態(tài)調(diào)整視頻陣列處理器規(guī)模,來(lái)實(shí)現(xiàn)不同塊大小的運(yùn)動(dòng)補(bǔ)償算法.該設(shè)計(jì)能夠靈活的切換塊大小并且最大限度地利用可重構(gòu)陣列處理器.實(shí)驗(yàn)結(jié)果表明:所提出的可重構(gòu)實(shí)現(xiàn)方式相比于串行單PE處理時(shí)間節(jié)省了約93%,該結(jié)構(gòu)在具有較高的執(zhí)行效率的同時(shí)也具有較好的靈活性.