張立志 趙士彭 趙皓宇 蘇孟豪* 劉 蘇*
(*計(jì)算機(jī)體系結(jié)構(gòu)國(guó)家重點(diǎn)實(shí)驗(yàn)室(中國(guó)科學(xué)院計(jì)算技術(shù)研究所) 北京 100190)(**中國(guó)科學(xué)院計(jì)算技術(shù)研究所 北京 100190)(***中國(guó)科學(xué)院大學(xué) 北京 100049)(****中國(guó)科學(xué)技術(shù)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 合肥 230026)(*****龍芯中科技術(shù)有限公司 北京 100190)
圖形處理器(graphics processing unit,GPU)是計(jì)算機(jī)系統(tǒng)中處理3D實(shí)時(shí)圖形程序的專用加速芯片,目前廣泛應(yīng)用于個(gè)人電腦、工作站、嵌入式設(shè)備與智能手機(jī)中。在中央處理器(central processing unit,CPU)與GPU的芯片設(shè)計(jì)[1]中,當(dāng)對(duì)某款處理器進(jìn)行結(jié)構(gòu)探索時(shí),通常并不是直接使用硬件描述語(yǔ)言對(duì)芯片進(jìn)行實(shí)現(xiàn)與驗(yàn)證,而是使用高級(jí)語(yǔ)言(如C、C++)編寫對(duì)應(yīng)的處理器模擬器,來(lái)進(jìn)行結(jié)構(gòu)探索與功能驗(yàn)證,因?yàn)楦呒?jí)語(yǔ)言編寫的模擬器在功能實(shí)現(xiàn)與錯(cuò)誤調(diào)試方面都更為簡(jiǎn)單快捷,同時(shí)可以對(duì)結(jié)構(gòu)進(jìn)行低成本的優(yōu)化改進(jìn)。
在GPU的架構(gòu)演進(jìn)[2,3]中,GPU的功能不斷增多。1992年美國(guó)硅圖公司將圖形流水線應(yīng)用于GPU[4],GPU的原始輸入數(shù)據(jù)是由CPU預(yù)先處理好的三角形數(shù)據(jù),GPU只負(fù)責(zé)光柵化與紋理采樣等少數(shù)幾個(gè)操作,功能非常單一。在不斷的發(fā)展過(guò)程中,GPU逐漸開始負(fù)責(zé)原本由CPU負(fù)責(zé)的三角形的生成與剔除、頂點(diǎn)光照特效、頂點(diǎn)數(shù)據(jù)移動(dòng)變換操作、像素點(diǎn)特效操作、曲面細(xì)分等功能。越來(lái)越復(fù)雜的GPU功能使得進(jìn)行直接芯片實(shí)現(xiàn)的成本巨大,故模擬器驗(yàn)證變得越來(lái)越重要。隨著GPU功能的豐富與性能的提升,GPU結(jié)構(gòu)變得越來(lái)越復(fù)雜,GPU模擬器的代碼規(guī)模也越來(lái)越龐大,靈活性越來(lái)越低,這使得GPU模擬器不易添加新的功能模塊,也增加了測(cè)試驗(yàn)證的難度。
為解決周期精確模擬器GPU模擬器代碼靈活度低的問(wèn)題,本文提出并實(shí)現(xiàn)了一種半周期精確的GPU模擬器實(shí)現(xiàn)方法,基于該方法設(shè)計(jì)的GPU模擬器可以快速地對(duì)3D圖形算法進(jìn)行正確性驗(yàn)證與性能分析。
本文的主要貢獻(xiàn)是:(1)結(jié)合GPU結(jié)構(gòu)特性,提出了半周期精確的GPU模擬器設(shè)計(jì)方法。該方法在保證功能驗(yàn)證與性能評(píng)估的基礎(chǔ)上,降低了GPU模擬器內(nèi)部功能模塊之間的耦合度,增加了模擬器靈活性,同時(shí)降低了GPU模擬器使用者對(duì)模擬器的學(xué)習(xí)成本。它將GPU固定功能管線部分使用逆序流水方式實(shí)現(xiàn)完全的周期精確模擬,在可編程流處理器單元使用單周期處理器的功能模擬,各模塊之間使用隊(duì)列對(duì)周期精確進(jìn)行解耦合。(2)將半周期精確模擬器設(shè)計(jì)方法應(yīng)用于實(shí)際系統(tǒng),實(shí)現(xiàn)一款GPU模擬器,并使用glmark2測(cè)試集對(duì)該模擬器進(jìn)行功能正確性驗(yàn)證,同時(shí)對(duì)三角形光柵化算法進(jìn)行了性能評(píng)估。
現(xiàn)代GPU架構(gòu)主要由2部分構(gòu)成,即固定功能管線與可編程流處理器單元。固定功能管線主要負(fù)責(zé)GPU中圖形算法的實(shí)現(xiàn)與GPU內(nèi)各模塊的調(diào)度;可編程流處理器單元負(fù)責(zé)執(zhí)行圖形程序中的頂點(diǎn)著色器與片段著色器代碼,同時(shí)因?yàn)槠淇删幊烫匦?,近些年較為火熱的GPGPU[5](general-purpose computing on graphics processing unit)也由可編程流處理器單元實(shí)現(xiàn)。
目前國(guó)內(nèi)外已經(jīng)提出多種高級(jí)語(yǔ)言編寫的GPU模擬器,這些模擬器也可依據(jù)GPU架構(gòu)的特性分為2類:完整的GPU模擬器和只實(shí)現(xiàn)可編程流處理器單元的通用計(jì)算模擬器。其中通用計(jì)算模擬器涵蓋了近些年大部分GPU模擬器,例如Multi2Sim[6]、Multi2Sim Kepler[7]、MIAOW[8]、GPGPU-Sim[9]與基于Gem5 CPU模擬器[10]開發(fā)的gem5-gpu[11]。這些模擬器只對(duì)可編程流處理器單元進(jìn)行模擬仿真,可以運(yùn)行完整的GPGPU程序,但不包含引言所提到的光柵化與紋理采樣操作、三角形的生成與剔除、頂點(diǎn)光照特效、頂點(diǎn)數(shù)據(jù)移動(dòng)變換操作、像素點(diǎn)特效操作、曲面細(xì)分等功能,無(wú)法執(zhí)行任何完整的圖形應(yīng)用程序。
因?yàn)镚PU技術(shù)中圖形處理技術(shù)主要掌握在少數(shù)商業(yè)GPU廠商手中(如Nvidia、AMD),他們因?yàn)樯虡I(yè)原因,并沒(méi)有將GPU技術(shù)對(duì)外公開,所以學(xué)術(shù)界所使用的GPU模擬器數(shù)目并不多。所公開源代碼的GPU模擬器中最具代表性且廣泛使用的模擬器是ATTILA模擬器[12]。ATTILA模擬器是加泰羅尼亞理工大學(xué)于2006年與Intel公司共同開發(fā)的一款完全周期精確的GPU模擬器,模擬器一直維護(hù)至2015年。該模擬器為了實(shí)現(xiàn)完全的周期精確模擬,使用Signal數(shù)據(jù)結(jié)構(gòu)詳細(xì)模擬了Verilog HDL語(yǔ)言中的Wire,同時(shí)模擬了時(shí)序延遲與傳輸帶寬。這種處理方式雖然保證了模擬器的正確性與準(zhǔn)確度,但是極大增加了模擬器的軟件規(guī)模與軟件結(jié)構(gòu)復(fù)雜度,使得開發(fā)者難以在模擬器上增加新的功能模塊,更加難以對(duì)所模擬的GPU結(jié)構(gòu)進(jìn)行較大規(guī)模的升級(jí)修改。在圖形算法的模擬中,ATTILA采用時(shí)序模擬與算法功能仿真分離的實(shí)現(xiàn)方式,分別使用不同的模塊進(jìn)行實(shí)現(xiàn),這種方法再次增加了代碼的可調(diào)試性與閱讀難度。加泰羅尼亞理工大學(xué)于2013年再次與Intel公司合作開發(fā)了Teapot[13]模擬器,迄今一直在維護(hù)使用,但該模擬器依然采用了完全周期精確的模擬方式,沒(méi)有解決模擬器的靈活性問(wèn)題。
為解決GPU模擬器軟件結(jié)構(gòu)過(guò)于復(fù)雜且不易進(jìn)行結(jié)構(gòu)更改與代碼調(diào)試的問(wèn)題,同時(shí)結(jié)合前述模擬器實(shí)現(xiàn)方法與GPU本身特性,本文提出了半周期精確的GPU模擬器實(shí)現(xiàn)方法,該方法在保證功能正確的基礎(chǔ)上,降低了GPU模擬器軟件結(jié)構(gòu)復(fù)雜度,使得模擬器使用者可以快速地為GPU模擬器添加新功能,并使用OpenGL 2.0程序?yàn)樵摴δ苣K進(jìn)行正確性驗(yàn)證與性能分析。
在完整的GPU設(shè)計(jì)路線中,模擬器只是一個(gè)階段性產(chǎn)物,而不是像ATTILA模擬器與Teapot模擬器在其項(xiàng)目規(guī)劃中將模擬器作為最終產(chǎn)物,簡(jiǎn)單高效的實(shí)現(xiàn)模擬器將極大影響GPU的整體研發(fā)效率。半周期精確模擬器的設(shè)計(jì)目的是在GPU結(jié)構(gòu)設(shè)計(jì)初期對(duì)結(jié)構(gòu)進(jìn)行功能正確性驗(yàn)證與性能分析。由于GPU最終結(jié)構(gòu)設(shè)計(jì)代碼將由Verilog HDL語(yǔ)言編寫,用高級(jí)語(yǔ)言編寫的模擬器在功能與結(jié)構(gòu)上與最終所期待GPU有很大差距。所以在使用模擬器對(duì)GPU結(jié)構(gòu)進(jìn)行驗(yàn)證后,還需要使用現(xiàn)場(chǎng)可編程門陣列(field progrmmable gate array, FPGA)進(jìn)行更深一步驗(yàn)證與性能評(píng)估。
GPU一般由固定功能管線與可編程流處理器單元2部分構(gòu)成。固定功能管線是一條數(shù)據(jù)驅(qū)動(dòng)的圖形算法流水線電路,驅(qū)動(dòng)數(shù)據(jù)為頂點(diǎn)數(shù)據(jù)與像素點(diǎn)數(shù)據(jù);可編程流處理器單元?jiǎng)t是指令驅(qū)動(dòng)處理器,可進(jìn)行取指、譯碼、執(zhí)行、訪存操作,其指令為著色器程序的匯編指令。這2個(gè)面向不同處理對(duì)象的單元由先入先出 (first input first output,F(xiàn)IFO)或隨機(jī)存取存儲(chǔ)器(random access memory,RAM)進(jìn)行解耦合。在進(jìn)行性能評(píng)估時(shí)[14,15],固定功能單元性能指標(biāo)一般為每秒或每周期可處理的頂點(diǎn)數(shù)目與像素點(diǎn)數(shù)目;而可編程流處理器單元性能指標(biāo)一般為每秒可處理浮點(diǎn)指令的數(shù)目。這是因?yàn)樵趯?shí)際3D圖形應(yīng)用中,即使使用相同的頂點(diǎn)數(shù)據(jù)與像素點(diǎn)數(shù)據(jù),在調(diào)用不同著色器程序時(shí),圖形的顯示效果也大不相同。一般增加著色器程序指令數(shù)目后,圖形顯示效果將更加逼真細(xì)膩,同時(shí)可編程流處理器單元執(zhí)行的時(shí)間也將變長(zhǎng),進(jìn)而影響到固定功能單元每秒可處理的頂點(diǎn)數(shù)目與像素點(diǎn)數(shù)目。這2個(gè)單元在性能評(píng)估階段并沒(méi)有使用相同的標(biāo)準(zhǔn),而且這2個(gè)性能評(píng)估標(biāo)準(zhǔn)也無(wú)法進(jìn)行進(jìn)一步的統(tǒng)一衡量。
基于上述原因,本文基于“GPU由固定功能單元與可編程流處理器單元共同組成”這一特性,將GPU模擬器實(shí)現(xiàn)為半周期精確的功能級(jí)模擬器。將固定功能管線進(jìn)行周期精確的模擬,所有模塊在模擬器中所執(zhí)行時(shí)間與該模塊在真實(shí)芯片中執(zhí)行時(shí)間相同,例如32位乘法部件將進(jìn)行4個(gè)時(shí)鐘周期的全流水模擬,與真實(shí)芯片執(zhí)行時(shí)間相同。而可編程流處理器單元?jiǎng)t不進(jìn)行周期精確的模擬,只進(jìn)行指令級(jí)功能模擬,每周期處理一條完整指令。雖然在真實(shí)芯片中,每條指令將進(jìn)行多周期全流水執(zhí)行,但單周期功能級(jí)模擬也將滿足程序正確性,并且極大降低了模擬器平臺(tái)調(diào)試與更改的復(fù)雜度,同時(shí)節(jié)省了開發(fā)成本。不同于ATTILA模擬器,本文在對(duì)模擬器實(shí)現(xiàn)時(shí),使用倒序流水與虛假執(zhí)行的方式將功能模擬與時(shí)序模擬實(shí)現(xiàn)在同一模塊,增加了代碼的可讀性與可調(diào)試性。
GPU模擬器主要由3部分構(gòu)成,分別是模擬器驅(qū)動(dòng)程序、GPU固定功能單元和GPU可編程流處理器單元。其中GPU固定功能單元還包括光柵化單元。下面將依次對(duì)這些模塊進(jìn)行介紹。
為了快速方便地為GPU模擬器生成輸入數(shù)據(jù),GPU模擬器配套開發(fā)一套基于Mesa[16]驅(qū)動(dòng)程序的模擬器驅(qū)動(dòng)程序。模擬器驅(qū)動(dòng)程序可適配OpenGL等多款應(yīng)用程序接口,可以將正在運(yùn)行的OpenGL程序的信息抓取出來(lái)。所抓取信息包括頂點(diǎn)數(shù)據(jù)、紋理數(shù)據(jù)、OpenGL流水線狀態(tài)、GPU命令、著色器代碼。這些數(shù)據(jù)將作為GPU模擬器的輸入數(shù)據(jù)。
模擬器整體軟件架構(gòu)主要由Module和Queue 2個(gè)數(shù)據(jù)結(jié)構(gòu)與Clock函數(shù)構(gòu)成。Module用于構(gòu)建GPU中每一個(gè)功能單元,類似于Verilog HDL語(yǔ)言中關(guān)鍵詞module。Queue用于實(shí)現(xiàn)各個(gè)Module間通訊功能,同時(shí)實(shí)現(xiàn)各Module的解耦合。Queue在本質(zhì)上是一個(gè)每周期一寫一讀的循環(huán)隊(duì)列。具體實(shí)現(xiàn)方式如圖1所示。其中方框表示Module,對(duì)應(yīng)GPU中每一個(gè)部件。每個(gè)Module都具有自己的Clock函數(shù),該函數(shù)實(shí)現(xiàn)了對(duì)應(yīng)模塊在每個(gè)時(shí)鐘周期內(nèi)應(yīng)當(dāng)執(zhí)行的操作。連接線表示Queue,各個(gè)模塊通過(guò)Queue進(jìn)行數(shù)據(jù)傳遞。
圖1 GPU模擬器結(jié)構(gòu)示意圖
3.2.1 固定功能單元
固定功能單元包括GPU流水線中命令處理器(command processor,CP)、幾何處理引擎(geometry engine,GE)、圖元處理引擎(primitive engine,PE)、局部任務(wù)調(diào)度器(local task schedule,LTS)、輸出合并單元(output merge unit,OMU)、輸出總線(output bus,OB)。這些單元因?yàn)樗惴ㄝ^為單一固定,可以通過(guò)對(duì)寄存器進(jìn)行不同配置來(lái)實(shí)現(xiàn)不同的功能需求,并且其性能完全由結(jié)構(gòu)設(shè)計(jì)體現(xiàn)。為了對(duì)這些部件進(jìn)行完整的性能分析,本方法對(duì)這些單元使用周期精確的方式進(jìn)行實(shí)現(xiàn)。
在對(duì)上述模塊進(jìn)行周期精確模擬時(shí),由于有些處理單元具有多個(gè)流水級(jí),且每個(gè)流水級(jí)又包括多級(jí)細(xì)分流水級(jí),所以在進(jìn)行模擬器實(shí)現(xiàn)時(shí),本方法通過(guò)兩層逆序流水的方式對(duì)圖元處理引擎進(jìn)行實(shí)現(xiàn)。下文使用圖元處理引擎的實(shí)現(xiàn)方式進(jìn)行說(shuō)明。
圖元處理引擎結(jié)構(gòu)各流水級(jí)完成各種不同數(shù)據(jù)的乘加運(yùn)算或其他數(shù)學(xué)運(yùn)算,所有運(yùn)算部件設(shè)計(jì)為全流水部件,流水級(jí)內(nèi)部同樣實(shí)現(xiàn)更細(xì)粒度的周期模擬。流水級(jí)內(nèi)部通過(guò)虛假執(zhí)行與逆序流水的方式實(shí)現(xiàn)細(xì)分流水。圖2表示2個(gè)流水級(jí)之間的數(shù)據(jù)傳遞與數(shù)據(jù)計(jì)算,每一流水級(jí)包括4級(jí)細(xì)分流水級(jí)。如第1步所示,Clock函數(shù)執(zhí)行時(shí),后序流水級(jí)首先判定其最后一級(jí)細(xì)分流水級(jí)是否為空,如果為空,則將其前3級(jí)細(xì)分流水?dāng)?shù)據(jù)傳遞至后一級(jí)細(xì)分流水級(jí),同時(shí)將第1級(jí)細(xì)分流水級(jí)標(biāo)為空。如第2步所示,當(dāng)前序流水級(jí)最后1級(jí)細(xì)分流水級(jí)不為空,且后序流水級(jí)第1級(jí)細(xì)分流水級(jí)為空時(shí),前序流水級(jí)將數(shù)據(jù)傳遞至后序流水級(jí),后序流水級(jí)直接將數(shù)據(jù)進(jìn)行計(jì)算,并將結(jié)果寫入后序流水級(jí)第1級(jí)細(xì)分流水級(jí)。如第3步所示,前序流水級(jí)進(jìn)行流水級(jí)內(nèi)細(xì)分流水級(jí)數(shù)據(jù)傳遞。圖元處理引擎將整條流水線逆向調(diào)用所有流水級(jí)的Clock操作,來(lái)實(shí)現(xiàn)整條流水線的并行周期執(zhí)行。
圖2 Clock函數(shù)逆序流水實(shí)現(xiàn)方式
3.2.2 光柵化單元
光柵化單元是圖元處理引擎中一個(gè)固定算法單元,本模擬器光柵化單元基于Larrabee[17,18]算法進(jìn)行實(shí)現(xiàn),該算法使用遞歸算法來(lái)實(shí)現(xiàn)。高級(jí)語(yǔ)言可以通過(guò)使用棧這一數(shù)據(jù)結(jié)構(gòu)來(lái)保存遞歸算法的中間數(shù)據(jù),但遞歸中無(wú)法預(yù)知遞歸調(diào)用的深度,繼而無(wú)法預(yù)知中間結(jié)果數(shù)據(jù)量的大小。而且在硬件設(shè)計(jì)中,存儲(chǔ)單元代價(jià)比較大,所以不便于使用單純意義上的遞歸程序來(lái)實(shí)現(xiàn)光柵化算法。本工作中GPU模擬器通過(guò)將光柵化核心算法單元復(fù)制多份來(lái)實(shí)現(xiàn)不同層級(jí)的遞歸調(diào)用,光柵化單元分為7級(jí)。第1級(jí)負(fù)責(zé)根據(jù)接受到的數(shù)據(jù)生成光柵化所必需的數(shù)據(jù)結(jié)構(gòu),其余流水級(jí)將寬度為2n正方形片段數(shù)據(jù)生成寬度為2(n-1)的正方形片段數(shù)據(jù),然后將產(chǎn)生的結(jié)果傳遞至其后一級(jí)流水級(jí)。這種結(jié)構(gòu)通過(guò)增大邏輯單元面積來(lái)減小存儲(chǔ)單元的消耗,解決了遞歸深度不可預(yù)知的問(wèn)題,同時(shí)穩(wěn)定地保證了光柵化單元每周期產(chǎn)生1組4×4的像素點(diǎn)數(shù)據(jù)的速率,使光柵化部件不會(huì)成為整條流水線的瓶頸。
3.2.3 可編程流處理器單元
可編程流處理器單元支持OpenGL 2.0標(biāo)準(zhǔn)中的統(tǒng)一著色器功能,統(tǒng)一著色器可執(zhí)行頂點(diǎn)著色器與片段著色器2種著色器程序,模擬器實(shí)現(xiàn)為4份,在圖1中由SP0、SP1、SP2、SP3表示。可編程流處理器與傳統(tǒng)較為簡(jiǎn)單多流水級(jí)CPU的結(jié)構(gòu)類似,包括取指、譯碼、執(zhí)行、寫回等流水級(jí),不易使用C++串行語(yǔ)言進(jìn)行模擬,所以可編程流處理器單元實(shí)現(xiàn)為功能級(jí)模擬。GPU模擬器配套開發(fā)環(huán)境下的編譯器將OpenGL程序中編寫的著色器程序編譯為對(duì)應(yīng)GPU模擬器流處理器的匯編代碼,在功能級(jí)模擬下流處理器每拍直接完成一條指令。
為了驗(yàn)證本文提出模擬器的3D圖形算法正確性驗(yàn)證的功能與性能分析的功能,本文采用glmark2[19]測(cè)試程序?qū)PU模擬器進(jìn)行實(shí)驗(yàn)測(cè)試。glmark2是一款由Alexandros Frantzis與Jesse Barker開發(fā)的OpenGL API程序測(cè)試集,包括涵蓋了OpenGL 2.0 API[20]大部分功能的多個(gè)測(cè)試場(chǎng)景,這些測(cè)試場(chǎng)景所實(shí)現(xiàn)的圖片效果較為簡(jiǎn)單,可以輕易判定功能實(shí)現(xiàn)的正確性。實(shí)驗(yàn)分為3D圖形正確性驗(yàn)證與算法性能驗(yàn)證兩部分展開。
本文通過(guò)對(duì)glmark2中build測(cè)試項(xiàng)的正確性分析來(lái)表現(xiàn)模擬器3D圖形算法正確性驗(yàn)證的功能。
在3D圖形算法正確性驗(yàn)證實(shí)驗(yàn)中,本文將商業(yè)顯卡GPU執(zhí)行OpenGL程序渲染得到的圖片與模擬器渲染得到的圖片進(jìn)行對(duì)比。為確保數(shù)據(jù)一致性,商業(yè)顯卡GPU所執(zhí)行的OpenGL程序輸入數(shù)據(jù)也來(lái)自于本文中使用的模擬器輸入數(shù)據(jù)。
GPU模擬器繪制圖片與商業(yè)顯卡GPU繪制的圖片存在差異與錯(cuò)誤2種不同。差異是GPU進(jìn)行具體實(shí)現(xiàn)時(shí)選擇了不同實(shí)現(xiàn)方式而引起的不同,例如固定功能管線使用大量的數(shù)學(xué)運(yùn)算實(shí)現(xiàn)復(fù)雜的圖形算法,不同GPU設(shè)計(jì)人員在選擇不同的數(shù)據(jù)計(jì)算精度與不同的數(shù)據(jù)傳輸精度時(shí),將不可避免地引入差異。這種差異在商業(yè)顯卡,如AMD GPU與Nvidia GPU之間同樣有體現(xiàn)。它們通常表現(xiàn)為像素點(diǎn)的顏色值偏差與像素點(diǎn)的位置偏差,但這并不影響圖形應(yīng)用的效果展示,且肉眼無(wú)法分別。圖形功能性錯(cuò)誤則是由于固定功能管線中圖形算法的錯(cuò)誤選取或者錯(cuò)誤實(shí)現(xiàn)引起的,也有可能是因?yàn)榭删幊虇卧兄噶畹腻e(cuò)誤實(shí)現(xiàn)而引起。這種錯(cuò)誤通常表現(xiàn)為模型位置大幅偏移、像素點(diǎn)缺失、像素顏色值錯(cuò)誤,肉眼可輕易辨別。
對(duì)比實(shí)驗(yàn)中,商業(yè)顯卡GPU實(shí)驗(yàn)環(huán)境為操作系統(tǒng)是Fedora 28,GPU為Nvidia 1660Ti,驅(qū)動(dòng)程序?yàn)镹VIDIA-Linux-x86_64-418.88。
圖3是商業(yè)顯卡GPU環(huán)境下build測(cè)試項(xiàng)的標(biāo)準(zhǔn)渲染結(jié)果,圖4是GPU模擬器渲染結(jié)果。對(duì)比發(fā)現(xiàn),肉眼無(wú)法看出2圖之間的差別。對(duì)圖3與圖4進(jìn)行逐像素對(duì)比,對(duì)比方式為對(duì)2圖中每一相同位置像素值進(jìn)行做差運(yùn)算,差值結(jié)果為正數(shù),則將差值數(shù)據(jù)保存至圖5,差值結(jié)果為負(fù)數(shù),則將差值數(shù)據(jù)絕對(duì)值保存至圖6。對(duì)圖5與圖6進(jìn)行對(duì)比,可以發(fā)現(xiàn)圖5呈現(xiàn)出build測(cè)試場(chǎng)景的下邊沿,圖6則呈現(xiàn)出build測(cè)試場(chǎng)景的上邊沿,表示圖3與圖4存在輕微的位置偏移,這是由于光柵化算法的實(shí)現(xiàn)不同所引起,屬于差異而不是錯(cuò)誤。而圖5與圖6中除了模型邊沿?cái)?shù)據(jù),不再有其他差別,表明GPU模擬器對(duì)build測(cè)試項(xiàng)繪制正確。
圖3 商業(yè)顯卡GPU繪制效果圖
圖4 GPU模擬器繪制效果圖
圖5 差異值正值效果圖
圖6 差異值負(fù)值效果圖
本文選取Intel曾經(jīng)在Larrabee論文中提到的結(jié)構(gòu)光柵化算法來(lái)表現(xiàn)模擬器性能評(píng)估的功能。
結(jié)構(gòu)光柵化算法根據(jù)待光柵化三角形的包圍框數(shù)據(jù),將屏幕空間對(duì)應(yīng)的區(qū)域劃分為多個(gè)正方形Tile,通過(guò)檢測(cè)每個(gè)Tile的4個(gè)頂點(diǎn)與三角形3條邊的位置關(guān)系來(lái)判定當(dāng)前Tile是否與三角形產(chǎn)生了覆蓋關(guān)系。這一方法雖然效率比較高,但并不能保證所有被判定為覆蓋的Tile是真正地與三角形產(chǎn)生覆蓋關(guān)系,如圖7所示,Tile被判定為與黑色小三角形覆蓋,但其實(shí)并沒(méi)有覆蓋。Larrabee論文表示可以通過(guò)增加包圍框測(cè)試對(duì)結(jié)果進(jìn)行進(jìn)一步確認(rèn),這樣可以減少被誤判定為與三角形虛假覆蓋的Tile個(gè)數(shù),但是該論文也表明,無(wú)法確認(rèn)增加包圍框測(cè)試是否會(huì)提升光柵化性能。
本文通過(guò)對(duì)GPU模擬器實(shí)現(xiàn)2種不同算法來(lái)對(duì)增加包圍框是否對(duì)光柵化算法有明顯提升這一結(jié)論進(jìn)行驗(yàn)證。光柵化操作只與圖形程序中待繪制模型的幾何特性有關(guān),在刪去glmark2中重復(fù)模型后,選取了build、shadow、refract、buffer、bump、loop、jellyfish、ideas、terrain測(cè)試項(xiàng)進(jìn)行實(shí)驗(yàn)。
圖7 遞歸光柵化算法[19]
如3.2節(jié)與Larrabee論文所述,本文將光柵化算法實(shí)現(xiàn)7級(jí)處理。第1級(jí)接受128×128的Tile數(shù)據(jù),將該Tile等分為4個(gè)64×64的SubTile,通過(guò)接受點(diǎn)與拒絕點(diǎn)測(cè)試算法測(cè)試后輸出每一個(gè)SubTile與三角形的覆蓋狀態(tài),覆蓋狀態(tài)為True的SubTile將作為第2級(jí)的輸入數(shù)據(jù)繼續(xù)進(jìn)行測(cè)試。圖8表示算法測(cè)試結(jié)果,其中build、shadow、refract、ideas、terrain在第6級(jí)與第7級(jí)表現(xiàn)出超過(guò)10%的性能提升,refract在第6級(jí)表現(xiàn)出最高31.1%的性能提升;buffer、loop、jellyfish在第5級(jí)表現(xiàn)出超過(guò)10%的性能提升;bump性能提升并不明顯;而除了bump外,各個(gè)模型在第1級(jí)第2級(jí)第3級(jí)幾乎沒(méi)有性能提升。結(jié)合各個(gè)模型不同像素?cái)?shù)目,綜合計(jì)算得出這9個(gè)測(cè)試模型的加權(quán)平均性能提升了10.11%。結(jié)果表明在增加包圍框測(cè)試后,光柵化算法得到了明顯的性能提升。
圖8 包圍框算法優(yōu)化前后對(duì)比圖
GPU模擬器通過(guò)使用高級(jí)語(yǔ)言模擬仿真實(shí)現(xiàn)硬件描述語(yǔ)言,在處理器結(jié)構(gòu)設(shè)計(jì)前期起到重要的驗(yàn)證作用。本文基于GPU由固定功能管線與可編程流處理器單元構(gòu)成這一特點(diǎn),同時(shí)基于GPU各部件天然解耦合的性質(zhì),提出半周期精確的GPU模擬器設(shè)計(jì)方法。這一方法基于逆序流水與虛假執(zhí)行的方式,將固定功能管線實(shí)現(xiàn)為周期精確模擬,將可編程流處理器單元實(shí)現(xiàn)為指令級(jí)模擬。該方法降低了GPU模擬器開發(fā)成本,同時(shí)也降低了GPU模擬器使用者對(duì)模擬器的學(xué)習(xí)成本。
本文基于此方法設(shè)計(jì)并實(shí)現(xiàn)了GPU模擬器。該模擬器實(shí)現(xiàn)了OpenGL 2.0 API,在配套使用GPU模擬器驅(qū)動(dòng)程序的情況下,可執(zhí)行完整的OpenGL 2.0圖形程序。本文選取了glmark2測(cè)試集對(duì)GPU模擬器進(jìn)行驗(yàn)證,同時(shí)選取了Larrabee中結(jié)構(gòu)光柵化算法進(jìn)行算法性能評(píng)估。模擬器使用者可以基于模擬器驅(qū)動(dòng)程序運(yùn)行其他OpenGL 2.0程序,還可以對(duì)該模擬器增加新的功能與新的算法,同時(shí)也可以使用其他OpenGL 2.0程序作為模擬器的輸入,進(jìn)行不同算法的功能正確性驗(yàn)證與性能評(píng)估。