文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.182489
中文引用格式: 韓孟橋,蔣林,楊博文,等. 移動圖形處理器的紋理Cache設計[J].電子技術應用,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 引言
隨著手機、PAD等移動設備進一步普及,對3D圖形繪制的需求也越來越大。桌面GPU相較于移動GPU,其渲染流程簡單直接、數據吞吐率高,進而帶寬需求高,功耗大。文獻[1]指出相比于集成電路按照摩爾定律的發展速度,電池供電技術發展得緩慢得多,移動設備最基本的問題是電池供電。在移動設備中,由于圖形應用于液晶顯示器上,因此圖形渲染時系統功耗大,軟件的優化是有限的,所以對硬件的低功耗設計是研究的重點,進而達到移動設備在低帶寬功耗的條件下實現較高性能的渲染效果。
紋理映射是紋理空間與像素空間相互映射的過程,在對紋理圖形進行放大或縮小時,會出現單紋素對應多像素或多紋素對應單像素的情況,造成紋理走樣的現象。因此,行業內權威共同制定了適用于嵌入式的3D圖形標準OpenGL ES[2],其使用各向同性濾波方式。該方式中的最近鄰點采樣濾波因沒有考慮到紋理映射的范圍,容易產生鋸齒現象;該方式中的雙線性濾波雖然有效地減少了鋸齒問題,但容易造成模糊現象;該方式中的Mipmap濾波是經典的映射方法;最后的三線性濾波是對Mipmap濾波的優化,所以本文選擇了三線性濾波。因為雙線性濾波是對鄰近d的一層紋理圖像中相鄰的四個紋素位置進行采樣,三線性濾波是對鄰近d的兩層紋理圖像分別進行雙線性濾波,并將兩層的雙線性濾波加權,進而雙線性濾波是三線性濾波的簡化,本文以下用雙線性進行說明。
紋理訪存是影響像素處理器速率的關鍵,同樣也是移動GPU整體性能的瓶頸。加上片上紋理高速緩沖存儲器,建立關于紋素的片上L1緩存,有效降低了移動GPU與外存間的數據帶寬。紋理Cache與普通Cache的不同:首先,紋理Cache為只讀,區別于普通Cache的寫數據和寫回功能;其次,紋理Cache的吞吐率同移動GPU整體性能結合緊密,本文結合雙線性濾波需要四紋素的特點,使用4端口Cache。紋理Cache是流水線形式,本文使用FIFO控制器控制FIFO緩沖區預存塊的讀寫,減少了移動GPU流水線的停頓。
1 基于Tile-based的移動圖形處理架構
Imagnination公司PowerVR系列產品的移動GPU采用文獻[3]提出的TBR(Tile Based Rendering)渲染模式,在幾何運算后將屏幕像素點劃分為多個Tile,并在像素處理器中逐Tile進行渲染。相比于適用于桌面圖形處理器的立即渲染模式(Immediate Mode Rendering,IMR),TBR渲染模式在執行光柵化和圖元操作時可以將每個Tile上所有的深度及顏色等信息都存在片上,顯著降低了存儲帶寬。文獻[4]指出移動GPU主要的功耗來源于訪問片外存儲,所以TBR模式適用于移動圖形處理器。圖1為本文移動圖形處理器的體系結構。
整個移動GPU采用了統一架構,即幾何變換操作、頂點坐標的光照計算和著色渲染都在統一渲染染色器(Unified Shading Processor,USP)中完成;屏幕坐標產生單元(Screen-coordinate Generating Unit,SGU)完成幾何處理后頂點的圖元裝配、裁剪、背面剔除等操作,轉換到屏幕空間;后續模塊為覆蓋率計算、中間數據緩存建立等;最終通過深度測試輸出給幀緩存。TBR渲染模式中,Tile的大小有8×8、16×16、32×32等多種劃分方式,文獻[5]指出當Tile大小為8×8時,紋理Cache的性能可以達到最優,但從移動GPU整體性能方面考慮,一般應采用Antoeh[6]建議的32×32大小的Tile。
2 紋理濾波
紋理映射是將二維圖像投影到屏幕的三角形上,在移動GPU中,這一過程是逆向處理的,即對每個在屏幕上的像素點,計算其對應于二維圖像中的紋理坐標。但屏幕空間對應到紋理空間時,不一定恰好對應到一個紋素,而是對應到紋理空間中某個區域,這時就需要對該區域中的紋素進行加權計算,這就是濾波。
Lance Willams提出了一種目前幾乎所有圖形硬件都會支持的濾波方法,即Mipmap濾波技術。圖2(a)所示為Miapmap金字塔,其核心內容如圖2(b)所示,將不同分辨率的紋理存儲在外存中。在映射時,根據紋素與像素的縮放率d,選擇適合的層級,對于較小的多邊形映射,可以有效降低紋理走樣的出現。
在Mipmap濾波的基礎上,進一步提出了三線性濾波,顯著降低了走樣現象的產生。首先,計算縮放率d;其次,在d的上下兩個不同分辨率紋素層級中分別讀取4個紋理坐標并進行雙線性濾波;最終,對兩個結果進行加權。
3 紋理Cache的設計
3.1 紋理Cache電路
紋理Cache的硬件電路結構如圖3所示,主要包括:LUT查找電路、地址判斷電路、標記位比較電路、LRU替換電路、FIFO控制電路和輸出電路。
3.2 查找電路
查找電路負責計算雙線性濾波所需要的四個紋素在外存中的地址。通過查找表(Look Up Table,LUT)給出紋理圖像所在Mipmap金字塔中的層級,將其輸出給地址判斷電路、標記位比較電路、LRU替換電路和輸出電路。
在三線性濾波中,由紋素和像素的縮放率d可以得到兩個不同且相鄰Mipmap層的紋理圖像,即每個紋理圖像的基地址addr0是由紋理ID和Mipmap層共同決定的。本文中USP支持最大分辨率紋理圖像為1 024×1 024,對應層級數為0,依據金字塔中每級的紋理圖像分辨率需要滿足2n×2n的大小,則層級數為1對應的紋理圖像分辨率為512×512,以此類推。
3.3 地址判斷模塊
地址判斷模塊根據基地址信息,計算出雙線性濾波中另外三個紋素所在外存中基于基地址的偏移地址,并把整合后的四個紋素地址連續地輸出給標記位比較電路和輸出電路。
本文最大支持1 024×1 024分辨率的紋理圖像,每個紋素按照RGBA8888格式存儲,即32 bit。在紋理圖像中的偏移地址按照oa形式產生:
圖4表示使用MATLAB將一幅紋理圖像恢復成RGBA格式并存儲在外存中,比如大小為64×64,方格代表紋素在紋理圖像中的位置,數字代表紋素在內存中的位置,對該層級分辨率紋理圖像進行雙線性濾波時,需要讀取2×2個紋素,如圖4中圈所示。假設Address表示外存中的地址,則另外3個紋素在外存中的地址分別為:
根據紋素在紋理圖像中的映射方式,提前進行四紋素地址判斷有兩點優勢:
(1)例如圖4中1、2、8、9四個紋素地址分別為Address(0~3),其中1號紋素地址為給定的基地址,8號紋素地址通過偏移量可直接計算,2號和9號紋素的地址只是前兩個紋素地址各自加“1”,進而在進行標記位存儲時,只需存儲1號和8號的信息,減少了資源的浪費;
(2)根據標記位比較電路的設計,減少了檢測時間的消耗。
3.4 標記位比較電路和LRU替換電路
標記位比較模塊負責判斷四個紋素在紋理Cache中是否命中。為了滿足提高數據吞吐率,使用4端口紋理Cache,把256行的紋理Cache分成4個64行的單端口Cache(0~3)。在紋理貼圖中,分辨率小于32×32的紋理圖像相對使用較少,為了提高常用紋理圖像中紋素的命中率,可以把分辨率較小的紋理圖像的紋素單獨存儲在Cache3中,把分辨率較大的紋理圖像的紋素通過Address中的7、8位對四個Cache進行選擇,從而在不命中的情況下,不會替換其余Cache中的塊。
文獻[7]指出紋理Cache大小為8 KB時,可以達到很高的命中率,因此采用8 KB的存儲容量。在地址映射關系中,直接映射速度快,但對存儲空間的利用率低;全相聯映射與直接映射相反,進而在地址映射上,選擇折中的組相聯映射方式。本文采用4路組相聯,即將每個64行的Cache分為16組,其中每組分為4路,每行存儲8個紋素,大小為32 B。
如果對一個Cache某組中的4路進行tag位檢測,會花費1~4拍,影響吞吐率。將每組中的第一路組成tag_ram0,以此類推,第四路組成tag_ram3。如圖5所示,則:
(1)當讀取分辨率較小的紋理圖像時,只在Cache3中進行tag位檢索,需要2拍完成;
(2)當讀取分辨率較大的紋理圖像時,通過地址選擇Cache,在Address[7:8]都為0的情況下,tag檢測需2拍;
(3)在Address[7:8]不都為0的情況下,tag檢測只需1拍。
LRU替換電路主要負責在讀不命中情況下,判斷Cache組中需要被替換的路。采用最近最少使用算法(Least Recently Used,LRU)。
3.5 FIFO控制電路
為滿足USP高處理速度,紋理Cache的讀取速度不僅體現在命中率、多端口上,更多地時間消耗在與外存間的數據交互中。因此,如果能夠提前將未命中且待讀取的數據提前放在片內,將會顯著提高吞吐率。
紋理Cache中對標記位檢索可以有較高的處理速度,因此如圖6所示,在紋理Cache上建立一個標記位FIFO和一個數據buffer或FIFO,由于四紋素的地址已經提前計算出,返回數據和請求數據發出的先后順序是一致的,所以本文可以使用Data_fifo來代替buffer,分別用于存儲未命中地址和待讀取數據的提前存儲。
在標記位FIFO有未命中地址寫入時,FIFO控制器直接向外存發送讀請求地址,并寫入到Data_fifo中。因為命中率和Data_fifo深度為反相關關系,所以Data_fifo深度不大,當其寫滿時,把到達FIFO頭部的數據開始寫入Cache_ram對應行中,并讀出。
紋理Cache流水線暫停的條件是:tag_fifo被寫滿,發送stop信號給USP,在全部處理完后,再發送begin信號,啟動流水線。其中tag_fifo與Data_fifo深度一樣。
3.6 地址判斷電路
輸出電路負責與外存和USP間的數據交互及紋理Cache中RAM的更新。其存儲方式與3.4節中討論相同。
在讀全部命中時,直接讀取數據給USP;在有不命中時,即使有命中的紋素也暫停等待Data_fifo深度被寫滿,然后接收FIFO數據更新RAM,并讀出數據。
4 實驗結果
4.1 測試平臺的搭建
本文的測試平臺使用SV進行搭建,如圖7所示,該平臺主要包括:generator(激勵模塊)、driver(驅動模塊)、dut(RTL級代碼)、reference_model(參考模塊)、monitor(監視模塊)、scoreboard(比較模板模塊)。
驗證平臺描述:激勵模塊主要用來模擬產生USP發送的讀請求地址,給出地址大小區間,并在該區間內隨機循環產生地址輸出到驅動模塊;驅動模塊將輸入的地址分別輸出到dut和參考模塊,其中dut是紋理Cache的RTL級代碼部分,參考模塊通過平臺與C參考模型接口,把地址送入模型中計算,并通過接口輸出到平臺;監視模塊監視整個測試過程中的信號;比較模板模塊把從參考模塊輸入的數據和監視模塊輸入的數據進行比較,相同則表示“success”,并把次數自增加“1”,不同則表示“fail”,并使次數不變。
4.2 性能分析
首先編寫幾種典型的測試機理,通過EDA工具對RTL級設計進行功能仿真,在測試激勵仿真正確后,將代碼加入測試平臺中,進行平臺測試。最終與USP IP及Xilinx定制存儲器IP互聯,使用Xilinx的ZYNQ-7系列xz7z045ffg900開發板進行硬件測試。圖8所示為硬件平臺中USP IP與本文設計的紋理Cache IP的互聯,并將恢復出的紋理圖像通過驅動HDMI顯示出來。圖9是測試場景渲染圖。
通過Xilinx的Vivado對設計進行綜合,綜合資源結果如表1所示。
本文從接收到讀地址到發送紋素給USP的拍數如表2所示。
在讀命中時,如果紋素存儲在同一單端口Cache中,需3拍讀出4個紋素;如果紋素兩兩存儲在不同Cache中,只需2拍讀出。在讀不命中時,當緩沖區已經寫入未命中數據,則只需6或7拍即可,因為有Cache號的問題;當緩沖區為空,則只能讀取外存紋素先寫滿FIFO,需35或36拍完成。
通過MATLAB將20幅紋理圖像恢復成RGBA格式存儲,用generator模塊產生地址測試,驗證結果為平均命中率可以達到92.5%左右。吞吐率相比單端口Cache提升了將近4倍,相比于文獻[8]中的平均像素生產率0.1 pixel/clock,提高了8倍左右。表3是實驗數據,表4是命中率比較。
本文設計的紋理Cache應用預存塊,減少了流水線停頓;使用4端口結構,消除了Cache同步問題,顯著提高吞吐率;結合Mipmap算法特點,提前計算出四紋素的外存地址,根據紋理圖像的層級大小,選擇Cache進行紋素的存放。本文相比于文獻[9]平均命中率有所提高;相比于文獻[10]對于最大分辨率1 024×1 024的紋理圖像命中率有所提升。
5 結論
為了滿足統一架構染色器對吞吐率的要求,結合雙線性濾波算法的特點,本文設計實現了一種紋理Cache的電路結構,并通過測試平臺及Xilinx的FPGA開發板進行硬件測試。通過層級選擇紋素在Cache中的存儲方式,提高對相同紋理圖像不同分辨率讀取的命中率;FIFO緩沖區和4端口結構的設計,提高了Cache的吞吐率及降低流水線停頓。根據測試結果表明,本文提出的紋理Cache性能良好。
參考文獻
[1] 焦繼業,李濤,杜慧敏,等.移動圖形處理器的現狀、技術及其發展[J].計算機輔助設計與圖形學學報,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] 許強,陳杰,劉建,等.一種適用于嵌入式圖形處理器的多端口紋理Cache的設計[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實現[J].小型微型計算機系統,2009,30(9):1855-1859.
[9] 許強,陳杰,劉建,等.一種適用于嵌入式圖形處理器的多端口紋理Cache的設計[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.西安郵電大學 電子工程學院,陜西 西安710121;
2.西安科技大學 集成電路設計實驗室,陜西 西安710054;
3.西安郵電大學 計算機學院,陜西 西安710121)