鄭新建,龍 強(qiáng),王 維
(1.航空工業(yè)西安航空計(jì)算技術(shù)研究所,陜西 西安 710068;2.集成電路與微系統(tǒng)設(shè)計(jì)航空科技重點(diǎn)實(shí)驗(yàn)室,陜西 西安 710068)
計(jì)算機(jī)圖形學(xué)越來越廣泛地應(yīng)用于游戲、電影和虛擬現(xiàn)實(shí)等領(lǐng)域[1],通過紋理映射技術(shù)可以模擬景物表面豐富的細(xì)節(jié),提高計(jì)算機(jī)生成圖形真實(shí)感[2-3]。紋理映射首先在一個紋理存儲空間中制作紋理圖像,然后確定三維物體表面的點(diǎn)與紋理空間中點(diǎn)的映射關(guān)系,按一定的算法將紋理空間的紋理圖案映射到三維物體上。
紋理映射能用較少的計(jì)算代價獲得很強(qiáng)的真實(shí)感,但紋理需要大量的內(nèi)存存儲,且貼圖過程需要很高的存儲訪問帶寬?,F(xiàn)代圖形處理器內(nèi)部一般通過紋理Cache系統(tǒng)來解決紋理帶寬問題[4]。Hakura研究了各種不同的Cache結(jié)構(gòu)對于紋理過濾的局部性的利用[5],Cox等研究多級紋理Cache對紋理貼圖性能的提升[6]。而現(xiàn)代圖形處理器為提升繪圖性能往往采用并行的光柵化染色流水線,對于紋理的帶寬需求進(jìn)一步增加,本文以HKM96設(shè)計(jì)的基于Quad的二維光柵化染色流水線設(shè)計(jì)實(shí)現(xiàn)了一種多端口非阻塞的高效二維紋理Cache,能夠以較少的硬件資源提供染色流水線所需的紋理訪問帶寬。
紋理貼圖的過程中三維圖形上的像素點(diǎn)與紋素圖像上的點(diǎn)位置并不是完全一致的,當(dāng)紋理圖像大于三維圖形表面時,則需要將一個紋素映射到許多像素上,當(dāng)紋理圖像小于三維圖形表面時,需要將多個紋素映射到一個像素上,這時需要在貼圖時通過紋理過濾進(jìn)行平滑處理。紋理過濾按照采樣模式可以分為點(diǎn)采樣、線性采樣、雙線性采樣和三線性采樣等[7]。
點(diǎn)采樣一般指鄰近點(diǎn)采樣,對于每個像素點(diǎn)取其位置上最相近的紋素點(diǎn)進(jìn)行貼圖。當(dāng)紋理圖像大小與三維圖形相仿時使用點(diǎn)采樣能夠取得最快的效率,如果二者大小不等,則會出現(xiàn)貼圖的模糊。紋理坐標(biāo)(s,t)計(jì)算后得到浮點(diǎn)型紋素地址(tx,ty)后,通過式(1)確定紋素的整數(shù)坐標(biāo)(ix,iy),即
(ix,iy)=(?tx+0.5」,?ty+0.5」)。
(1)
線性采樣時一個像素需要相鄰的2個紋素點(diǎn)進(jìn)行加權(quán)平均,線性采樣時第1個紋素地址計(jì)算為:
(ix0,iy0)=(?tx」,?ty」),
(2)
另外一個紋素地址為(ix0+1,iy0)。
當(dāng)進(jìn)行二維紋理貼圖時,也就是雙線性采樣,對靠近像素中心點(diǎn)的2×2的4個紋素進(jìn)行加權(quán)平均。雙線性采樣是紋理貼圖中最常用的過濾模式,一般圖形處理器內(nèi)部會有專門的硬件支持雙線性的插值計(jì)算。雙線性采樣時第一個紋素地址計(jì)算為:
(ix0,iy0)=(?tx」,?ty」),
(3)
其余紋素地址分別為(ix0+1,iy0),(ix0+1,iy0+1),(ix0,iy0+1)。
當(dāng)進(jìn)行三維紋理貼圖或Cube紋理貼圖時進(jìn)行線性采樣,或二維紋理貼圖時開啟了Mipmap過濾進(jìn)行線性采樣時,一個像素點(diǎn)的紋素值需要通過8個三維空間上相鄰的點(diǎn)或2個相鄰Mip層上各4個平面相鄰的點(diǎn)進(jìn)行過濾,此時就是三線性采樣模式。三線性采樣時第一個紋素地址計(jì)算如式(4)所示,其中Z坐標(biāo)為三維紋理深度坐標(biāo)或Cube紋理的面坐標(biāo)或MipMap層編號,即
(ix0,iy0,iz0)=(?tx」,?ty」,?tz」),
(4)
其余紋素地址分別為:
(ix0+1,iy0,iz0),(ix0+1,iy0+1,iz0),(ix0+1,iy0+1,iz0+1),(ix0+1,iy0,iz0+1),(ix0,iy0+1,iz0),(ix0,iy0+1,iz0+1),(ix0,iy0,iz0+1)。
為提高性能,現(xiàn)代圖形處理器一般采用并行的光柵化,如文獻(xiàn)[8-9]所述基于Quad的光柵化染色,染色器同時對一個2×2的Quad進(jìn)行染色,同樣對于紋理貼圖也是以Quad為單位進(jìn)行處理的。
當(dāng)進(jìn)行并行紋理貼圖時,紋理Cache系統(tǒng)需要能夠同時響應(yīng)多個紋理訪問請求,對于紋理之間及壓縮紋理之間的相關(guān)性研究是規(guī)避Cache訪問沖突的基礎(chǔ)。紋理陣列按Quad進(jìn)行紋理采樣,一個Quad為2×2相鄰的4個像素,采用臨近采樣時,一個Quad的紋理請求地址如圖1(a)所示,所需紋素地址為:
C0(i,j),C1(i+1,j),C3(i,j+1),C2(i+1,j+1)。
采用線性采樣時,一個Quad的紋理請求地址如圖1(b)所示,所需紋素地址為:
C0(i,j),C1(i+1,j),C4(i+2,j),C3(i,j+1),
C2(i+1,j+1),C5(i+2,j+1)。
采用雙線性采樣時,一個Quad的紋理請求地址如圖1(c)所示,紋素地址為:
C6(i,j),C7(i+1,j),C8(i+2,j),C0(i,j+1),
C1(i+1,j+1),C4(i+2,j+1),C3(i,j+2),
C2(i+1,j+2),C5(i+2,j+2)。
采用三線性采樣時,一個Quad的紋理請求可以按第三維坐標(biāo)的不同(第三維坐標(biāo)來自Z坐標(biāo)或Mip層編號)劃分為2次雙線性采樣,紋素訪問如圖1(d)所示。從L1 Cache的角度看來,只是接收了2次雙線性采樣時的Quad紋理請求,不需要特殊處理。
圖1 基于Quad的紋理過濾訪問地址
存儲帶寬的降低主要依靠紋理Cache及其壓縮算法,紋理Cache設(shè)計(jì)時相聯(lián)度、塊大小和Cache容量等都影響系統(tǒng)的性能。通用的Cache不能很好地滿足紋理采樣的需求,趙國宇等提出了一種可動態(tài)配置的紋理Cache結(jié)構(gòu),在進(jìn)行點(diǎn)采樣時使用直接映射方式,進(jìn)行雙線性插值時使用2路相聯(lián)模式,進(jìn)行三線性插值時采用4路相聯(lián)模式,以增加Cache的利用率[8],該方法能夠一定程度地規(guī)避訪問沖突,提高命中率,但作用有限。
針對紋理應(yīng)用最常用的雙線性紋理過濾模式進(jìn)行優(yōu)化,最簡單的設(shè)計(jì)方式是采用一個單端口Cache,每次訪問可獲取一個紋素,那么1個片段的紋理過濾就需要4次Cache訪問,對于按2×2的Quad進(jìn)行紋理貼圖的染色器來說16次紋理Cache的訪問才能夠獲取到所需的紋素。按照帶寬最優(yōu)的設(shè)計(jì)是為每個紋素設(shè)計(jì)一個獨(dú)立的紋理Cache,對于按2×2的Quad進(jìn)行紋理貼圖的染色器來說可設(shè)計(jì)4個或16個紋理Cache,一次訪問可獲取4個紋素或16個紋素,這種完全并行的訪問可以規(guī)避紋理訪問的沖突,提供最大的帶寬,但由于所有紋素需要映射到多個Cache中,Cache的利用率非常低,這對于片上有限的SRAM資源來說是不可接受的[10-11]。
基于對Quad的紋素采樣地址的分析,采用多端口多Bank的紋理Cache可以提供很好的存儲訪問高帶寬,并且Cache的利用率也能達(dá)到最優(yōu)。根據(jù)光柵化的特征,紋理訪問可以是亂序完成的,也就是說當(dāng)某一個Quad的紋素的Cache訪問發(fā)生了缺失時,后續(xù)的紋素Quad可以繼續(xù)進(jìn)行貼圖,所以紋理Cache的設(shè)計(jì)應(yīng)該支持非阻塞的特性。本文設(shè)計(jì)的多端口多Bank非阻塞紋理一級Cache如圖2所示。
圖2 一種多端口非阻塞高效二維紋理Cache總體結(jié)構(gòu)
進(jìn)行雙線性采樣時紋理地址生成單元一次生成一個Quad的4個片段所需的16個紋素地址,由沖突檢測及合并,按照二維紋理雙線性訪問時的紋素地址特性將16個紋素請求合并為9個請求后,送到9端口的一級紋理Cache內(nèi)核進(jìn)行訪問,如果當(dāng)前訪問發(fā)生缺失則由非阻塞單元進(jìn)行缺失處理,在紋理一級Cache和DDR存儲器之間還增加了二級紋理Cache的設(shè)計(jì)以減輕DDR的負(fù)載,加快紋素獲取速度。
紋理數(shù)據(jù)訪問時的特征會極大地影響Cache的命中率,如果紋理Cache中按行線性存儲一幅圖像的紋素,那么Cache中會一次取進(jìn)水平的一行較長的數(shù)據(jù),當(dāng)紋素訪問落在同一行時會有較高的命中率,當(dāng)紋素訪問在多行時就會發(fā)生多次缺失。由于基于Quad的光柵化染色決定了紋理貼圖時是二維上相鄰紋素會被連續(xù)訪問,紋理Cache采用二維格式存儲。紋素圖像不論是一維、二維還是三維紋素圖像,在DDR中都是采用二維格式存儲,對于一維紋素圖像設(shè)置其存儲高度為1,對于三維紋素圖像則按照深度將其劃分為多幅二維紋素圖像存儲。
采用二維格式存儲的紋理Cache使用其二維坐標(biāo)進(jìn)行訪問,如果當(dāng)前紋素請求的二維坐標(biāo)在紋理Cache的Tag中存儲,則當(dāng)前紋素發(fā)生命中,否則當(dāng)紋素發(fā)生缺失時,以當(dāng)前紋素的坐標(biāo)為地址從下一級存儲器中取回二維空間上相鄰的一整塊紋素?cái)?shù)據(jù)。紋理Cache的一個Block的數(shù)據(jù)存儲內(nèi)容如圖3所示。
圖3 L1 Cache的Block及Bank劃分
為了能夠同時提供4個紋理請求的16個紋素(理論上L1同時能夠最大支持雙線性過濾模式的4個紋理單元的16個請求),Cache設(shè)計(jì)上應(yīng)該為16個端口,每個端口對應(yīng)于一個紋素。但多端口的Cache設(shè)計(jì)時,每個端口都需要設(shè)計(jì)一套獨(dú)立的Tag存儲和比較邏輯,輸出選擇邏輯。端口數(shù)越多設(shè)計(jì)會越復(fù)雜。通過基于Quad的紋理過濾訪問地址分析可知大多數(shù)情況下,16個請求可以合并為空間上相鄰的9個紋素的請求,為了減少端口數(shù)目、簡化設(shè)計(jì),L1紋理Cache設(shè)計(jì)為9個端口,16個請求可以先進(jìn)行合并后發(fā)送到9個端口進(jìn)行訪問,獲得輸出數(shù)據(jù)再根據(jù)合并情況發(fā)射到16個端口上。如果16個請求不能合并到9個端口,則需要hold住流水線先發(fā)送9個不沖突的請求,剩余請求下一拍發(fā)送。
多端口Cache是指多套的Tag及比較電路、輸出控制電路,可以實(shí)現(xiàn)多個訪問請求同時訪問Cache。L1紋理Cache設(shè)計(jì)上使用9個端口設(shè)計(jì),根據(jù)地址相關(guān)性分析,可最多對應(yīng)于地址合并前的16個紋素請求。
多Bank是指Cache的DataRam分為多個物理上獨(dú)立的存儲體,可以分開訪問以減少多端口訪問時的沖突。L1紋理Cache設(shè)計(jì)為全相聯(lián)結(jié)構(gòu),分為16個Bank,使用紋素地址的橫坐標(biāo)i和縱坐標(biāo)j地址的低2 bit組成4 bit的Bank地址。紋理Cache的Block大小設(shè)定為8×8的二維紋素塊大小,L1 Cache的Block及Bank劃分如圖3所示,可以保證同一個Quad所需的16個紋素請求落到物理上16個不同的SRAM上,不會產(chǎn)生Bank沖突。
并行光柵化過程中,同一個紋理流水線處理的圖像Quad之間處理順序沒有相關(guān)性,當(dāng)某個Quad所需16個紋素中有某些紋素在Cache中發(fā)生缺失時,紋理流水線不應(yīng)該空閑等待紋素更新,而是可以繼續(xù)處理后面所需的16個紋素。所以需要Cache能夠在更新缺失紋素的同時,支持下一個Quad紋素的獲取,紋理Cache的設(shè)計(jì)應(yīng)該是非阻塞的。
Cache的非阻塞通過缺失信息狀態(tài)保持寄存器(MSHR)實(shí)現(xiàn),標(biāo)準(zhǔn)的MSHR設(shè)計(jì)時包括:隱式尋址、顯式尋址及反式尋址幾種方式[12-14]。標(biāo)準(zhǔn)的MSHR中只保存請求地址及相關(guān)信息,返回?cái)?shù)據(jù)直接更新Cache并送往CPU的寄存器中。紋理Cache設(shè)計(jì)時由于其紋素返回只有一個目標(biāo),所以可使用一種類似于反式尋址的方式實(shí)現(xiàn),同時由于紋理L1 Cache為多端口多Bank設(shè)計(jì),一次請求所需的多個紋素可能有部分命中,部分缺失,所以為每個請求保存一個MSHR寄存器,不僅保存其中請求編號、請求地址也保存請求對應(yīng)的返回紋素?cái)?shù)據(jù)及相關(guān)信息等用于組裝數(shù)據(jù)。
Cache一次接收到16個地址請求后,首先將本次請求的地址和過濾信息等都存儲到非阻塞部件的某個MSHR中,由于地址合并后認(rèn)為Cache同時處理的請求最多為9個。當(dāng)某個紋理流水線同時所需的9個紋素都命中時,將從Cache核返回的9個數(shù)據(jù)分別發(fā)送到當(dāng)前MSHR的16個地址,將數(shù)據(jù)送出完成訪問。如果這9個紋素訪問中某些紋素發(fā)生缺失時,已命中數(shù)據(jù)都進(jìn)入當(dāng)前MSHR中,未命中的紋素給出缺失標(biāo)識到當(dāng)前MSHR。MSHR會根據(jù)發(fā)生缺失的紋素地址合并產(chǎn)生Cache的Block缺失地址,發(fā)送到一個請求Buffer中送去訪問L2 Cache,當(dāng)L2 Cache返回?cái)?shù)據(jù)后同時更新MSHR中數(shù)據(jù)及L1 Cache中的數(shù)據(jù),并將MSHR中16個紋素及其對應(yīng)的過濾信息等一起送給輸出Buffer,供紋理流水線單元進(jìn)行處理。
非阻塞模塊的MSHR結(jié)構(gòu)如圖4所示,一個MSHR寄存器保存16個請求,包括請求的有效標(biāo)志、請求編號、過濾模式、三維坐標(biāo)以及相應(yīng)的紋素和紋素Ready標(biāo)志。
圖4 L1 Cache的MSHR結(jié)構(gòu)
采用Verilog HDL對多端口非阻塞設(shè)計(jì)的紋理Cache進(jìn)行描述,下載到Xilinx Vertex6系列開發(fā)板上進(jìn)行綜合,工作頻率可以達(dá)到220 MHz,在SMIC 65 nm CMOS工藝下,采用Synopsys Design-Compiler對設(shè)計(jì)進(jìn)行綜合,電路工作頻率達(dá)到370 MHz,可以滿足設(shè)計(jì)需求。
驗(yàn)證時采用如圖5所示的典型紋理貼圖場景進(jìn)行紋理過濾的測試,紋理映射過程流暢。
根據(jù)仿真結(jié)果統(tǒng)計(jì)Cache的命中率如表1所示。由表1可知,設(shè)計(jì)的多端口非阻塞二維紋理Cache在基于Quad的染色流水線使用臨近采樣或雙線性采樣進(jìn)行紋理貼圖時,命中率在85%以上,發(fā)生阻塞的概率在10%以內(nèi)。
(a) 典型游戲繪制場景
(b) 簡單動畫場景繪制
(c) 典型游戲場景繪制
表1 典型測試場景下的紋理Cache缺失率 (%)
紋理訪問占用了大量的圖形處理器的存儲帶寬[15],現(xiàn)代圖形處理器設(shè)計(jì)中通常采用層次式存儲器的方法[16-17],結(jié)合不同的紋理壓縮算法解決紋理帶寬問題[18-19]。本文提出的多端口非阻塞紋理Cache結(jié)合基于Quad的嵌入式圖形著色流水線,能夠以較小的硬件代價提供較高的存儲帶寬,可以滿足嵌入式圖形處理器中高性能紋理貼圖的存儲帶寬需求。
[1] 楊毅,郭立,史鴻聲,等.面向移動設(shè)備的3D圖形處理器設(shè)計(jì)[J].小型微型計(jì)算機(jī)系統(tǒng),2009,30(8):1668-1674.
[2] 許慶功,劉慶偉,張永勝,等.基于硬件加速的紋理映射體繪制[J].計(jì)算機(jī)工程與應(yīng)用,2009,45(26):190-192.
[3] KIM Seok Hoon,KIM Hoog Yun,KIM Young Jun,et al.A 116 fps/74 mW Heterogeneous 3D-media Processor for 3D Display Applications[J].IEEE Journal of Solid-state Circuits,2010,45(3):652-667.
[4] 程龍,郭立,史鴻聲,等.一種紋理映射算法的FPGA實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2009,30(9):1855-1859.
[5] GUPTA A,HAKURA Z S.The Design and Analysis of a Cache Architecture for Texture Mapping [J].AcmSigarch Computer Architecture News,1997,25(2):108-120.
[6] COX M,BHANDARI N,SHANTZ M.Multi-level Texture Caching for 3D Graphics Hardware[C]∥ The International Symposium on Computer Architecture,1998:86-97.
[7] WRIGHT R S,SWEET M.OpenGL 超級寶典(第4版)[M].北京:人民郵電出版社,2010.
[8] 趙國宇,郭煒,常軼松,等.一種高效紋理映射單元的硬件體系結(jié)構(gòu)設(shè)計(jì)[J].計(jì)算機(jī)工程,2013,39(5):92-95.
[9] FATAHALIAN K,BOULOS S,HEGARTY J,et al.Reducing Shading on GPUs using Quad-Fragment Merging [J].ACM Trans.,2010,29(4):671-678.
[10] 許強(qiáng),陳杰,劉建,等.一種適用于嵌入式圖形處理器的多端口紋理Cache的設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2013,30(11):27-30.
[11] JUURLINK Ben,ANTOCHI Iosif,CRISU Dan,et al.A Framework for Low Power 3D Graphics Accelerators[J].IEEE Computer Graphics and Applications,2008,28(4):63-73.
[12] 胡孔陽,陳鵬,桑紅石,等.多線程非阻塞指令Cache設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2012,29(5):143-147.
[13] 孟銳.處理器中非阻塞Cache技術(shù)的研究[J].電子設(shè)計(jì)工程,2015,23(9):85-88.
[14] 胡偉武,張福新,李祖松,等.龍芯2號處理器設(shè)計(jì)和性能分析[J].計(jì)算機(jī)研究與發(fā)展,2006,43(6):959-966.
[15] 韓俊剛,劉有耀,張曉.圖形處理器的歷史現(xiàn)狀和發(fā)展趨勢[J].西安郵電大學(xué)學(xué)報(bào),2011,16(3):61-64.
[16] 田澤,張駿,許宏杰,等.圖形處理器低功耗設(shè)計(jì)技術(shù)研究[J].計(jì)算機(jī)科學(xué),2013,40(1):210-216.
[17] 焦繼業(yè),李濤,杜慧敏,等.移動圖形處理器的現(xiàn)狀、技術(shù)及其發(fā)展[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2015(6):1005-1016.
[18] 潘志剛,高鑫.針對紋理圖像壓縮的改進(jìn)SPIHT算法[J].中國科學(xué)院大學(xué)學(xué)報(bào),2010,27(2):222-227.
[19] 陳妍,李鳳霞.基于插值矢量量化的地形金字塔紋理壓縮[J].計(jì)算機(jī)工程與應(yīng)用,2006,42(22):177-178.