文獻(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圖形繪制的需求也越來(lái)越大,。桌面GPU相較于移動(dòng)GPU,,其渲染流程簡(jiǎn)單直接、數(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)而雙線性濾波是三線性濾波的簡(jiǎn)化,本文以下用雙線性進(jìn)行說(shuō)明,。
紋理訪存是影響像素處理器速率的關(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主要的功耗來(lái)源于訪問片外存儲(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來(lái)代替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ì)模塊主要用來(lái)模擬產(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顯示出來(lái)。圖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)