杜慧敏,李 萌
(1.西安郵電大學 電子工程學院,陜西 西安710121; 2.西安郵電大學 計算機學院,陜西 西安710121)
圖形處理器(Graphics Processing Unit,GPU)的發(fā)展主要集中于3D圖形渲染領(lǐng)域,如PowerVR、Nvidia、ATI和 BitBoys[1]等產(chǎn)品中都具有3D引擎所必備的高性能染色處理單元。頂點染色器(Vertex Shader)作為GPU的一個重要組成,是高性能染色處理單元不可缺少的部分,主要完成圖形處理過程中幾何變換、法向量標準化、光照處理等階段的運算,其性能的提高將有利于改善圖形處理器的性能。
目前已經(jīng)提出的頂點染色器的結(jié)構(gòu)包括:單指令多數(shù)據(jù)流(Single Instruction Multiple Data,SIMD)、超長指令字(Very Long Instruction Word,VLIW)、VLIW+SIMD、VLIW+SIMD+多線程(Multithreading)以及多核處理機制[2-3]。SIMD 結(jié)構(gòu)通過對功能單元的復制,提高了向量處理的速度,便于實現(xiàn)矩陣運算,但是其對于性能的提高依賴于功能單元的個數(shù),效果有限;VLIW著眼于通過指令級并行提高處理器性能,一條指令往往包含多個操作,雖然它在一定程度上提高了執(zhí)行效率,但是編譯起來比較困難;VLIW+SIMD結(jié)合了兩者的優(yōu)點,進一步提高了運算速度,但處理器的復雜度也相應(yīng)提高;VLIW+SIMD+SMT在VLIW+SIMD基礎(chǔ)上加入了SMT技術(shù),充分利用了空閑資源,實現(xiàn)數(shù)據(jù)處理的并行化,但是硬件復雜度相對較高;多核處理器旨在用多個簡單的核實現(xiàn)復雜運算,提高并行性的同時降低了單個內(nèi)核的復雜度,但是難以對其進行程序的編寫。
本文擬在分析頂點染色器功能和常用染色算法基礎(chǔ)上,設(shè)計一款支持OpenGL命令處理的可編程頂點染色器(Programmable Vertex Shader),引入一種針對頂點染色處理的專用指令集,通過使用該指令集編程實現(xiàn)不同算法的移植,同時,為了提高硬件的運算速度,采用SIMD向量處理、多執(zhí)行部件的流水結(jié)構(gòu)等技術(shù)進行硬件設(shè)計。
頂點染色器主要功能是實現(xiàn)幾何變換、法向量標準化以及頂點的光照處理。所謂光照處理就是利用一些特定的算法模擬現(xiàn)實世界中物體被光線照射后,反映到人眼中的樣子,使最終描繪的場景看起來更加逼真,目前圖形界最常用的經(jīng)典光照模型是 Gouraud模型和 Phong模型[4-5]。
1.2.1 幾何變換
幾何變換主要完成模型視圖變換,通過對圖形使用平移、旋轉(zhuǎn)、縮放的操作,將模型坐標系下的圖形轉(zhuǎn)換為視圖坐標系下的圖形,便于在屏幕上顯示。這種坐標系間的轉(zhuǎn)換是通過頂點坐標乘以平移、縮放或旋轉(zhuǎn)矩陣來實現(xiàn)的,涉及的矩陣有[6]平移矩陣
縮放矩陣
繞X軸旋轉(zhuǎn)矩陣
繞Y軸旋轉(zhuǎn)矩陣
繞Z軸旋轉(zhuǎn)矩陣
1.2.2 法向量標準化
法向量標準化就是將一個長度不為1的法向量單位化,使其變?yōu)橐粋€單位法向量[5],即
其中N代表歸一化前的法向量,|N|代表該法向量的長度,NV代表單位化以后得到的單位法向量。
1.2.3 光照模型
在光照處理的過程中,無論是Gouraud模型還是Phong模型,都需要使用光照方程[5-6]來計算頂點的光照強度,即
其中I代表擬染色頂點的最終光照強度,Ia代表環(huán)境光強度,Id表示漫反射光強度,Is表示鏡面反射光強度,Ip代表聚光燈光照強度,ka,kd和ks分別代表環(huán)境光系數(shù)、漫反射光系數(shù)和鏡面反射光系數(shù),N代表頂點單位法向量,L代表反射光單位法向量,V代表進入人眼的光的單位法向量,R代表鏡面反射光的單位法向量,n代表鏡面反射指數(shù),而f(d)為衰減因子,是一個跟光源與頂點的距離d相關(guān)的函數(shù)[5],即
其中d為頂點到光源的距離,kc為常量衰減因子,kl為線性衰減因子,kq為二次衰減因子。
由于實際計算時可能存在多盞聚光燈對頂點進行照射,因此式(2)需要修改為
以將所有的聚光燈的光照結(jié)果進行累加,求得頂點的最終光照結(jié)果。
對于Gouraud模型,其核心思想是對頂點的法向量和與頂點相鄰的多邊形的法向量求一個平均值,使用該平均值代替頂點的法向量,并將其代入式(4)計算頂點的最終光照強度。
下面采用類pascal偽代碼描述Gouraud模型計算頂點光照的流程,其中PV代表當前擬染色頂點坐標,為一個實數(shù)四元組(xV,yV,zV,wV),其中xV,yV,zV分別表示X 軸、Y 軸、Z軸的坐標,wV為齊次因子,通常取1。P1和P2代表與當前擬染色頂點相鄰的多邊形的另兩個頂點,和PV一起構(gòu)成一個三角形,均為實數(shù)四元組,分別表示為(x1,y1,z1,w1)和(x2,y2,z2,w2)。偽代碼表示如下。
A:=P1-PV;//得到邊〈v,1〉的向量 A(a1,a2,a3)
B:=P2-P1;//得到邊〈1,2〉的向量B(b1,b2,b3)
N:=A×B;//求三角形的法向量N(a2b3-a3b2,a3b1-a1b3,a1b2-a2b1)
|N|:=sqrt[(a2b3-a3b2)2+(a3b1-a1b3)2+
(a1b2-a2b1)2];//對三角形法向量 N求模
|NV|:=sqrt(x2,y2,z2);//對PV法向量 NV求模
Nm:=(NV+N)/(|NV|+|N|);//求所有法向量的平均值 Nm,即實數(shù)三元組(x,y,z)
cosα:=Nm·L;//代表入射角的余弦值
cosβ:=V·R;//代表入人眼的光和鏡面反射光夾角的余弦值
cosnβ:=exp{n ln(cosβ)};
max:=max(cosφ,0);//cosφ為聚光燈切角,代表了聚光燈可以照射的范圍
if(max?。海?)//判斷一個特定的頂點是否位于光錐的內(nèi)部
then[It:=It+Ip];//It為所有聚光燈強度的和,初始值為0
else[It:=It]
I:=kaIa+f(d)It(kdcosα+kscosnβ)
與Gouraud模型不同,Phong模型不需要求平均法向量,而是將頂點的法向量直接帶入光照方程(4),計算頂點光照強度。該模型下頂點的光照強度計算流程可表示如下。
根據(jù)以上分析可以看出,Gouraud模型需要先求平均法向量,再計算頂點光照強度,而Phong模型可以根據(jù)已知的頂點法向量直接計算頂點的光照強度,似乎Phong模型的計算量更小,但是,對于整個圖形繪制的過程來說,Gouraud模型對三角形內(nèi)部各點采用雙線性插值的方法求光照強度,而Phong模型則需要先利用頂點的法向量對三角形內(nèi)部各點的法向量進行插值,然后逐點代入式(4)進行光照計算,實際上比Gouraud模型計算量更大。不過,Gouraud模型不能很好地反映物體的高光部分,而且由于使用了平均法向量,在圖形繪制過程中還可能出現(xiàn)馬赫帶效應(yīng),即在物體表面出現(xiàn)過亮或過暗的條紋。在實際應(yīng)用中,可以根據(jù)不同的需要對兩種光照模型進行選擇。
根據(jù)對算法的分析結(jié)果,定義如表1所示的專用指令集并統(tǒng)計指令的使用頻度[7-9]。需要注意的是,由于執(zhí)行單元是多周期的,且很多情況下前面的執(zhí)行結(jié)果需要作為后面操作的輸入,因此,在編寫程序時需要適當加入空指令NOP。
表1 頂點染色器專用指令集
在引入的指令集基礎(chǔ)上,制定如下規(guī)則。
(1)可編程處理器采用64位固定長度的指令系統(tǒng),其中低36位為有效指令格式,高28位為保留位,以便今后根據(jù)不同需求對指令集進行擴展。
(2)尋址方式包括:立即數(shù)尋址、寄存器直接尋址、絕對尋址、寄存器間接尋址四種尋址方式。
流水線[7,9]是利用執(zhí)行指令所需要的操作之間的并行性,實現(xiàn)多條指令重疊執(zhí)行的一種技術(shù),傳統(tǒng)的五級流水線結(jié)構(gòu)如圖1所示,包括取指、譯碼、執(zhí)行、存儲和回寫五個階段。
圖1 傳統(tǒng)五級流水線結(jié)構(gòu)
采用五級宏流水線結(jié)構(gòu),如圖2所示,包括取指階段、譯碼1階段、譯碼2階段、執(zhí)行階段和回寫階段。
取指階段訪問指令存儲器,獲取將要執(zhí)行的指令;譯碼階段1對指令寄存器中的指令進行譯碼,并通過訪問寄存器組獲取操作數(shù);譯碼階段2根據(jù)指令的結(jié)構(gòu)完成執(zhí)行階段需要的操作數(shù)的選擇,產(chǎn)生LDQ和STQ操作訪問數(shù)據(jù)存儲器的數(shù)據(jù)和地址,使得存儲訪問階段與執(zhí)行階段處于同一執(zhí)行周期,跳轉(zhuǎn)指令也在本級處理并通過對不同跳轉(zhuǎn)指令產(chǎn)生的跳轉(zhuǎn)PC值進行選擇產(chǎn)生新的PC值;執(zhí)行階段為多周期操作,包括定點處理單元、浮點處理單元和向量處理單元,執(zhí)行周期可以從最低的單周期操作到最高的二十多周期操作。回寫階段將計算結(jié)果按照指定的規(guī)則寫入寄存器文件。
圖2 五級宏流水線結(jié)構(gòu)
流水線設(shè)計中還采用前遞(Forwarding)技術(shù)[9],使得前一條指令的計算結(jié)果可以直接給下一條指令使用,而不用等到前一條指令將結(jié)果寫回寄存器后再從寄存器中讀取結(jié)果,以此緩解數(shù)據(jù)相關(guān)所帶來的影響,如圖3所示。
圖3 使用前遞技術(shù)的五級宏流水線
頂點染色器的整體結(jié)構(gòu)如圖4所示,共分為四個模塊:命令分配器模塊、存儲管理模塊、可編程處理器模塊和指令存儲結(jié)構(gòu)模塊。這四個模塊分別完成以下功能。
(1)命令分配器
用于解析來自命令處理器的各種OpenGL命令,按照單參數(shù)、環(huán)境類、矩陣類、頂點類和透傳將不同命令分類;提取命令中的參數(shù)并將參數(shù)存儲于片上數(shù)據(jù)存儲器中;根據(jù)不同的命令處理方式啟動相應(yīng)的處理程序;裝配并發(fā)送新的OpenGL命令。
(2)存儲管理
用于管理可編程頂點染色器所涉及的片上數(shù)據(jù)存儲區(qū)、統(tǒng)一編址寄存器以及Dcache。
(3)可編程處理器
本模塊是一個基于SIMD架構(gòu)的復雜核處理器,具有五級宏流水線結(jié)構(gòu);擁有一個向量處理單元、一個標量處理單元和一個特殊函數(shù)處理單元;可以處理固定的幾何變換和光照程序也可以處理用戶自定義的程序[10-13]。
(4)指令存儲結(jié)構(gòu)
指令存儲區(qū)包含了兩部分,一部分為固定程序存儲區(qū),這部分存儲區(qū)用于存放固定染色程序;另一部分為Icache存儲區(qū),用于存放用戶自定義染色程序。
圖4 可編程頂點染色器頂層結(jié)構(gòu)
可編程處理器采用程序與數(shù)據(jù)分離存儲的方式,結(jié)合五級宏流水線技術(shù),以SIMD結(jié)構(gòu)加速向量類命令處理,以定點和浮點通用結(jié)構(gòu)處理標量類命令,以特殊功能結(jié)構(gòu)加速超越函數(shù)處理(圖5)。指令序列來源于指令Cache和指令固定程序存儲區(qū),數(shù)據(jù)來源于片上數(shù)據(jù)存儲區(qū)和統(tǒng)一編制寄存器。
圖5 可編程頂點染色器流水線設(shè)計
為了加速向量運算,特別設(shè)計了4路SIMD架構(gòu)的向量功能單元,完成向量加減乘運算和向量點乘運算。每組浮點乘法單元和浮點加法單元都擁有4個完全相同的處理單元,根據(jù)數(shù)據(jù)輸入時的標記不同,可以分別實現(xiàn)四維向量和三維向量乘法的相關(guān)操作,并根據(jù)向量指令的目的寄存器選擇信號對處理結(jié)果進行重新分配。這樣的結(jié)構(gòu)可以大大縮短向量計算花費的時鐘周期數(shù),以四維向量的乘法為例,如果不采用SIMD架構(gòu),需要做4次浮點乘法,共花費28個周期,而在SIMD架構(gòu)下可以同時做4個浮點乘法,7個時鐘周期就可以得到結(jié)果,具體結(jié)構(gòu)如圖6所示。
圖6 向量處理單元設(shè)計
除了采用SIMD結(jié)構(gòu)外,處理器還擁有一個特殊函數(shù)運算單元來實現(xiàn)超越的運算。該單元采用CORDIC算法,通過對參數(shù)的設(shè)置,使用簡單的移位操作和加法運算,以迭代的方式,實現(xiàn)復雜的超越函數(shù)運算,便于硬件實現(xiàn),精度較高[14]。在保證設(shè)計需求的前提下,將浮點特殊函數(shù)運算單元采用浮點數(shù)-定點數(shù)轉(zhuǎn)換模塊和具有串行迭代結(jié)構(gòu)的定點CORDIC單元實現(xiàn),迭代次數(shù)為13次。由于使用定點加法器代替浮點加法器完成迭代過程中的加法操作,每一次迭代都減少了4個時鐘周期(本設(shè)計中浮點加法花費5個時鐘周期,定點加法在1個時鐘周期內(nèi)就可以完成),減少了運算周期數(shù),提高了運算速度。
本設(shè)計采用SystemVerilog搭建驗證平臺,在工作站上使用Linux環(huán)境下QuestaSim6.5b作為仿真工具,使用基于JAVA的圖形轉(zhuǎn)換軟件對生成的數(shù)據(jù)進行圖形繪制。整體功能驗證平臺如圖7所示,該驗證平臺具有自動對比功能,包含輸入單元、輸出單元、參考模型和DUT四個部分。
圖7 整體功能驗證平臺
采用不同圖形仿真所得結(jié)果如圖8所示??梢钥闯?,可編程頂點染色器功能正確,可以完成對頂點的染色處理,繪制出真實的圖形。
圖8 仿真結(jié)果
采用Xilinx公司Virtex6-760對可編程頂點染色器電路進行邏輯綜合,綜合報告如圖9所示,占用了3%的LUT以及1%的Slice寄存器,資源消耗適中。
圖9 電路綜合報告
電路的最大工作頻率為197MHz,不加光照的情況下,可編程頂點染色器處理一個頂點大約需要40個周期,頂點處理能力達到5Mvertexx/s,能夠滿足設(shè)計要求。
設(shè)計了一種基于SIMD架構(gòu)的可編程頂點染色器,定義了專用的指令集,更適于進行向量類操作,不僅提高了頂點染色的速度,而且可編程的設(shè)計也提高了頂點染色器的靈活性,通過程序的移植,能夠?qū)崿F(xiàn)除頂點染色算法之外的其他算法。
[1]Moya V,Gonzalez C,Roca J,et al.A Single(Unified)Shader GPU Microarchitecture for Embedded Systems[C]//Proceedings of 1st International Conference on High Performance Embedded Architectures and Compilers(HiPEAC 2005).Spanish Barcelona:Springer-Verlag,2005:286-301.
[2]Lee Y,Avizienis R,Bishara A,et al.Exploring the tradeoffs between programmability and efficiency in data-parallel accelerators[C]// Proceedings of 38th Annual International Symposium on Computer Architecture(ISCA 2011).US CA San Jose:Institute of E-lectrical and Electronics Engineers Inc, 2011:129-140.
[3]李濤,肖靈芝.面向圖形和圖像處理的輕核陣列機結(jié)構(gòu):螢火蟲2號[J].西安郵電學院學報,2012,17(3):41-47.
[4]Edward Angel.交互式計算機圖形學:基于OpenGL的自頂向下方法[M].吳文國,譯.4版.北京:清華大學出版社,2007:255-288.
[5]Shreiner D.OpenGL編程指南[M].李軍,徐波,劉金華,等譯.7版.北京:機械工業(yè)出版社,2010:123-148.
[6]孫剛德.基于自動線程和超長指令的統(tǒng)一架構(gòu)著色器的設(shè)計研究[D].杭州:浙江大學電氣工程學院,2012:11-15.
[7]Aasaraai K.,Moshovos A..Design Space Exploration of Instruction Schedulers for Out-of-Order Soft Processors[C]//Proceedings of 2010International Conference on Field-Programmable Technology(FPT’10).China Beijing: IEEE Computer Society, 2010:385-388.
[8]Munoz D M,Sánchez D F,Llanos C H,et al.Tradeoff of FPGA Design of Floating-point Transcendental Functions[C]//Proceedings of 17th IFIP International Conference on Very Large Scale Integration(VLSI-SoC 2009).Brazil Florianopolis:IEEE Computer Society,2011:239-242.
[9]胡偉武,陳云霽,肖俊華,等.計算機體系結(jié)構(gòu)[M].北京:清華大學出版社,2011:55-139.
[10]Kubosawa H,Higaki N,Ando S,et al.A 2.5-GFLOPS,6.5Million Polygons per Second,F(xiàn)our-Way VLIW Geometry Processor with SIMD Instructions and a Software Bypass Mechanism[J].IEEE Journal of Solid-State Circuits,1999,11 (34):1619-1625.
[11]Jones A K,Hoare R,Kourtev I S,et al.A 64-way VLIW/SIMD FPGA Architecture and Design Flow[C]//Proceedings of 11th IEEE International Conference on Electronics,Circuits and Systems(ICECS 2004).Isreal Tel Aviv:Institute of Electrical and E-lectronics Engineers Computer Society, 2004:499-502.
[12]Hennessy J L,Patterson D A.計算機體系結(jié)構(gòu):量化研究方法(影印版)[M].4版.北京:機械工業(yè)出版社,2010:A2-B47.
[13]韓俊剛,蔣林,杜慧敏,等.一種圖形加速器和著色器的體系結(jié)構(gòu)[J].計算機輔助設(shè)計與圖形學學報,2010,22(3):363-372.
[14]李全.浮點反正切函數(shù)的FPGA實現(xiàn)[J].電子技術(shù)應(yīng)用,2010,36(8):9-10.