3维线程格 gpu_图形处理单元(GPU)
圖形處理單元(GPU)
1. GraphicsProcessingUnit(GPU)
GPU就是圖形處理單元是NVIDIA在1999年發(fā)布的GeForce256顯卡中提出的概念。GPU是一組高度可并行化處理任務(wù)的芯片組,它擁有專門處理深度緩存區(qū),快速訪問紋理和其他緩沖區(qū)的定制芯片。更重要的是它提供了支持并行執(zhí)行的可編程著色器的處理器。
2. 數(shù)據(jù)并行架構(gòu)
CPU的設(shè)計(jì)主要以邏輯處理和計(jì)算為主(由于跟邏輯有關(guān)因此只能串行按順序執(zhí)行),因此現(xiàn)代CPU設(shè)計(jì)針對其特定進(jìn)行了優(yōu)化,如:分支預(yù)測,指令重排序,寄存器重命名等。與CPU不同GPU更多的是處理大批量相似但又邏輯無關(guān)的數(shù)據(jù)集合(如:頂點(diǎn)數(shù)據(jù),像素?cái)?shù)據(jù)),因此GPU的設(shè)計(jì)更適合大規(guī)模并行處理數(shù)據(jù)。GPU設(shè)計(jì)采用單指令多數(shù)據(jù)(SIMD)的方式將指令執(zhí)行邏輯和數(shù)據(jù)分離開來。這樣處理的好處在于可以在多個(gè)著色器程序上鎖定步驟執(zhí)行同一指令。例如我們有2000個(gè)像素要執(zhí)行片元著色器。針對每個(gè)片元所調(diào)用的片元著色器都被稱為一個(gè)線程。而這里的線程和CPU線程不同。它包含了一位內(nèi)存用于存放該shader的輸入,以及材質(zhì)球執(zhí)行所需要的任何寄存器空間。使用相同著色器程序的線程被分成幾個(gè)組(NVIDIA成為warps),每個(gè)組中根據(jù)SIMD功能可能有8~64個(gè)線程,例如每組同時(shí)處理32個(gè)線程,也就是對32個(gè)像素的計(jì)算。此時(shí)將創(chuàng)建2000/32 = 62.5個(gè)組,這意味著分配了63個(gè)組,其中一個(gè)組是一半為空。當(dāng)某一組執(zhí)行一個(gè)SIMD指令時(shí),著色器程序?qū)⒃谒?2個(gè)線程上同步執(zhí)行。以此可以大幅提升并行運(yùn)算的效率。但隱性其分組和并行效率的因素也很明顯,例如分支語句if可能會導(dǎo)致同一組中線程執(zhí)行邏輯(指令)不同而無法并行,從而導(dǎo)致效率降低。另外一個(gè)因素就是每個(gè)線程(著色器程序)使用的寄存器數(shù)量,因?yàn)榭偧拇嫫鲾?shù)有限因此所需要的寄存器數(shù)量越多,可并行執(zhí)行的數(shù)量越少。GPU并行計(jì)算的大致過程如下圖:
3. GPU管線概述
在圖形渲染管線中我們已經(jīng)介紹了渲染管線,如下圖所示由各個(gè)階段組成的渲染管線是GPU的邏輯模型,其每個(gè)環(huán)節(jié)的實(shí)現(xiàn)取決于具體的硬件廠商。也就是說渲染管線中的每個(gè)劃分清晰的階段只是邏輯上的定義,并不一定是真實(shí)的GPU實(shí)現(xiàn)方式。例如渲染管線中的一個(gè)固定功能,可能可以通過GPU相鄰的可編程階段中添加一個(gè)命令來實(shí)現(xiàn)總之渲染管線是一個(gè)邏輯上的流水線但并不意味著真實(shí)的GPU硬件就是完全按照這個(gè)流水線的模塊所設(shè)計(jì)和執(zhí)行的。
4. 可編程著色器階段
雖然著色器程序的類型很多,但GPU對所有著色器類型使用同一的著色器設(shè)計(jì),這樣既保證了所有著色器程序使用同一套指令集也有利于GPU合理分配資源(假設(shè)GPU有100個(gè)著色器處理器,如果分類型設(shè)計(jì)30個(gè)VS30個(gè)PS20個(gè)TS...勢必出現(xiàn)資源空閑和擁堵導(dǎo)致性能下降)。著色器程序在執(zhí)行之前先要被編譯成虛擬機(jī)字節(jié)碼(IL/DXIL),這樣的好處就是將硬件實(shí)現(xiàn)和shader代碼做了有效隔離。虛擬機(jī)會根據(jù)當(dāng)前硬件將shader代碼編譯成該硬件識別的虛擬字節(jié)碼。在PC端還可以使用離線編譯Shader存儲中間碼的方式減少運(yùn)行時(shí)編譯開銷提升性能,但手機(jī)平臺由于各硬件廠商不同導(dǎo)致編譯出來的shader binaray(字節(jié)碼)不同,并且OpenGL ES3.0以后才支持program binary功能,所以手機(jī)很少用離線編譯功能。當(dāng)調(diào)用drawcall來繪制一組圖元時(shí),也就觸發(fā)了渲染管線來執(zhí)行Shader命令,每個(gè)著色器階段都會有兩種輸入: uniform參數(shù)和varying參數(shù),uniform參數(shù)一般是用于外部(cpu)設(shè)置的在整個(gè)DrawCall階段不會發(fā)生變化,varying參數(shù)則是用來存儲頂點(diǎn)像素等數(shù)據(jù)。Shader虛擬機(jī)會根據(jù)不同類型的輸入輸出提供不同的寄存器,由于uniform存的是用于整個(gè)DrawCall的數(shù)據(jù)或貼圖,而Varying是針對不同Shader階段的(并且每個(gè)varying都不同)因此用于存儲uniform類型的數(shù)據(jù)寄存器要多的多。如下圖:
GPU中的常見計(jì)算通過Shader語言的函數(shù)暴露出來供程序使用,邏輯分支控制為靜態(tài)分支和動圖分支。靜態(tài)分支是指通過uniform參數(shù)值確定執(zhí)行分支,此時(shí)對每個(gè)頂點(diǎn)/像素執(zhí)行之前就能確定其執(zhí)行順序因此不會有并發(fā)的性能問題。動態(tài)分支根據(jù)每個(gè)Varying的值確定執(zhí)行順序雖然也可以執(zhí)行單性能開銷會大很多。
5. 可編程的Shader語言和API發(fā)展
這里介紹整個(gè)Shader語言的體現(xiàn)以及其發(fā)展過程具體如下圖:
以上基本介紹了主流3D渲染API的發(fā)展過程,主要分為三個(gè)框架,DirectX.OpenGL和Vulkan。
DX的發(fā)展過程如下:
OpenGL的發(fā)展歷過程如下:
Vulkan是基于Mantle的新架構(gòu)的渲染庫。
6. VertexShader
頂點(diǎn)著色器顧名思義是處理頂點(diǎn)數(shù)據(jù)的著色器,有前面GPU運(yùn)行原理可知每個(gè)頂點(diǎn)數(shù)據(jù)都是單獨(dú)有VertexShader進(jìn)行運(yùn)算的因此可以多頂點(diǎn)多著色器并行執(zhí)行。一個(gè)頂點(diǎn)著色器至少要有一個(gè)裁剪空間的坐標(biāo)作為輸出。使用頂點(diǎn)著色器可以實(shí)現(xiàn)對模型的形變,控制模型動畫,程序形變(eg:布料,水波),通過對整個(gè)幀緩沖區(qū)內(nèi)容處理實(shí)現(xiàn)熱浪卷曲等功能。
7. TessellationShader
7.1 概述
TS的作用就是描述曲面細(xì)節(jié),這是一個(gè)可選的階段,最早在DX11中使用后被OpenGL4.0 OpenGL ES3.2支持。TS優(yōu)點(diǎn)也很明顯其控制LOD的能力可以做到不增加額外總線帶寬(無需CPU傳輸新的模型數(shù)據(jù)給GPU)的情況下在性能和表現(xiàn)上做到很好的平衡。TS通常由三個(gè)部分組成(DX定義):Hull Shader, Tessellator, Domain Shader。OpenGL中定義的名稱有所不同但功能是一樣的。(OpenGL中Hull Shader被稱為Tessellation Control Shader細(xì)分控制著色器. Domain Shader被稱為Tessellation evaluation Shader細(xì)分評價(jià)著色器)Tessellator是固定管線不可編程的。三個(gè)步驟的具體負(fù)責(zé)內(nèi)容如下:Hull Shader, Tessellatior, Domain Shader。
7.2 Hull Shader
在該Shader中定義了曲面細(xì)分規(guī)則相關(guān)的控制點(diǎn)等參數(shù)并以特殊的patch圖元為輸入,經(jīng)過該Shader處理后(eg:可以修改patch,增刪控制點(diǎn)),將相關(guān)數(shù)據(jù)傳遞給DomainShader和Tessellatior。
7.3 Tessellatior
該階段是固定管線部分不可編程,由曲面細(xì)分控制著色器傳入的圖元和細(xì)分規(guī)則控制點(diǎn)等參數(shù)生成新的頂點(diǎn)。(利用HullShader傳入的參數(shù)可以決定生成曲面類型:三角形,四邊形,isoline也可以根據(jù)內(nèi)緣/外緣數(shù)決定分割三角形的形式和數(shù)量)最終將包含了新生成的點(diǎn)和三角形的patch圖元傳遞給細(xì)分評價(jià)著色器。
7.4 Domain Shader
細(xì)分評價(jià)著色器根據(jù)Tessllatior傳入的新的頂點(diǎn)數(shù)據(jù)和Hull Shader傳入的細(xì)分控制參數(shù)為這些新增的點(diǎn)計(jì)算位置法線,UV坐標(biāo)等信息并傳出到下一步驟。
8. GeometryShader
幾何著色器可以將圖元轉(zhuǎn)化為其他類型的圖元例如將三角形網(wǎng)格轉(zhuǎn)化為線框。這是TS無法做到的,對GS的支持早于TS,DX10 OpenGL3.2 OpenGL ES 3.2都已支持了GS。此外,GS可以用于修改傳入的數(shù)據(jù)或者制作有限數(shù)量的副本。例如:一個(gè)用途是生成六個(gè)不同transform的副本,用于同時(shí)呈現(xiàn)立方體的六個(gè)面,詳見10.4.3。在一個(gè)DC中,整個(gè)管線只有三個(gè)部分會在GPU中創(chuàng)建工作:光柵化、TS和GS。而考慮到所需要的資源和內(nèi)存,GS是最不可控的,因?yàn)樗峭耆删幊痰?。在?shí)踐中,GS很少會被使用,因?yàn)樗鼰o法很好的利用GPU的優(yōu)勢。在一些移動平臺,它甚至是在軟件層開發(fā)的,所以嚴(yán)重阻礙了它的使用。
9. 流輸出
標(biāo)準(zhǔn)的渲染管線流程是當(dāng)頂點(diǎn)數(shù)據(jù)經(jīng)過VS(TS,GS)處理后送入光柵化然后在PS中計(jì)算。流輸出提供了一個(gè)頂點(diǎn)被VS(TS,GS) 處理完成后輸出的一種機(jī)制。可以輸出一個(gè)數(shù)據(jù)流(有序的數(shù)組)甚至可以將光柵化及之后的流程全部關(guān)閉。當(dāng)然這里輸出的數(shù)據(jù)還可以被重新送回管線。(例如模擬流水或者其他例子特效) 流輸出錦衣浮點(diǎn)數(shù)形式返回?cái)?shù)據(jù),因此會有明顯的內(nèi)存開銷。輸出數(shù)據(jù)以圖元為單位將丟失原始mesh中的頂點(diǎn)共享(頂點(diǎn)索引)關(guān)系。每個(gè)三角形都會生成自己的三個(gè)頂點(diǎn)數(shù)據(jù)。OpenGL中流輸出被稱為transform feedback。
10. 像素著色器
在完成VS(TS,GS)之后,圖元經(jīng)過裁剪及光柵化(不可編程)就進(jìn)入了PS階段。經(jīng)過光柵化后頂點(diǎn)數(shù)據(jù)被光柵化到三角形全部或者部分覆蓋的像素上。被三角形全部或者部分覆蓋的像素被稱為片元fragment,OpenGL中PS被稱為FragmentShader。VS中定義的輸出參數(shù)經(jīng)過光柵化會作為PS的輸入,除此之外在ShaderModel3.0以上版本中PS還可以獲取的該片元在平面上位置,當(dāng)前片元屬于三角形正面/背面。根據(jù)這些數(shù)據(jù)PS可以計(jì)算出一個(gè)片元顏色當(dāng)然也可以通過discard指令丟棄對當(dāng)前片元的繪制。此外在PS中也可以修改深度值,甚至在DX11.3還支持了修改模板stencilbuffer值。當(dāng)對片元計(jì)算完顏色后可以直接輸出的合并階段處理也可以使用MRT輸出到指定緩沖區(qū)(延遲渲染)。在PS計(jì)算當(dāng)前片元顏色時(shí)有時(shí)會用到相鄰像素的顏色值,一個(gè)常用的做法是使用兩個(gè)pass,第一個(gè)pass先繪制到緩沖區(qū)第二個(gè)pass對緩沖區(qū)中向量數(shù)據(jù)采樣。此外PS還提供了內(nèi)置指令用于獲取沿平面X/Y軸每像素內(nèi)差值的變化量。(使用限制是不能有邏輯分支,因?yàn)椴⑿袡C(jī)制在有邏輯分支時(shí)會被被分配在不同的組內(nèi))。 DX11引入了Unordered acess view(UAV無序資源視圖)緩沖區(qū) OpenGL4.3引入了Shader storage buffer object(SSBO著色器存儲緩沖區(qū)對象)支持對任意位置的訪問。但因?yàn)镚PU是并發(fā)的,因此使用是可能出現(xiàn)訪問沖突,訪問沖突的問題后續(xù)講解。
11. 合并階段
合并階段是用于將片元的深度和顏色(PS輸出)與緩沖器上的信息進(jìn)行合并。這個(gè)階段在DX中成為output merger OpenGL中成為pre-sample操作。這個(gè)階段的操作包含深度緩沖區(qū)模板緩沖區(qū)并且會觸發(fā)顏色混合(alpha blend)。試想下如果PS計(jì)算出了像素顏色但發(fā)現(xiàn)因?yàn)樯疃然蛘吣0鍦y試不能通過,這樣白白浪費(fèi)了PS計(jì)算。為了避免這種情況 ,可以將合并階段的一些測試放到PS之前(如深度測試、模板測試),如果測試不通過則直接丟棄片元不會進(jìn)行計(jì)算。這個(gè)功能就是early-z(后續(xù)章節(jié)會詳細(xì)介紹)。合并階段一般是固定管線處理的,但它是高度可配置的。(例如配置混合方式混合操作等) DX11.3提供了一個(gè)方法可以通過ROV(Rasterizer order views光柵化順序視圖,強(qiáng)制執(zhí)行順序)實(shí)現(xiàn)programmable blending(可編程融合)但其性能會有一些代價(jià)。ROV和合并階段都是按照順序渲染的,也就是output invariance輸出不變性。不管PS的輸出順序如何,API要求結(jié)果按照輸入順序,逐物件和三角形的排序并發(fā)送到合并階段。
12. 計(jì)算著色器(ComputeShader)
GPU不僅可以用來實(shí)現(xiàn)圖形渲染管線,也可以用于非圖形的計(jì)算,如AI計(jì)算。DX11開始引入計(jì)算著色器概念,這個(gè)Shader不固定在渲染管線中,但它也可以被用來進(jìn)行渲染相關(guān)的計(jì)算入粒子特效,面部動畫,提高深度精度等。CS的優(yōu)勢在于并行計(jì)算并且全部在GPU中省去了數(shù)據(jù)從CPU到GPU傳輸?shù)拈_銷。
13. 總結(jié)
- 本章使我們了解了GPU的基本架構(gòu),了解了GPU如果通過并發(fā)處理計(jì)算大規(guī)模數(shù)據(jù)提升效率
- 了解了GPU邏輯渲染管線: VS ---(TS) ---(GS) --- 裁剪 ---屏幕映射---三角形轉(zhuǎn)配及遍歷--- 光柵化 ---(PS) ---合并
- 了解主流渲染庫的發(fā)展過程:DX8.0支持可編程管線 DX9.0支持HSLS vs/ps DX10.0支持ShaderModel4.0支持GS 流輸出 DX11.0支持ShaderModel5.0支持TS CS支持CPU多線程,DX12基于Mantle優(yōu)化驅(qū)動層開銷提升性能。 OpenGL 2.0支持可編程管線 GLSL OpenGL 3.2支持GS OpenGL 3.3支持ShaderModel4.0 OpengGL 4.0支持TS OpengGL 4.3支持CS OpenGL ES1.0是基于OpenGL 1.3的精簡版 OpenGL ES2.0是基于OpenGL 2.0的精簡版 WebGL是基于OpenGL ES 2.0 OpenGL ES 3.0基于 OpenGL 3.0 WebGL2 基于OpenGL ES2.0 Vulkan單獨(dú)發(fā)展
- 頂點(diǎn)著色器用于計(jì)算頂點(diǎn)并至少以裁剪空間的頂點(diǎn)為輸出數(shù)據(jù)
- 細(xì)分著色器分為三個(gè)部分: 細(xì)分控制著色器用于接受圖元定義細(xì)分參數(shù)控制點(diǎn)等信息,細(xì)分器用于按照細(xì)分控制著色器參數(shù)和圖元生成新的點(diǎn),細(xì)分評價(jià)著色器則根據(jù)新的點(diǎn)和細(xì)分控制著色器中的控制參數(shù)為每個(gè)點(diǎn)計(jì)算生成位置法線等屬性信息。
- 幾何著色器用于控制幾何圖元變更修改
- 流輸出則是提供一個(gè)可輸出的頂點(diǎn)數(shù)據(jù)流。
- 像素著色器的目的是計(jì)算最終的像素顏色值,其參數(shù)有VS輸出的頂點(diǎn)屬性經(jīng)過光柵化而來的數(shù)據(jù),目前PS自帶了片元在屏幕中位置,片元在三角形正/反面等信息。計(jì)算時(shí)可以通過兩個(gè)PASS的方式或者使用SSBO/UAV的方式實(shí)現(xiàn)相鄰像素的讀取使用。
- 融合默認(rèn)是固定管線,可以使用early-z的方式將深度檢測模板檢測提前到PS之前,DX11.3以后也可以通過可編程的方式實(shí)現(xiàn)自定義混合。
- 計(jì)算著色器可以用來進(jìn)行非圖形學(xué)計(jì)算如AI,也可以為圖形學(xué)進(jìn)行復(fù)制計(jì)算,其與CPU相比的優(yōu)點(diǎn)是高并發(fā)且減少了CPU到GPU的數(shù)據(jù)傳輸消耗。
總結(jié)
以上是生活随笔為你收集整理的3维线程格 gpu_图形处理单元(GPU)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女性不孕输卵管因素
- 下一篇: 安卓网页广告拦截_拦截烦人的网页广告,增