文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.182489
中文引用格式: 韓孟橋,蔣林,楊博文,等. 移動(dòng)圖形處理器的紋理Cache設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2019,45(5):17-22.
英文引用格式: Han Mengqiao,Jiang Lin,Yang Bowen,et al. Design of texture cache for embedded mobile graphics processing unit[J]. Application of Electronic Technique,2019,45(5):17-22.
0 引言
隨著手機(jī)、PAD等移動(dòng)設(shè)備進(jìn)一步普及,對(duì)3D圖形繪制的需求也越來越大。桌面GPU相較于移動(dòng)GPU,其渲染流程簡單直接、數(shù)據(jù)吞吐率高,進(jìn)而帶寬需求高,功耗大。文獻(xiàn)[1]指出相比于集成電路按照摩爾定律的發(fā)展速度,電池供電技術(shù)發(fā)展得緩慢得多,移動(dòng)設(shè)備最基本的問題是電池供電。在移動(dòng)設(shè)備中,由于圖形應(yīng)用于液晶顯示器上,因此圖形渲染時(shí)系統(tǒng)功耗大,軟件的優(yōu)化是有限的,所以對(duì)硬件的低功耗設(shè)計(jì)是研究的重點(diǎn),進(jìn)而達(dá)到移動(dòng)設(shè)備在低帶寬功耗的條件下實(shí)現(xiàn)較高性能的渲染效果。
紋理映射是紋理空間與像素空間相互映射的過程,在對(duì)紋理圖形進(jìn)行放大或縮小時(shí),會(huì)出現(xiàn)單紋素對(duì)應(yīng)多像素或多紋素對(duì)應(yīng)單像素的情況,造成紋理走樣的現(xiàn)象。因此,行業(yè)內(nèi)權(quán)威共同制定了適用于嵌入式的3D圖形標(biāo)準(zhǔn)OpenGL ES[2],其使用各向同性濾波方式。該方式中的最近鄰點(diǎn)采樣濾波因沒有考慮到紋理映射的范圍,容易產(chǎn)生鋸齒現(xiàn)象;該方式中的雙線性濾波雖然有效地減少了鋸齒問題,但容易造成模糊現(xiàn)象;該方式中的Mipmap濾波是經(jīng)典的映射方法;最后的三線性濾波是對(duì)Mipmap濾波的優(yōu)化,所以本文選擇了三線性濾波。因?yàn)殡p線性濾波是對(duì)鄰近d的一層紋理圖像中相鄰的四個(gè)紋素位置進(jìn)行采樣,三線性濾波是對(duì)鄰近d的兩層紋理圖像分別進(jìn)行雙線性濾波,并將兩層的雙線性濾波加權(quán),進(jìn)而雙線性濾波是三線性濾波的簡化,本文以下用雙線性進(jìn)行說明。
紋理訪存是影響像素處理器速率的關(guān)鍵,同樣也是移動(dòng)GPU整體性能的瓶頸。加上片上紋理高速緩沖存儲(chǔ)器,建立關(guān)于紋素的片上L1緩存,有效降低了移動(dòng)GPU與外存間的數(shù)據(jù)帶寬。紋理Cache與普通Cache的不同:首先,紋理Cache為只讀,區(qū)別于普通Cache的寫數(shù)據(jù)和寫回功能;其次,紋理Cache的吞吐率同移動(dòng)GPU整體性能結(jié)合緊密,本文結(jié)合雙線性濾波需要四紋素的特點(diǎn),使用4端口Cache。紋理Cache是流水線形式,本文使用FIFO控制器控制FIFO緩沖區(qū)預(yù)存塊的讀寫,減少了移動(dòng)GPU流水線的停頓。
1 基于Tile-based的移動(dòng)圖形處理架構(gòu)
Imagnination公司PowerVR系列產(chǎn)品的移動(dòng)GPU采用文獻(xiàn)[3]提出的TBR(Tile Based Rendering)渲染模式,在幾何運(yùn)算后將屏幕像素點(diǎn)劃分為多個(gè)Tile,并在像素處理器中逐Tile進(jìn)行渲染。相比于適用于桌面圖形處理器的立即渲染模式(Immediate Mode Rendering,IMR),TBR渲染模式在執(zhí)行光柵化和圖元操作時(shí)可以將每個(gè)Tile上所有的深度及顏色等信息都存在片上,顯著降低了存儲(chǔ)帶寬。文獻(xiàn)[4]指出移動(dòng)GPU主要的功耗來源于訪問片外存儲(chǔ),所以TBR模式適用于移動(dòng)圖形處理器。圖1為本文移動(dòng)圖形處理器的體系結(jié)構(gòu)。
整個(gè)移動(dòng)GPU采用了統(tǒng)一架構(gòu),即幾何變換操作、頂點(diǎn)坐標(biāo)的光照計(jì)算和著色渲染都在統(tǒng)一渲染染色器(Unified Shading Processor,USP)中完成;屏幕坐標(biāo)產(chǎn)生單元(Screen-coordinate Generating Unit,SGU)完成幾何處理后頂點(diǎn)的圖元裝配、裁剪、背面剔除等操作,轉(zhuǎn)換到屏幕空間;后續(xù)模塊為覆蓋率計(jì)算、中間數(shù)據(jù)緩存建立等;最終通過深度測(cè)試輸出給幀緩存。TBR渲染模式中,Tile的大小有8×8、16×16、32×32等多種劃分方式,文獻(xiàn)[5]指出當(dāng)Tile大小為8×8時(shí),紋理Cache的性能可以達(dá)到最優(yōu),但從移動(dòng)GPU整體性能方面考慮,一般應(yīng)采用Antoeh[6]建議的32×32大小的Tile。
2 紋理濾波
紋理映射是將二維圖像投影到屏幕的三角形上,在移動(dòng)GPU中,這一過程是逆向處理的,即對(duì)每個(gè)在屏幕上的像素點(diǎn),計(jì)算其對(duì)應(yīng)于二維圖像中的紋理坐標(biāo)。但屏幕空間對(duì)應(yīng)到紋理空間時(shí),不一定恰好對(duì)應(yīng)到一個(gè)紋素,而是對(duì)應(yīng)到紋理空間中某個(gè)區(qū)域,這時(shí)就需要對(duì)該區(qū)域中的紋素進(jìn)行加權(quán)計(jì)算,這就是濾波。
Lance Willams提出了一種目前幾乎所有圖形硬件都會(huì)支持的濾波方法,即Mipmap濾波技術(shù)。圖2(a)所示為Miapmap金字塔,其核心內(nèi)容如圖2(b)所示,將不同分辨率的紋理存儲(chǔ)在外存中。在映射時(shí),根據(jù)紋素與像素的縮放率d,選擇適合的層級(jí),對(duì)于較小的多邊形映射,可以有效降低紋理走樣的出現(xiàn)。
在Mipmap濾波的基礎(chǔ)上,進(jìn)一步提出了三線性濾波,顯著降低了走樣現(xiàn)象的產(chǎn)生。首先,計(jì)算縮放率d;其次,在d的上下兩個(gè)不同分辨率紋素層級(jí)中分別讀取4個(gè)紋理坐標(biāo)并進(jìn)行雙線性濾波;最終,對(duì)兩個(gè)結(jié)果進(jìn)行加權(quán)。
3 紋理Cache的設(shè)計(jì)
3.1 紋理Cache電路
紋理Cache的硬件電路結(jié)構(gòu)如圖3所示,主要包括:LUT查找電路、地址判斷電路、標(biāo)記位比較電路、LRU替換電路、FIFO控制電路和輸出電路。
3.2 查找電路
查找電路負(fù)責(zé)計(jì)算雙線性濾波所需要的四個(gè)紋素在外存中的地址。通過查找表(Look Up Table,LUT)給出紋理圖像所在Mipmap金字塔中的層級(jí),將其輸出給地址判斷電路、標(biāo)記位比較電路、LRU替換電路和輸出電路。
在三線性濾波中,由紋素和像素的縮放率d可以得到兩個(gè)不同且相鄰Mipmap層的紋理圖像,即每個(gè)紋理圖像的基地址addr0是由紋理ID和Mipmap層共同決定的。本文中USP支持最大分辨率紋理圖像為1 024×1 024,對(duì)應(yīng)層級(jí)數(shù)為0,依據(jù)金字塔中每級(jí)的紋理圖像分辨率需要滿足2n×2n的大小,則層級(jí)數(shù)為1對(duì)應(yīng)的紋理圖像分辨率為512×512,以此類推。
3.3 地址判斷模塊
地址判斷模塊根據(jù)基地址信息,計(jì)算出雙線性濾波中另外三個(gè)紋素所在外存中基于基地址的偏移地址,并把整合后的四個(gè)紋素地址連續(xù)地輸出給標(biāo)記位比較電路和輸出電路。
本文最大支持1 024×1 024分辨率的紋理圖像,每個(gè)紋素按照RGBA8888格式存儲(chǔ),即32 bit。在紋理圖像中的偏移地址按照oa形式產(chǎn)生:
圖4表示使用MATLAB將一幅紋理圖像恢復(fù)成RGBA格式并存儲(chǔ)在外存中,比如大小為64×64,方格代表紋素在紋理圖像中的位置,數(shù)字代表紋素在內(nèi)存中的位置,對(duì)該層級(jí)分辨率紋理圖像進(jìn)行雙線性濾波時(shí),需要讀取2×2個(gè)紋素,如圖4中圈所示。假設(shè)Address表示外存中的地址,則另外3個(gè)紋素在外存中的地址分別為:
根據(jù)紋素在紋理圖像中的映射方式,提前進(jìn)行四紋素地址判斷有兩點(diǎn)優(yōu)勢(shì):
(1)例如圖4中1、2、8、9四個(gè)紋素地址分別為Address(0~3),其中1號(hào)紋素地址為給定的基地址,8號(hào)紋素地址通過偏移量可直接計(jì)算,2號(hào)和9號(hào)紋素的地址只是前兩個(gè)紋素地址各自加“1”,進(jìn)而在進(jìn)行標(biāo)記位存儲(chǔ)時(shí),只需存儲(chǔ)1號(hào)和8號(hào)的信息,減少了資源的浪費(fèi);
(2)根據(jù)標(biāo)記位比較電路的設(shè)計(jì),減少了檢測(cè)時(shí)間的消耗。
3.4 標(biāo)記位比較電路和LRU替換電路
標(biāo)記位比較模塊負(fù)責(zé)判斷四個(gè)紋素在紋理Cache中是否命中。為了滿足提高數(shù)據(jù)吞吐率,使用4端口紋理Cache,把256行的紋理Cache分成4個(gè)64行的單端口Cache(0~3)。在紋理貼圖中,分辨率小于32×32的紋理圖像相對(duì)使用較少,為了提高常用紋理圖像中紋素的命中率,可以把分辨率較小的紋理圖像的紋素單獨(dú)存儲(chǔ)在Cache3中,把分辨率較大的紋理圖像的紋素通過Address中的7、8位對(duì)四個(gè)Cache進(jìn)行選擇,從而在不命中的情況下,不會(huì)替換其余Cache中的塊。
文獻(xiàn)[7]指出紋理Cache大小為8 KB時(shí),可以達(dá)到很高的命中率,因此采用8 KB的存儲(chǔ)容量。在地址映射關(guān)系中,直接映射速度快,但對(duì)存儲(chǔ)空間的利用率低;全相聯(lián)映射與直接映射相反,進(jìn)而在地址映射上,選擇折中的組相聯(lián)映射方式。本文采用4路組相聯(lián),即將每個(gè)64行的Cache分為16組,其中每組分為4路,每行存儲(chǔ)8個(gè)紋素,大小為32 B。
如果對(duì)一個(gè)Cache某組中的4路進(jìn)行tag位檢測(cè),會(huì)花費(fèi)1~4拍,影響吞吐率。將每組中的第一路組成tag_ram0,以此類推,第四路組成tag_ram3。如圖5所示,則:
(1)當(dāng)讀取分辨率較小的紋理圖像時(shí),只在Cache3中進(jìn)行tag位檢索,需要2拍完成;
(2)當(dāng)讀取分辨率較大的紋理圖像時(shí),通過地址選擇Cache,在Address[7:8]都為0的情況下,tag檢測(cè)需2拍;
(3)在Address[7:8]不都為0的情況下,tag檢測(cè)只需1拍。
LRU替換電路主要負(fù)責(zé)在讀不命中情況下,判斷Cache組中需要被替換的路。采用最近最少使用算法(Least Recently Used,LRU)。
3.5 FIFO控制電路
為滿足USP高處理速度,紋理Cache的讀取速度不僅體現(xiàn)在命中率、多端口上,更多地時(shí)間消耗在與外存間的數(shù)據(jù)交互中。因此,如果能夠提前將未命中且待讀取的數(shù)據(jù)提前放在片內(nèi),將會(huì)顯著提高吞吐率。
紋理Cache中對(duì)標(biāo)記位檢索可以有較高的處理速度,因此如圖6所示,在紋理Cache上建立一個(gè)標(biāo)記位FIFO和一個(gè)數(shù)據(jù)buffer或FIFO,由于四紋素的地址已經(jīng)提前計(jì)算出,返回?cái)?shù)據(jù)和請(qǐng)求數(shù)據(jù)發(fā)出的先后順序是一致的,所以本文可以使用Data_fifo來代替buffer,分別用于存儲(chǔ)未命中地址和待讀取數(shù)據(jù)的提前存儲(chǔ)。
在標(biāo)記位FIFO有未命中地址寫入時(shí),F(xiàn)IFO控制器直接向外存發(fā)送讀請(qǐng)求地址,并寫入到Data_fifo中。因?yàn)槊新屎虳ata_fifo深度為反相關(guān)關(guān)系,所以Data_fifo深度不大,當(dāng)其寫滿時(shí),把到達(dá)FIFO頭部的數(shù)據(jù)開始寫入Cache_ram對(duì)應(yīng)行中,并讀出。
紋理Cache流水線暫停的條件是:tag_fifo被寫滿,發(fā)送stop信號(hào)給USP,在全部處理完后,再發(fā)送begin信號(hào),啟動(dòng)流水線。其中tag_fifo與Data_fifo深度一樣。
3.6 地址判斷電路
輸出電路負(fù)責(zé)與外存和USP間的數(shù)據(jù)交互及紋理Cache中RAM的更新。其存儲(chǔ)方式與3.4節(jié)中討論相同。
在讀全部命中時(shí),直接讀取數(shù)據(jù)給USP;在有不命中時(shí),即使有命中的紋素也暫停等待Data_fifo深度被寫滿,然后接收FIFO數(shù)據(jù)更新RAM,并讀出數(shù)據(jù)。
4 實(shí)驗(yàn)結(jié)果
4.1 測(cè)試平臺(tái)的搭建
本文的測(cè)試平臺(tái)使用SV進(jìn)行搭建,如圖7所示,該平臺(tái)主要包括:generator(激勵(lì)模塊)、driver(驅(qū)動(dòng)模塊)、dut(RTL級(jí)代碼)、reference_model(參考模塊)、monitor(監(jiān)視模塊)、scoreboard(比較模板模塊)。
驗(yàn)證平臺(tái)描述:激勵(lì)模塊主要用來模擬產(chǎn)生USP發(fā)送的讀請(qǐng)求地址,給出地址大小區(qū)間,并在該區(qū)間內(nèi)隨機(jī)循環(huán)產(chǎn)生地址輸出到驅(qū)動(dòng)模塊;驅(qū)動(dòng)模塊將輸入的地址分別輸出到dut和參考模塊,其中dut是紋理Cache的RTL級(jí)代碼部分,參考模塊通過平臺(tái)與C參考模型接口,把地址送入模型中計(jì)算,并通過接口輸出到平臺(tái);監(jiān)視模塊監(jiān)視整個(gè)測(cè)試過程中的信號(hào);比較模板模塊把從參考模塊輸入的數(shù)據(jù)和監(jiān)視模塊輸入的數(shù)據(jù)進(jìn)行比較,相同則表示“success”,并把次數(shù)自增加“1”,不同則表示“fail”,并使次數(shù)不變。
4.2 性能分析
首先編寫幾種典型的測(cè)試機(jī)理,通過EDA工具對(duì)RTL級(jí)設(shè)計(jì)進(jìn)行功能仿真,在測(cè)試激勵(lì)仿真正確后,將代碼加入測(cè)試平臺(tái)中,進(jìn)行平臺(tái)測(cè)試。最終與USP IP及Xilinx定制存儲(chǔ)器IP互聯(lián),使用Xilinx的ZYNQ-7系列xz7z045ffg900開發(fā)板進(jìn)行硬件測(cè)試。圖8所示為硬件平臺(tái)中USP IP與本文設(shè)計(jì)的紋理Cache IP的互聯(lián),并將恢復(fù)出的紋理圖像通過驅(qū)動(dòng)HDMI顯示出來。圖9是測(cè)試場(chǎng)景渲染圖。
通過Xilinx的Vivado對(duì)設(shè)計(jì)進(jìn)行綜合,綜合資源結(jié)果如表1所示。
本文從接收到讀地址到發(fā)送紋素給USP的拍數(shù)如表2所示。
在讀命中時(shí),如果紋素存儲(chǔ)在同一單端口Cache中,需3拍讀出4個(gè)紋素;如果紋素兩兩存儲(chǔ)在不同Cache中,只需2拍讀出。在讀不命中時(shí),當(dāng)緩沖區(qū)已經(jīng)寫入未命中數(shù)據(jù),則只需6或7拍即可,因?yàn)橛蠧ache號(hào)的問題;當(dāng)緩沖區(qū)為空,則只能讀取外存紋素先寫滿FIFO,需35或36拍完成。
通過MATLAB將20幅紋理圖像恢復(fù)成RGBA格式存儲(chǔ),用generator模塊產(chǎn)生地址測(cè)試,驗(yàn)證結(jié)果為平均命中率可以達(dá)到92.5%左右。吞吐率相比單端口Cache提升了將近4倍,相比于文獻(xiàn)[8]中的平均像素生產(chǎn)率0.1 pixel/clock,提高了8倍左右。表3是實(shí)驗(yàn)數(shù)據(jù),表4是命中率比較。
本文設(shè)計(jì)的紋理Cache應(yīng)用預(yù)存塊,減少了流水線停頓;使用4端口結(jié)構(gòu),消除了Cache同步問題,顯著提高吞吐率;結(jié)合Mipmap算法特點(diǎn),提前計(jì)算出四紋素的外存地址,根據(jù)紋理圖像的層級(jí)大小,選擇Cache進(jìn)行紋素的存放。本文相比于文獻(xiàn)[9]平均命中率有所提高;相比于文獻(xiàn)[10]對(duì)于最大分辨率1 024×1 024的紋理圖像命中率有所提升。
5 結(jié)論
為了滿足統(tǒng)一架構(gòu)染色器對(duì)吞吐率的要求,結(jié)合雙線性濾波算法的特點(diǎn),本文設(shè)計(jì)實(shí)現(xiàn)了一種紋理Cache的電路結(jié)構(gòu),并通過測(cè)試平臺(tái)及Xilinx的FPGA開發(fā)板進(jìn)行硬件測(cè)試。通過層級(jí)選擇紋素在Cache中的存儲(chǔ)方式,提高對(duì)相同紋理圖像不同分辨率讀取的命中率;FIFO緩沖區(qū)和4端口結(jié)構(gòu)的設(shè)計(jì),提高了Cache的吞吐率及降低流水線停頓。根據(jù)測(cè)試結(jié)果表明,本文提出的紋理Cache性能良好。
參考文獻(xiàn)
[1] 焦繼業(yè),李濤,杜慧敏,等.移動(dòng)圖形處理器的現(xiàn)狀、技術(shù)及其發(fā)展[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2015(6):1005-1016.
[2] CHOUDHARY V,KUMAR P,BHATTACHARYA T K,et al.Alternative geospatial data handling and augmented reality[C].IGN e.V. a BOW,2008.
[3] ANTOCHI I,JUURLINK B,VASSILIADIS S,et al.Memory bandwidth requirements of tile-based rendering[M].Computer Systems:Architectures,Modeling,and Simulation.Springer Berlin Heidelberg,2004:323-332.
[4] JAKO B.Hardware accelerated hybrid rendering on PowerVR GPUs[C].IEEE,Jubilee International Conference on Intelligent Engineering Systems.IEEE,2016:257-262.
[5] JUURLINK B,ANTOCHI I,DAN C,et al.GRAAL:a framework for low-power 3d graphics accelerators[J].IEEE Computer Graphics & Applications,2008,28(4):63-73.
[6] 許強(qiáng),陳杰,劉建,等.一種適用于嵌入式圖形處理器的多端口紋理Cache的設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2013(11):27-30.
[7] LIOU J Y,CHEN C H.Re-visit blocking texture cache design for modern GPU[C].SoC Design Conference.IEEE,2015.
[8] 程龍,郭立,史鴻聲.一種紋理映射算法的FPGA實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2009,30(9):1855-1859.
[9] 許強(qiáng),陳杰,劉建,等.一種適用于嵌入式圖形處理器的多端口紋理Cache的設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2013(11):27-30.
[10] MISAKI Y,INO F,HAGIHARA K.Cache-aware,in-place rotation method for texture-based volume rendering[J].IEICE Transactions on Information & Systems,2017,100(3):452-461.
作者信息:
韓孟橋1,蔣 林2,楊博文1,山 蕊1,耿玉榮3
(1.西安郵電大學(xué) 電子工程學(xué)院,陜西 西安710121;
2.西安科技大學(xué) 集成電路設(shè)計(jì)實(shí)驗(yàn)室,陜西 西安710054;
3.西安郵電大學(xué) 計(jì)算機(jī)學(xué)院,陜西 西安710121)