• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      高性能GPU模擬器驅(qū)動(dòng)設(shè)計(jì)研究①

      2020-06-09 05:09:02趙士彭張立志趙皓宇蘇孟豪
      高技術(shù)通訊 2020年5期
      關(guān)鍵詞:模擬器命令頂點(diǎn)

      趙士彭 張立志 趙皓宇 蘇孟豪* 劉 蘇*

      (*計(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)

      0 引 言

      目前,圖形處理單元(graphics processing unit,GPU)已經(jīng)廣泛存在于個(gè)人電腦、移動(dòng)設(shè)備之中。GPU作為圖形加速器,在游戲、通用計(jì)算、圖像處理等領(lǐng)域都起到了十分顯著的作用。在現(xiàn)代個(gè)人計(jì)算機(jī)系統(tǒng)中,GPU已經(jīng)變得越來(lái)越不可或缺[1],且變得越來(lái)越復(fù)雜[2-4]。中央處理器(central processing unit,CPU)[5]不再獨(dú)立處理圖形工作,將需要處理的圖形工作轉(zhuǎn)交給GPU執(zhí)行,從而大幅提高系統(tǒng)的整體性能。GPU一般以插卡的方式,通過(guò)主板上的圖形加速接口(accelerated graphics port,AGP)或高速串行計(jì)算機(jī)擴(kuò)展總線標(biāo)準(zhǔn)(peripheral component interconnect express,PCIe)插槽與CPU進(jìn)行通信。GPU目前已經(jīng)逐漸面向通用,通用GPU(GPGPU)[6]已經(jīng)在通用計(jì)算、機(jī)器學(xué)習(xí)、人工智能等相關(guān)領(lǐng)域發(fā)揮不可替代的作用。當(dāng)前的GPU支持DirectX、OpenGL、OpenGL ES等應(yīng)用程序接口(application programming interface,API)。DirectX[7]用于Windows操作系統(tǒng),OpenGL[8]用于Linux操作系統(tǒng),OpenGL ES[9]用于安卓和IOS操作系統(tǒng)。這些API都需要GPU的驅(qū)動(dòng)進(jìn)行處理,轉(zhuǎn)換為GPU硬件可識(shí)別的狀態(tài)和命令等。隨著GPU越來(lái)越通用,當(dāng)前的GPU已經(jīng)擁有了統(tǒng)一的可編程著色器(shader),這使GPU已經(jīng)成為一種可編程處理器。統(tǒng)一的可編程shader使GPU的可編程性和靈活性大大提高,與此同時(shí),驅(qū)動(dòng)也自然承擔(dān)起GPU編譯器的任務(wù)[10,11]。GPU其他功能部件的可配置性也越來(lái)越高,這些都需要驅(qū)動(dòng)負(fù)責(zé)處理。作為CPU與GPU之間交互的橋梁,驅(qū)動(dòng)還負(fù)責(zé)GPU的任務(wù)管理調(diào)度等相關(guān)工作,這在GPU研發(fā)工作中必不可少。目前GPU的驅(qū)動(dòng)多為閉源驅(qū)動(dòng),各硬件廠商根據(jù)自身GPU硬件進(jìn)行設(shè)計(jì)。鑒于驅(qū)動(dòng)的代碼量巨大,難度很高,本文提出了一種基于Mesa開(kāi)源驅(qū)動(dòng)框架的驅(qū)動(dòng)設(shè)計(jì)方法,本方法可以借用Mesa開(kāi)源驅(qū)動(dòng),實(shí)現(xiàn)模擬器的驅(qū)動(dòng)設(shè)計(jì),大幅度減小開(kāi)發(fā)難度并減少代碼量。

      1 研究背景

      1.1 3D圖形流水線

      3D圖形流水線是根據(jù)OpenGL、DirectX等API給出的圖形渲染流程,它們指導(dǎo)了渲染的每一個(gè)步驟。流水線涉及GPU中的渲染算法,描述了從圖形API到點(diǎn),再到圖元,最后變?yōu)?D圖像輸出到幀緩沖區(qū)的整體過(guò)程。首先,從圖形API中獲得頂點(diǎn)數(shù)據(jù)流,之后,將這些數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的圖元,并通過(guò)光柵化階段變?yōu)?D像素塊用做最終顯示。文獻(xiàn)[12-14]對(duì)GPU的結(jié)構(gòu)和流水線做了更為詳細(xì)的介紹。

      圖形流水線的渲染包括以下階段。

      頂點(diǎn)獲取頂點(diǎn)獲取階段是從圖形API中獲取包括頂點(diǎn)的位置、屬性以及紋理等相關(guān)信息,并將相關(guān)信息傳遞給后面的流水線。

      頂點(diǎn)著色器頂點(diǎn)著色器階段是將頂點(diǎn)的位置、屬性等信息通過(guò)矩陣運(yùn)算等方式轉(zhuǎn)換為對(duì)應(yīng)的屏幕坐標(biāo)和需要的屬性,并交給圖元組裝階段。

      圖元組裝圖元組裝將頂點(diǎn)著色器輸出的位置信息與圖元連接信息對(duì)應(yīng),將頂點(diǎn)組裝成對(duì)應(yīng)的圖元,例如點(diǎn)、線或三角形等。并將圖元交給光柵化階段。

      光柵化光柵化階段是將圖元變?yōu)楠?dú)立的像素點(diǎn),即將3D的圖元變?yōu)?D的像素塊,同時(shí)計(jì)算每個(gè)像素塊的插值系數(shù),并將這些信息發(fā)送給片段著色器。

      片段著色器片段著色器為每個(gè)像素針對(duì)插值系數(shù)進(jìn)行插值運(yùn)算,使每個(gè)像素塊都擁有自己的屬性等信息。

      輸出混合輸出混合階段是將每個(gè)像素塊進(jìn)行透明度、模板和深度等相干測(cè)試,剔除掉不需要顯示的像素塊。之后經(jīng)過(guò)混合后輸出到幀緩沖區(qū)進(jìn)行顯示。

      1.2 Mesa開(kāi)源驅(qū)動(dòng)架構(gòu)

      Mesa[15]是一款開(kāi)源的用戶級(jí)驅(qū)動(dòng),經(jīng)過(guò)多年的發(fā)展,已經(jīng)支持OpenGL、OpenGL ES、OpenCL[16]、Vulkan等多種API。在硬件驅(qū)動(dòng)方面,Intel、Nvidia、AMD等廠商的多款GPU已經(jīng)適配。如今,Mesa已經(jīng)成為L(zhǎng)inux操作系統(tǒng)中使用較為廣泛的用戶級(jí)顯卡驅(qū)動(dòng)之一。

      Mesa的主要任務(wù)是將API的數(shù)據(jù)及狀態(tài)處理為硬件驅(qū)動(dòng)需要的命令、狀態(tài)、指令等。當(dāng)前的Mesa為了方便驅(qū)動(dòng)開(kāi)發(fā)者對(duì)不同的設(shè)備進(jìn)行驅(qū)動(dòng)開(kāi)發(fā),在原驅(qū)動(dòng)架構(gòu)中抽象出了Gallium[17]架構(gòu)。Gallium架構(gòu)是在原Mesa驅(qū)動(dòng)中抽象出與硬件相關(guān)的部分?;贕allium架構(gòu),驅(qū)動(dòng)開(kāi)發(fā)者可無(wú)需重復(fù)開(kāi)發(fā)與硬件無(wú)關(guān)的代碼,大量減少了開(kāi)發(fā)驅(qū)動(dòng)的代碼量及開(kāi)發(fā)難度。

      目前,Mesa驅(qū)動(dòng)的架構(gòu)主要分為3大部分,即API層,硬件層和系統(tǒng)層。圖1是Mesa開(kāi)源驅(qū)動(dòng)架構(gòu)的結(jié)構(gòu)圖。API層是Mesa驅(qū)動(dòng)中負(fù)責(zé)處理API接口的位置,包含Mesa和state tracker兩部分,這兩部分的實(shí)現(xiàn)均與硬件無(wú)關(guān)。經(jīng)過(guò)API層后,API的數(shù)據(jù)和狀態(tài)會(huì)被轉(zhuǎn)換為硬件層中與硬件無(wú)關(guān)的接口。硬件層的主體是Gallium架構(gòu)。經(jīng)過(guò)了硬件層的處理,需要渲染的數(shù)據(jù)和狀態(tài)已經(jīng)轉(zhuǎn)換為硬件可識(shí)別的命令、狀態(tài)和指令等。這些數(shù)據(jù)會(huì)經(jīng)由系統(tǒng)層與內(nèi)核級(jí)驅(qū)動(dòng)(direct rendering manager,DRM)交互,將有關(guān)數(shù)據(jù)傳入CPU與GPU的共享內(nèi)存上。這樣,GPU就可以通過(guò)命令處理器(command processor,CP)獲取需要的數(shù)據(jù)。

      圖1 Mesa開(kāi)源驅(qū)動(dòng)架構(gòu)

      2 高性能GPU模擬器

      本文使用的高性能GPU模擬器主要由命令處理器(command processor,CP)、全局任務(wù)調(diào)度器(global task scheduler,GTS)、圖形處理集群(graphics processing cluster,GPC)、二級(jí)靜態(tài)緩存(L2 Scache)、內(nèi)存控制器(memory controller,MC)5部分組成。其中圖形處理集群又由計(jì)算處理引擎(compute engine,CE)、幾何處理引擎(geometry engine,GE)、圖元處理引擎(primitive engine,PE)、局部任務(wù)調(diào)度器(local task scheduler,LTS)、流處理器集群(stream processor cluster,SPC)、輸出合并單元(output merge unit,OMU)6部分組成。整體結(jié)構(gòu)如圖2所示。

      圖2 高性能GPU模擬器的頂層結(jié)構(gòu)

      本文使用的高性能GPU模擬器是一個(gè)由C++語(yǔ)言編寫(xiě)的GPU模擬器。其設(shè)計(jì)目的是對(duì)gsgpu結(jié)構(gòu)設(shè)計(jì)做功能驗(yàn)證與一定程度的性能分析,該結(jié)構(gòu)后續(xù)還將使用現(xiàn)場(chǎng)可編程門(mén)陣列(field progrmmable gate arry,F(xiàn)PGA)進(jìn)行更深一步功能驗(yàn)證,最終流片,所以在整個(gè)GPU設(shè)計(jì)計(jì)劃中,模擬器只是一個(gè)階段性產(chǎn)物,而不像ATTILA模擬器作為最終實(shí)驗(yàn)平臺(tái),所以簡(jiǎn)單高效地實(shí)現(xiàn)GPU模擬器是當(dāng)前計(jì)劃中很重要的標(biāo)準(zhǔn)。GPU模擬器整體軟件架構(gòu)由Module與Queue 2個(gè)數(shù)據(jù)結(jié)構(gòu)搭建。Module構(gòu)建每一個(gè)功能模塊,類似于Verilog語(yǔ)言中module模塊。Queue構(gòu)建各個(gè)module間通訊模塊,同時(shí)實(shí)現(xiàn)各module的解耦合,Queue本質(zhì)是一個(gè)每周期一寫(xiě)一讀的循環(huán)隊(duì)列。

      3 高性能GPU模擬器驅(qū)動(dòng)

      3.1 模擬器驅(qū)動(dòng)架構(gòu)

      高性能GPU模擬器的驅(qū)動(dòng)需要為模擬器提供數(shù)據(jù)、命令、狀態(tài)以及shader需要的指令等信息。這些信息是驅(qū)動(dòng)從API中獲得并通過(guò)處理后得到的。驅(qū)動(dòng)的設(shè)計(jì)共分為3個(gè)階段。首先,API經(jīng)過(guò)Mesa的API層轉(zhuǎn)化為Gallium架構(gòu)下與硬件無(wú)關(guān)的狀態(tài),同時(shí)將OpenGL著色器語(yǔ)言(OpenGL shading language,GLSL)轉(zhuǎn)化為T(mén)GSI(Tungsten graphics shader infrastructure)[18]中間語(yǔ)言;然后,硬件層將硬件無(wú)關(guān)狀態(tài)轉(zhuǎn)化為與硬件相關(guān)的狀態(tài),同時(shí)產(chǎn)生硬件執(zhí)行所需的命令等信息,并將TGSI中間語(yǔ)言轉(zhuǎn)化為GPU模擬器的匯編;最后,將每一幀的信息處理為硬件需要的可讀的接口信息,同時(shí)將信息傳入模擬器的顯存中等待執(zhí)行渲染。

      驅(qū)動(dòng)設(shè)計(jì)中,Mesa的硬件層是設(shè)計(jì)的重點(diǎn)部分,硬件層的設(shè)計(jì)也同時(shí)指導(dǎo)了模擬器接口的設(shè)計(jì),對(duì)模擬器的設(shè)計(jì)起到了指導(dǎo)作用。Mesa的API層是與硬件無(wú)關(guān)的部分,是可重用的部分,所以在設(shè)計(jì)中采用了API層的結(jié)構(gòu)。Mesa驅(qū)動(dòng)的系統(tǒng)層中與DRM交互的部分,在GPU模擬器中也無(wú)需實(shí)現(xiàn),所以沒(méi)有采用。

      3.2 硬件驅(qū)動(dòng)設(shè)計(jì)

      硬件驅(qū)動(dòng)的設(shè)計(jì)主要是在Mesa驅(qū)動(dòng)的Gallium架構(gòu)下實(shí)現(xiàn)的。在Mesa的API層中,API的數(shù)據(jù)及狀態(tài)已經(jīng)轉(zhuǎn)換成了Gallium架構(gòu)中與硬件無(wú)關(guān)的接口。在硬件驅(qū)動(dòng)的設(shè)計(jì)中,需要考慮繪制進(jìn)入接口、狀態(tài)對(duì)象接口、緩存及中斷接口和刷新接口等。

      首先,驅(qū)動(dòng)為GPU模擬器中的命令處理器準(zhǔn)備命令隊(duì)列,命令隊(duì)列是用于控制GPU模擬器執(zhí)行整體渲染的一組命令。驅(qū)動(dòng)為GPU模擬器準(zhǔn)備的命令隊(duì)列設(shè)計(jì)為draw、sync、dump和halt 4個(gè)主要命令。

      Draw命令是一條渲染命令,也是整個(gè)渲染的核心命令。當(dāng)執(zhí)行draw命令時(shí),GPU模擬器會(huì)調(diào)用已經(jīng)準(zhǔn)備在顯存中的draw_info、pipe_state和shader_state等一些必要的狀態(tài)。命令處理器準(zhǔn)備好各狀態(tài)后,會(huì)將頂點(diǎn)、流水線狀態(tài)等信息通過(guò)全局任務(wù)調(diào)度器逐個(gè)發(fā)給幾何計(jì)算引擎。幾何計(jì)算引擎執(zhí)行頂點(diǎn)子塊處理任務(wù)后,LTS 做SPC資源管理,查找合適的SPC,并把線程組任務(wù)發(fā)過(guò)去。然后,SPC執(zhí)行頂點(diǎn)著色器(vertex shader,VS) 程序,GE 跟蹤VS 的位置輸出,按原始頂點(diǎn)順序?qū)?yīng)的微塊順序,讀出頂點(diǎn)位置數(shù)據(jù),并進(jìn)行廣播。之后,PE對(duì)圖元進(jìn)行光柵化,LTS 根據(jù)資源情況,查找合適的SPC,把線程組任務(wù)發(fā)送過(guò)去,SPC執(zhí)行片段著色器(fragment shader,F(xiàn)S) 程序。最后,PE將排完序的片段結(jié)果送到OMU,OMU進(jìn)行后處理。

      Sync命令是一條同步命令,用于同步GPU模擬器中的各個(gè)模塊。在整條流水線中,各模塊之間會(huì)依次傳遞一個(gè)last狀態(tài)。當(dāng)模塊收到last狀態(tài),則說(shuō)明本次draw_call渲染已經(jīng)結(jié)束,模塊會(huì)向命令處理器返回已經(jīng)處理結(jié)束的信號(hào)。當(dāng)執(zhí)行sync命令時(shí),命令處理器會(huì)進(jìn)入等待狀態(tài),不會(huì)繼續(xù)執(zhí)行命令隊(duì)列中的其他命令。只有當(dāng)收到所有模塊處理結(jié)束的信號(hào)后,才繼續(xù)執(zhí)行命令隊(duì)列中的其他命令。

      Dump命令是一條顯示命令,用于將已經(jīng)渲染完成的draw_call顯示出來(lái)。當(dāng)命令處理器執(zhí)行dump命令時(shí),命令處理器會(huì)調(diào)用顯存控制器,將顯存中幀緩沖區(qū)渲染好的像素顯示到屏幕上。

      Halt命令是停機(jī)命令,用于停止GPU模擬器的所有工作。當(dāng)命令處理器執(zhí)行halt命令時(shí),整個(gè)GPU模擬器將停止所有模塊的執(zhí)行,GPU模擬器進(jìn)入停機(jī)狀態(tài)。

      其次,為了使幾何計(jì)算引擎和頂點(diǎn)著色器準(zhǔn)確獲取頂點(diǎn)和屬性信息,驅(qū)動(dòng)需要配置與頂點(diǎn)和屬性相關(guān)的狀態(tài)。Draw_info是驅(qū)動(dòng)配置的一次draw_call的相關(guān)信息,包括:起始頂點(diǎn)start,用于索引提前準(zhǔn)備在顯存頂點(diǎn)區(qū)域的第一個(gè)頂點(diǎn)位置;本次draw_call的頂點(diǎn)數(shù)量count,用于索引顯存中頂點(diǎn)區(qū)域用于本次渲染的頂點(diǎn)。每個(gè)圖元的頂點(diǎn)數(shù),用于圖元處理引擎進(jìn)行圖元組裝;index_buffer用于頂點(diǎn)使用索引緩沖的情況下進(jìn)行頂點(diǎn)在顯存中位置的描述。

      為了增強(qiáng)GPU模擬器固定管線的可配置性,驅(qū)動(dòng)需要配置相應(yīng)狀態(tài)給對(duì)應(yīng)的固定管線模塊。這些配置信息就是API層傳下來(lái)與硬件無(wú)關(guān)的狀態(tài)。這些狀態(tài)的接口是Gallium架構(gòu)中的pipe層。在高性能圖形GPU中,有2個(gè)主要的固定管線,一個(gè)是圖元處理引擎,用于圖元的組裝以及光柵化;另一個(gè)是輸出合并單元,用于像素的測(cè)試和混合。本設(shè)計(jì)將pipe層的狀態(tài)處理為供圖元處理引擎使用的光柵化及裁剪等狀態(tài),以及供輸出合并單元使用的深度測(cè)試狀態(tài)、模板測(cè)試狀態(tài)和混合狀態(tài)。這些狀態(tài)被轉(zhuǎn)換成32位的二進(jìn)制,傳入GPU模擬器的顯存中。

      Rasterizer_state是用于PE使用的狀態(tài),包含了光柵化所需要的點(diǎn)大小、線寬、多重采樣等所有配置信息。viewport_state和clip_state也是用于PE使用的狀態(tài),告知PE視口的大小以及裁剪的大小,以便光柵化使用。Alpha_state、depth_state和stencil_state是OMU使用的狀態(tài),分別用于OMU的透明度測(cè)試、深度測(cè)試和模板測(cè)試。驅(qū)動(dòng)將對(duì)應(yīng)的測(cè)試算法告知OMU,由OMU調(diào)用深度和模板的緩沖完成所有測(cè)試,3種測(cè)試分別有7種不同的測(cè)試算法可以配置。Blend_state也是OMU使用的狀態(tài),驅(qū)動(dòng)將混合算法告知OMU后,OMU調(diào)用渲染目標(biāo)(render target)進(jìn)行混合后,將結(jié)果寫(xiě)入幀緩沖區(qū)(framebuffer)等待最后的顯示,其中,混合共有19種不同算法。

      為了進(jìn)一步提高GPU模擬器的可編程性,GPU模擬器采用了統(tǒng)一的可編程shader。這就需要驅(qū)動(dòng)為可編程的shader準(zhǔn)備相應(yīng)的狀態(tài)以及所需寄存器個(gè)數(shù)等信息。本設(shè)計(jì)中,shader_state對(duì)標(biāo)量通用寄存器和向量通用寄存器的數(shù)量等信息進(jìn)行了描述。這些信息由驅(qū)動(dòng)根據(jù)shader執(zhí)行的匯編程序及其狀態(tài)產(chǎn)生。

      3.3 編譯器設(shè)計(jì)

      隨著GPU的可編程性越來(lái)越高,驅(qū)動(dòng)中對(duì)于GPU編譯器的設(shè)計(jì)也越來(lái)越重要。在Mesa驅(qū)動(dòng)架構(gòu)中,Mesa提供了GPU編譯器的前端代碼。通過(guò)Mesa驅(qū)動(dòng)中的編譯器前端,可以將GLSL等編程語(yǔ)言翻譯為一種叫TGSI的中間語(yǔ)言。TGSI語(yǔ)言是Mesa為所有的GPU提供的唯一中間語(yǔ)言。本設(shè)計(jì)主要針對(duì)TGSI的中間語(yǔ)言進(jìn)行進(jìn)一步的編譯器后端設(shè)計(jì)。表1中是一個(gè)彩色正方形程序,通過(guò)Mesa的API層編譯成的TGSI中間語(yǔ)言。表中,VERT代表當(dāng)前是頂點(diǎn)著色器對(duì)應(yīng)的程序,PROPERTY NEXT_SHADER FRAG代表對(duì)應(yīng)的下一個(gè)shader程序是片段著色器程序。DCL聲明了有2個(gè)輸入,IN0是頂點(diǎn)位置信息,IN1是頂點(diǎn)屬性信息。同時(shí)還聲明了2個(gè)輸出OUT0、OUT1,一個(gè)常量緩存CONST0和一個(gè)臨時(shí)緩存TEMP0。之后進(jìn)行4×4的矩陣乘法,MUL表示乘法運(yùn)算,MAD表示乘加運(yùn)算,之后將結(jié)果輸出到OUT0。IN1直接輸出給OUT1?;贛esa框架,模擬器驅(qū)動(dòng)將TGSI中間語(yǔ)言根據(jù)語(yǔ)法語(yǔ)義進(jìn)一步編譯為GPU模擬器的匯編代碼。

      表1 正方形在Mesa中翻譯為T(mén)GSI中間語(yǔ)言

      表2是將TGSI中間語(yǔ)言的4×4矩陣乘法部分轉(zhuǎn)換為GPU模擬器匯編后的代碼部分。這部分是將原TGSI的MUL和MAD構(gòu)成的矩陣乘法變?yōu)镚PU模擬器的匯編語(yǔ)言,可編程的shader將執(zhí)行這段匯編程序完成矩陣的乘法運(yùn)算。其中MUL是進(jìn)行乘法運(yùn)算,MAD是進(jìn)行乘加運(yùn)算。S代表標(biāo)量通用寄存器,是從常量緩存CONST0取出的數(shù)據(jù),是驅(qū)動(dòng)準(zhǔn)備好的4×4矩陣。V代表向量通用寄存器,是頂點(diǎn)的位置信息,由輸出傳入。

      表2 4X4的矩陣乘法翻譯后的GPU匯編

      3.4 模擬器的驅(qū)動(dòng)接口設(shè)計(jì)

      當(dāng)所有數(shù)據(jù)、狀態(tài)、命令和shader指令準(zhǔn)備好之后,都將傳入到顯存之中,以便GPU模擬器根據(jù)命令隊(duì)列進(jìn)行執(zhí)行。根據(jù)前述的驅(qū)動(dòng)設(shè)計(jì),本文提出了高性能GPU模擬器的接口設(shè)計(jì),用于指導(dǎo)模擬器的結(jié)構(gòu)設(shè)計(jì)。該接口可將每一幀中驅(qū)動(dòng)寫(xiě)入GPU模擬器的所有信息變?yōu)榭勺x信息,更加方便了后續(xù)的調(diào)試。同時(shí)該接口還可對(duì)驅(qū)動(dòng)傳入GPU模擬器的信息進(jìn)行修改,也可提高調(diào)試模擬器的靈活性,更加方便地找出問(wèn)題所在。

      該接口將所有信息分為命令、繪制和數(shù)據(jù)3大部分。命令部分反映GPU的命令處理器中命令隊(duì)列,是GPU流水線的執(zhí)行狀態(tài)。繪制部分包括draw_info、pipe_state和shader_state 3部分。draw_info反映的是模擬器中GE的執(zhí)行狀態(tài),pipe_state反映的是PE和OMU的執(zhí)行狀態(tài),shader_state反映的是模擬器中SPC的執(zhí)行狀態(tài)。數(shù)據(jù)部分則包括了頂點(diǎn)數(shù)據(jù)、紋理數(shù)據(jù)和shader指令等。Shader的指令在顯存中是二進(jìn)制的形式存在,本接口還將指令進(jìn)行了反匯編,更加增強(qiáng)了調(diào)試者的可讀性。

      通過(guò)這些可讀的信息,在調(diào)試模擬器的過(guò)程中可以更加方便地知道流水線中各級(jí)的執(zhí)行狀態(tài)。這些信息以draw_call為單位,每次可顯示一幀的數(shù)據(jù)。同時(shí),通過(guò)修改這些接口信息,也可以直接改變模擬器的執(zhí)行狀態(tài),更加方便調(diào)試人員調(diào)試模擬器。

      4 實(shí) 驗(yàn)

      本實(shí)驗(yàn)使用的操作系統(tǒng)為Fedora 28.X86_64,采用的CPU為Intel Core i7 3770,主頻3.4 GHz。GPU實(shí)驗(yàn)平臺(tái)采用一種高性能GPU模擬器,Mesa版本為18.0.5,可支持圖形API的OpenGL ES 3.0版本。

      實(shí)驗(yàn)所用基準(zhǔn)測(cè)試集為GL_mark。在Linux操作系統(tǒng)上,GPU的圖形基準(zhǔn)測(cè)試集并不多。GL_mark是由Linaro發(fā)行的一款圖形基準(zhǔn)測(cè)試集,使用OpenGL-ES進(jìn)行開(kāi)發(fā),提供了一系列豐富的圖形測(cè)試,涉及圖形單元性能的各個(gè)方面,涵蓋光照、陰影、超多圖元、簡(jiǎn)單2D等多種類型的測(cè)試,是目前Linux操作系統(tǒng)上較為全面的測(cè)試集之一。

      圖3是實(shí)驗(yàn)的測(cè)試步驟,Mesa開(kāi)源驅(qū)動(dòng)將GL_mark基準(zhǔn)測(cè)試集所使用的OpenGL-ES的API轉(zhuǎn)化為相應(yīng)的中間狀態(tài),同時(shí)將GLSL的shader編程語(yǔ)言轉(zhuǎn)換為T(mén)GSI中間語(yǔ)言。GPU驅(qū)動(dòng)將中間狀態(tài)及中間語(yǔ)言轉(zhuǎn)化為GPU模擬器的接口信息和底層匯編語(yǔ)言傳遞給GPU模擬器驅(qū)動(dòng)。經(jīng)過(guò)GPU模擬器的一系列處理,最終以幀的形式顯示出來(lái)。

      圖3 GPU驅(qū)動(dòng)驗(yàn)證的實(shí)驗(yàn)過(guò)程

      本文在GL_mark中選擇的基準(zhǔn)測(cè)試描述如表3所示,從GL_mark基準(zhǔn)測(cè)試集中選擇了4個(gè)陰影測(cè)試,分別用于測(cè)試2D顯示、反射及陰影測(cè)試、折射測(cè)試以及復(fù)雜shader測(cè)試。Draw_call數(shù)量包括清除深度緩存和模板緩存、多重采樣等操作。圖4所示是2D顯示測(cè)試的效果圖。2D顯示時(shí),頂點(diǎn)數(shù)為4個(gè),即正方形的4個(gè)頂點(diǎn)。圖中圖案是使用紋理貼圖實(shí)現(xiàn)的。通過(guò)該測(cè)試表明GPU模擬器可以利用3D圖形驅(qū)動(dòng)配合3D圖形模擬器完成2D的顯示。圖5所示是反射及陰影繪制的測(cè)試,通過(guò)該測(cè)試表明GPU模擬器驅(qū)動(dòng)可準(zhǔn)確完成反射及陰影的繪制。圖6所示是折射繪制的測(cè)試,通過(guò)該測(cè)試表明GPU模擬器驅(qū)動(dòng)可準(zhǔn)確完成折射的繪制。圖7所示是復(fù)雜shader的測(cè)試,通過(guò)該測(cè)試表明,利用GPU模擬器驅(qū)動(dòng)中的編譯器可以正確繪制復(fù)雜的shader。測(cè)試中,2D圖形繪制頂點(diǎn)及圖元數(shù)目較少,每幀雖需3次drawcall,但包含了clear等操作,實(shí)際繪制1次drawcall即可完成,具有很好的圖形繪制加速效果。其余測(cè)試用例頂點(diǎn)及圖元數(shù)目較多,每幀drawcall數(shù)量也相對(duì)較多,說(shuō)明本驅(qū)動(dòng)配合GPU模擬器可準(zhǔn)確無(wú)誤地完成復(fù)雜圖形繪制。

      表3 選取的基準(zhǔn)測(cè)試集

      圖4 Effect 2D GPU模擬器效果圖

      圖5 Shadow GPU模擬器效果圖

      圖6 Refract GPU模擬器效果圖

      圖7 Jellyfish GPU模擬器效果圖

      5 結(jié) 論

      GPU驅(qū)動(dòng)是GPU與CPU之間交互的橋梁,在GPU開(kāi)發(fā)中起到了不可忽視的作用。本文在Mesa開(kāi)源驅(qū)動(dòng)的框架下進(jìn)行GPU的驅(qū)動(dòng)開(kāi)發(fā)工作,可以大幅減少GPU驅(qū)動(dòng)的開(kāi)發(fā)時(shí)間和開(kāi)發(fā)難度。同時(shí),為了提高GPU模擬器的可編程性,在Mesa驅(qū)動(dòng)中集成了編譯器的設(shè)計(jì),可將Mesa中的通用中間語(yǔ)言TGSI編譯為GPU模擬器的匯編語(yǔ)言。本驅(qū)動(dòng)還適配OpenGL等多款A(yù)PI以及GLSL等shader編程語(yǔ)言。并且,根據(jù)Mesa開(kāi)源驅(qū)動(dòng)驅(qū)動(dòng),設(shè)計(jì)出一套完整的可讀GPU模擬器接口,方便調(diào)試人員進(jìn)行驅(qū)動(dòng)及GPU結(jié)構(gòu)的調(diào)試工作。通過(guò)設(shè)計(jì)GPU的驅(qū)動(dòng)和模擬器的接口,對(duì)高性能GPU模擬器的結(jié)構(gòu)設(shè)計(jì)起到了指導(dǎo)作用。在GPU模擬器中設(shè)計(jì)的各個(gè)模塊均參考該套接口,在本接口的基礎(chǔ)上進(jìn)行結(jié)構(gòu)設(shè)計(jì)。本設(shè)計(jì)已經(jīng)和GPU模擬器進(jìn)行了OpenGL等API的驗(yàn)證,在GL_mark的驗(yàn)證測(cè)試中,可以正常完整地繪制出GL_mark測(cè)試集的每一幀圖像。本接口設(shè)計(jì)后續(xù)可繼續(xù)用于高性能GPU的結(jié)構(gòu)設(shè)計(jì)中,驅(qū)動(dòng)設(shè)計(jì)后續(xù)還可繼續(xù)用于GPU的用戶態(tài)驅(qū)動(dòng)中,通過(guò)實(shí)現(xiàn)內(nèi)核態(tài)驅(qū)動(dòng)DRM,并編寫(xiě)libDRM接口與本設(shè)計(jì)進(jìn)行對(duì)接,便可實(shí)現(xiàn)高性能GPU的一整套完整驅(qū)動(dòng)。

      猜你喜歡
      模擬器命令頂點(diǎn)
      只聽(tīng)主人的命令
      過(guò)非等腰銳角三角形頂點(diǎn)和垂心的圓的性質(zhì)及應(yīng)用(下)
      了不起的安檢模擬器
      盲盒模擬器
      劃船模擬器
      關(guān)于頂點(diǎn)染色的一個(gè)猜想
      移防命令下達(dá)后
      這是人民的命令
      動(dòng)態(tài)飛行模擬器及其發(fā)展概述
      藍(lán)色命令
      东平县| 黔西县| 额尔古纳市| 邯郸县| 炎陵县| 隆昌县| 阜新| 东丰县| 云和县| 西昌市| 延边| 桃园市| 枣强县| 体育| 庄河市| 三明市| 如东县| 弋阳县| 华安县| 哈尔滨市| 文成县| 敦化市| 调兵山市| 永清县| 金昌市| 瓮安县| 聊城市| 新绛县| 思南县| 永年县| 灵宝市| 微山县| 涞源县| 平南县| 乌拉特中旗| 噶尔县| 淄博市| 鄯善县| 沂源县| 上饶市| 镇远县|