蔣 林 黎瑞金 曹 非
1(西安科技大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 陜西 西安 710600)
2(西安科技大學(xué)電氣與控制工程學(xué)院 陜西 西安 710600)
近年來3D視頻在各行各業(yè)中有著廣闊的應(yīng)用場景。在基于3D-HEVC的三維視頻編碼技術(shù)中,編碼模式的選擇采用了率失真優(yōu)化方法,深度圖的失真會(huì)導(dǎo)致合成視點(diǎn)的失真,所以我們可以通過測量合成視點(diǎn)的失真來替代深度圖的失真,保證虛擬合成視圖的質(zhì)量[1]。因此,Tech等[2-4]針對(duì)深度數(shù)據(jù)的失真度量提出了應(yīng)用3D-HEVC的視點(diǎn)合成失真變化算法。這種算法具有高級(jí)視圖算法的所有基本功能,例如像素變化、差值、空洞填充以及融合,使得編碼端可以在率失真優(yōu)化過程中直接計(jì)算合成視點(diǎn)失真。但是,這種方法需要在編碼過程中執(zhí)行基于像素級(jí)的視點(diǎn)合成與失真值計(jì)算操作,引起頻繁的訪存操作,導(dǎo)致過高的編碼復(fù)雜度以及較低的算法性能。為了解決SVDC這種數(shù)據(jù)密集型算法的計(jì)算復(fù)雜度過高的問題,Ma等[5]提出了一種通過設(shè)置三種合成視點(diǎn)零差異條件下提前終止SVDC計(jì)算過程的模型,但是傳統(tǒng)處理器串行化的計(jì)算方式仍使得SVDC算法的性能提升有限。
針對(duì)上述問題,本文基于陣列處理器的SVDC并行算法,采用分布式共享存儲(chǔ)結(jié)構(gòu)(Unified addressing Distributed Shared Memory Structure,UaDSMS)[7]實(shí)現(xiàn)了多視點(diǎn)并行計(jì)算。充分利用了陣列處理器的并行特性進(jìn)行算法映射,并根據(jù)算法的訪存特性做出優(yōu)化,使得SVDC算法的性能得到較大提升。
項(xiàng)目組前期開發(fā)的陣列處理器由多個(gè)處理單元(Processing Element,PE)構(gòu)成,該P(yáng)E的結(jié)構(gòu)如圖1所示[6]。每個(gè)PE分別由ALU單元、寄存器單元、左路數(shù)據(jù)選擇單元、右路數(shù)據(jù)選擇單元、fanout單元和配置單元組成。
圖1 PE結(jié)構(gòu)
此陣列處理器結(jié)構(gòu)由16個(gè)PE組成一個(gè)簇,采用了4×4的矩陣結(jié)構(gòu),單個(gè)PE的數(shù)據(jù)訪存位寬是16位。其中分布式共享存儲(chǔ)結(jié)構(gòu)如圖2所示[7],此存儲(chǔ)結(jié)構(gòu)下層為16個(gè)同樣排列結(jié)構(gòu)512 bit×16 bit大小組成的RAM,中間是采用了全交換結(jié)構(gòu)(Full Switching,FS)的高速訪問單元,上層為16個(gè)PE組成的簇,這種結(jié)構(gòu)是一種最直接且并行度最高的高速交換單元結(jié)構(gòu)。
圖2 分布式共享存儲(chǔ)結(jié)構(gòu)
分布式共享存儲(chǔ)結(jié)構(gòu)的主要優(yōu)勢如下:1) 從邏輯上分析,整個(gè)片上存儲(chǔ)采用相同的編址方式。2) 從物理上分析,采用多個(gè)分布式存儲(chǔ)塊,實(shí)現(xiàn)片上存儲(chǔ)的并行訪問,支持簇內(nèi)請(qǐng)求的無沖突并行訪問。
根據(jù)以上分析,我們發(fā)現(xiàn)具有“邏輯共享、物理分布”特性的分布式共享存儲(chǔ)結(jié)構(gòu)所表現(xiàn)出的并行化設(shè)計(jì)優(yōu)勢,非常適合SVDC算法數(shù)據(jù)密集的特點(diǎn)。
SVDC算法可以通過聯(lián)系合成視點(diǎn)失真與深度圖失真,計(jì)算當(dāng)前合成視點(diǎn)中由于深度值變化所產(chǎn)生的全部失真值,從而提升深度圖編碼的率失真優(yōu)化效果,并且可以同時(shí)考慮當(dāng)前深度圖編碼塊周圍像素的深度值變化情況。因此,SVDC算法被定義為計(jì)算兩個(gè)合成視點(diǎn)的失真值之差:
(1)
圖3 SVDC算法流程
由圖3可以看出SVDC算法在計(jì)算過程中,每一次SVDC計(jì)算都要經(jīng)過三個(gè)合成視點(diǎn)進(jìn)行SSD計(jì)算,其中每一個(gè)合成視點(diǎn)都是由原始紋理圖幀、原始深度圖幀和重建紋理圖幀、重建深度圖幀分別求得,大量的SSD計(jì)算會(huì)出現(xiàn)頻繁的訪存操作。傳統(tǒng)處理器串行化的計(jì)算方式會(huì)使得算法的性能難以提升。針對(duì)以上的問題,本文將基于陣列處理器和分布式共享存儲(chǔ)結(jié)構(gòu),實(shí)現(xiàn)多視點(diǎn)SSD并行計(jì)算,通過簇內(nèi)PE陣列處理器的并行執(zhí)行,實(shí)現(xiàn)對(duì)SVDC算法的加速。
SVDC算法主要可分為虛擬視點(diǎn)合成以及失真值計(jì)算兩大部分。圖4是SVDC算法的陣列處理器映射結(jié)構(gòu)。共調(diào)用4個(gè)簇的資源,PE00簇負(fù)責(zé)預(yù)處理,PE01簇負(fù)責(zé)3D-warping,PE11簇負(fù)責(zé)空洞填充,PE10簇負(fù)責(zé)失真值計(jì)算,下面為各個(gè)簇的工作安排。
圖4 SVDC算法映射結(jié)構(gòu)圖
PE00號(hào)簇:00號(hào)簇從外部存儲(chǔ)設(shè)備加載相機(jī)參數(shù)并將數(shù)據(jù)暫時(shí)存入00號(hào)簇的RAM中。如圖5所示針對(duì)深度圖進(jìn)行中值濾波預(yù)處理,使用01、02、03、11、12、13、21、22、23號(hào)PE,分為三步進(jìn)行中值濾波。
圖5 預(yù)處理中值濾波
Step1:將從外部存儲(chǔ)設(shè)備加載的數(shù)據(jù)以3×3的像素塊為單位,每行從大到小排序,分別取得大、中、小三個(gè)值。
Step2:對(duì)大值行即第一列進(jìn)行比較,對(duì)小值行即第三列進(jìn)行比較,取其中的大值與小值。
Step3:把三行的中值與第二列相比較,再取一次中值。將小值、中值和大值進(jìn)行比較與排序,獲得的中值即為該像素塊的中值。
PE01號(hào)簇:3D-warping是產(chǎn)生虛擬視點(diǎn)的核心技術(shù),它將先提取圖像幀的深度圖信息,再根據(jù)深度圖信息,把參考紋理圖的視點(diǎn)信息投射至3D空間坐標(biāo),最后投射到2D空間坐標(biāo)的目標(biāo)視點(diǎn)。這種方法需要攝像機(jī)參數(shù),其中內(nèi)部相機(jī)參數(shù)用A表示,外部相機(jī)參數(shù)用R與t表示。
(2)
式中:r代表參考視點(diǎn);Zr是參考視點(diǎn)在(ur,vr)位置的深度值,首先我們利用內(nèi)部相機(jī)參數(shù)A將3D相機(jī)的坐標(biāo)映射到2D空間的虛擬視點(diǎn)中去,再取一個(gè)參考視點(diǎn)的像素坐標(biāo)(ur,vr),最后利用深度圖信息將像素坐標(biāo)映射到世界坐標(biāo)中的(Xw,Yw,Zw)位置中。
(3)
(4)
式中:v表示8比特的深度值,其中z、Znear和Zfar都被設(shè)定為正值或負(fù)值。如式(4)所示,其中(Xw,Yw,Zw)是式(2)映射到3D空間的坐標(biāo),3×3的旋轉(zhuǎn)矩陣R與3×1的平移矩陣是攝像機(jī)參數(shù)。
PE11號(hào)簇:空洞填充作為虛擬視點(diǎn)合成中的難點(diǎn),長期以來影響著該領(lǐng)域的發(fā)展[9]。本文通過人工識(shí)別空洞點(diǎn)的方式,通過匯編指令向PE下發(fā)指令,針對(duì)空洞部分采集鄰近像素點(diǎn)的信息,再逐步進(jìn)行空洞點(diǎn)的像素填充。這里共調(diào)用10個(gè)PE,首先由00號(hào)PE將數(shù)據(jù)分發(fā)至02、03、12、13、20、21、30、31號(hào)PE,然后各PE采集鄰近像素點(diǎn)的信息,并將其填充進(jìn)空洞部分,最后各PE將結(jié)果傳送到33號(hào)PE,準(zhǔn)備送入10號(hào)簇進(jìn)行失真值計(jì)算。
PE10號(hào)簇:失真值計(jì)算,由于失真值計(jì)算涉及大量合成視點(diǎn)的SSD計(jì)算,存在頻繁的訪存操作以及冗余的編碼復(fù)雜度,本文利用陣列處理器及分布式共享存儲(chǔ)的并行設(shè)計(jì)優(yōu)勢,實(shí)現(xiàn)了多視點(diǎn)SSD并行計(jì)算。
失真值計(jì)算作為SVDC算法的核心步驟,頻繁的訪存操作會(huì)使得算法出現(xiàn)大量的數(shù)據(jù)移動(dòng)。本節(jié)作者在使用單元級(jí)SSD計(jì)算映射方案實(shí)現(xiàn)后,通過優(yōu)化訪存時(shí)序,提出了像素級(jí)SSD計(jì)算設(shè)計(jì)。
(1) 單元級(jí)SSD計(jì)算設(shè)計(jì)。以8×8像素點(diǎn)的圖像塊為例,具體操作如圖6所示。
圖6 單元級(jí)SSD計(jì)算
圖7 像素級(jí)SSD計(jì)算設(shè)計(jì)結(jié)構(gòu)圖
這種不同于傳統(tǒng)處理器串行訪存特性的處理方式,完全依賴于本文所用到的陣列處理器與分布式共享存儲(chǔ)結(jié)構(gòu)。其中單個(gè)PE對(duì)本地RAM的無阻塞訪問以及簇內(nèi)無沖突的并行訪問極大地提高了運(yùn)算資源利用率。使用像素級(jí)SSD計(jì)算替代單元級(jí)SSD計(jì)算,可以使失真值計(jì)算提升39.3%的時(shí)間性能。
為了評(píng)估本文所提出SVDC算法并行設(shè)計(jì)的性能,我們采用3D-HEVC參考軟件HTM-16.1[12]作為對(duì)比平臺(tái)。選用四個(gè)JCT-3V小組建議的標(biāo)準(zhǔn)序列作為測試用例,包括“Balloons”“Kendo”“GTFly”“PoznanStreet”進(jìn)行測試,量化參數(shù)(QP)為(25,34)。本文使用基于項(xiàng)目組提供的DPR-CODEC結(jié)構(gòu)精簡指令集經(jīng)過轉(zhuǎn)碼后的二進(jìn)制代碼在modelsim中進(jìn)行基本功能仿真驗(yàn)證。
將本文實(shí)現(xiàn)的SVDC算法計(jì)算性能分別與文獻(xiàn)[4]、文獻(xiàn)[5]與文獻(xiàn)[10]的計(jì)算性能進(jìn)行對(duì)比,如表1所示。其中ΔT表示本文在SVDC算法計(jì)算相比于HTM-16.1平臺(tái)中計(jì)算節(jié)省時(shí)間百分比,Δt表示并行編碼相比于串行編碼節(jié)省時(shí)間百分比,ΔS表示像素級(jí)SSD計(jì)算相比單元級(jí)SSD計(jì)算節(jié)省時(shí)間百分比。
表1 不同方法的編碼時(shí)間對(duì)比(%)
(5)
(6)
(7)
其中文獻(xiàn)[4]所提出的RM渲染器在編碼端將SVDC算法分為初始化、部分重渲染以及SVDC計(jì)算共三部分,通過RM渲染器在初始化后存儲(chǔ)中間變量并進(jìn)行快速重渲染過程,大幅度降低編碼復(fù)雜度。針對(duì)深度圖編碼越復(fù)雜的測試序列,RM渲染器提升越大,與本文相比在視點(diǎn)合成部分有較大的編碼優(yōu)勢。文獻(xiàn)[5]提出的零合成視差模型考慮了深度-視差映射,紋理適應(yīng)和遮擋三種效果用于視點(diǎn)合成優(yōu)化。文獻(xiàn)[10]提出了的視點(diǎn)合成優(yōu)化方法,相比原方法增加了跳過零失真的較小模塊或像素行的過程。文獻(xiàn)[5]與文獻(xiàn)[10]仍著重于對(duì)視點(diǎn)合成部分進(jìn)行優(yōu)化,但是失真值計(jì)算卻依舊采用傳統(tǒng)的串行編碼方式。經(jīng)過實(shí)驗(yàn)得到如表1所示實(shí)驗(yàn)數(shù)據(jù),可以發(fā)現(xiàn)本文提出的SVDC算法并行化設(shè)計(jì)相比于文獻(xiàn)[5]與文獻(xiàn)[10]可以獲得更快的編碼時(shí)間,但是未能超過文獻(xiàn)[4]的RM渲染器模型。相較于HTM原始算法,本文的算法性能平均可以提升19.025%。
為了證明并行編碼方式的有效性,如表2所示對(duì)四個(gè)不同測試序列測試四個(gè)8×8的像素塊,分別使用串行編碼方式(單PE)以及并行編碼方式(多PE)進(jìn)行失真值計(jì)算,并行編碼方式分為單元級(jí)SSD計(jì)算以及像素級(jí)SSD計(jì)算。實(shí)驗(yàn)結(jié)果可知,相比于串行編碼方式,本文提出的并行編碼方式可以提升57.6%的計(jì)算性能,串/并加速比平均可以達(dá)到2.36,相比于單元級(jí)SSD計(jì)算,本文提出的像素級(jí)SSD計(jì)算優(yōu)化設(shè)計(jì)可以提升39.3%的計(jì)算性能。從表2中可看出,當(dāng)像素塊越復(fù)雜,像素級(jí)SSD計(jì)算的Δt就越大,這得益于像素級(jí)SSD計(jì)算設(shè)計(jì)通過重新劃分計(jì)算與訪存時(shí)序,提高了計(jì)算訪存比,減少了PE單元的空閑時(shí)間。
表2 串行編碼與并行編碼失真值計(jì)算性能分析
由于整個(gè)SVDC算法中涉及大量的SSD計(jì)算,陣列處理器以及分布式共享存儲(chǔ)結(jié)構(gòu)可以在簇內(nèi)提供16個(gè)位寬為16位的數(shù)據(jù)讀寫訪問通道,支持單個(gè)像素點(diǎn)的數(shù)據(jù)存取,其中單個(gè)PE擁有對(duì)本地RAM的優(yōu)先訪問權(quán),讀操作與寫操作分別可以在1與2個(gè)時(shí)鐘周期內(nèi)完成,使得PE的數(shù)據(jù)訪存難度降低,可以大幅度提高SVDC計(jì)算的性能。
如圖8所示,對(duì)8×8的像素塊使用不同處理器規(guī)模進(jìn)行失真值計(jì)算性能分析。實(shí)驗(yàn)結(jié)果表明,當(dāng)使用的PE核數(shù)增多時(shí),算法并行度的提升將導(dǎo)致性能逐步提升,但是由于核數(shù)的增多、數(shù)據(jù)訪存量的增大會(huì)造成算法并行化設(shè)計(jì)愈加復(fù)雜。后續(xù)的工作中將對(duì)于如何提高PE的資源利用率以及如何設(shè)計(jì)出更高并行度的算法映射方式展開研究。
圖8 不同處理器規(guī)模下失真值計(jì)算分析
本文基于陣列處理器及分布式共享存儲(chǔ)結(jié)構(gòu),提出了一種針對(duì)SVDC算法的并行映射實(shí)現(xiàn)方法。首先通過加載相機(jī)參數(shù)并進(jìn)行中值濾波對(duì)圖像進(jìn)行預(yù)處理,其次進(jìn)行3D-warping與空洞填充合成虛擬視點(diǎn),最后進(jìn)行失真值計(jì)算。以8×8的像素塊為單位,進(jìn)行多視點(diǎn)SSD計(jì)算,利用一個(gè)簇的運(yùn)算資源得到4個(gè)塊共計(jì)256個(gè)像素點(diǎn)的SVDC失真值。同時(shí)根據(jù)算法訪存特性,使用像素級(jí)SSD計(jì)算設(shè)計(jì)替換單元級(jí)SSD計(jì)算設(shè)計(jì)以提高運(yùn)算資源利用率與算法性能。實(shí)驗(yàn)結(jié)果表明,相比于HTM平臺(tái),本文所采用的陣列處理器實(shí)現(xiàn)的SVDC算法,其時(shí)間性能平均可以提升19.025%,所設(shè)計(jì)的失真值計(jì)算并行方案的串/并加速比為2.36,相比于單元級(jí)SSD計(jì)算,像素級(jí)SSD計(jì)算優(yōu)化設(shè)計(jì)可以提升39.3%的計(jì)算性能。使用不同處理器規(guī)模對(duì)8×8的像素塊進(jìn)行失真值計(jì)算性能分析表明,隨著處理器核數(shù)的增多,算法計(jì)算性能會(huì)逐漸提升,但是數(shù)據(jù)訪存量的增大會(huì)造成算法并行化設(shè)計(jì)愈加復(fù)雜。后續(xù)的工作中將對(duì)于如何提高PE的資源利用率以及如何設(shè)計(jì)出更高并行度的算法映射方式展開研究。