日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

3维线程格 gpu_图形处理单元(GPU)

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3维线程格 gpu_图形处理单元(GPU) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖形處理單元(GPU)

1. GraphicsProcessingUnit(GPU)

GPU就是圖形處理單元是NVIDIA在1999年發(fā)布的GeForce256顯卡中提出的概念。GPU是一組高度可并行化處理任務的芯片組,它擁有專門處理深度緩存區(qū),快速訪問紋理和其他緩沖區(qū)的定制芯片。更重要的是它提供了支持并行執(zhí)行的可編程著色器的處理器。

2. 數(shù)據(jù)并行架構

CPU的設計主要以邏輯處理和計算為主(由于跟邏輯有關因此只能串行按順序執(zhí)行),因此現(xiàn)代CPU設計針對其特定進行了優(yōu)化,如:分支預測,指令重排序,寄存器重命名等。與CPU不同GPU更多的是處理大批量相似但又邏輯無關的數(shù)據(jù)集合(如:頂點數(shù)據(jù),像素數(shù)據(jù)),因此GPU的設計更適合大規(guī)模并行處理數(shù)據(jù)。GPU設計采用單指令多數(shù)據(jù)(SIMD)的方式將指令執(zhí)行邏輯和數(shù)據(jù)分離開來。這樣處理的好處在于可以在多個著色器程序上鎖定步驟執(zhí)行同一指令。例如我們有2000個像素要執(zhí)行片元著色器。針對每個片元所調用的片元著色器都被稱為一個線程。而這里的線程和CPU線程不同。它包含了一位內存用于存放該shader的輸入,以及材質球執(zhí)行所需要的任何寄存器空間。使用相同著色器程序的線程被分成幾個組(NVIDIA成為warps),每個組中根據(jù)SIMD功能可能有8~64個線程,例如每組同時處理32個線程,也就是對32個像素的計算。此時將創(chuàng)建2000/32 = 62.5個組,這意味著分配了63個組,其中一個組是一半為空。當某一組執(zhí)行一個SIMD指令時,著色器程序將在所有32個線程上同步執(zhí)行。以此可以大幅提升并行運算的效率。但隱性其分組和并行效率的因素也很明顯,例如分支語句if可能會導致同一組中線程執(zhí)行邏輯(指令)不同而無法并行,從而導致效率降低。另外一個因素就是每個線程(著色器程序)使用的寄存器數(shù)量,因為總寄存器數(shù)有限因此所需要的寄存器數(shù)量越多,可并行執(zhí)行的數(shù)量越少。GPU并行計算的大致過程如下圖:

3. GPU管線概述

在圖形渲染管線中我們已經(jīng)介紹了渲染管線,如下圖所示由各個階段組成的渲染管線是GPU的邏輯模型,其每個環(huán)節(jié)的實現(xiàn)取決于具體的硬件廠商。也就是說渲染管線中的每個劃分清晰的階段只是邏輯上的定義,并不一定是真實的GPU實現(xiàn)方式。例如渲染管線中的一個固定功能,可能可以通過GPU相鄰的可編程階段中添加一個命令來實現(xiàn)總之渲染管線是一個邏輯上的流水線但并不意味著真實的GPU硬件就是完全按照這個流水線的模塊所設計和執(zhí)行的。

4. 可編程著色器階段

雖然著色器程序的類型很多,但GPU對所有著色器類型使用同一的著色器設計,這樣既保證了所有著色器程序使用同一套指令集也有利于GPU合理分配資源(假設GPU有100個著色器處理器,如果分類型設計30個VS30個PS20個TS...勢必出現(xiàn)資源空閑和擁堵導致性能下降)。著色器程序在執(zhí)行之前先要被編譯成虛擬機字節(jié)碼(IL/DXIL),這樣的好處就是將硬件實現(xiàn)和shader代碼做了有效隔離。虛擬機會根據(jù)當前硬件將shader代碼編譯成該硬件識別的虛擬字節(jié)碼。在PC端還可以使用離線編譯Shader存儲中間碼的方式減少運行時編譯開銷提升性能,但手機平臺由于各硬件廠商不同導致編譯出來的shader binaray(字節(jié)碼)不同,并且OpenGL ES3.0以后才支持program binary功能,所以手機很少用離線編譯功能。當調用drawcall來繪制一組圖元時,也就觸發(fā)了渲染管線來執(zhí)行Shader命令,每個著色器階段都會有兩種輸入: uniform參數(shù)和varying參數(shù),uniform參數(shù)一般是用于外部(cpu)設置的在整個DrawCall階段不會發(fā)生變化,varying參數(shù)則是用來存儲頂點像素等數(shù)據(jù)。Shader虛擬機會根據(jù)不同類型的輸入輸出提供不同的寄存器,由于uniform存的是用于整個DrawCall的數(shù)據(jù)或貼圖,而Varying是針對不同Shader階段的(并且每個varying都不同)因此用于存儲uniform類型的數(shù)據(jù)寄存器要多的多。如下圖:

GPU中的常見計算通過Shader語言的函數(shù)暴露出來供程序使用,邏輯分支控制為靜態(tài)分支和動圖分支。靜態(tài)分支是指通過uniform參數(shù)值確定執(zhí)行分支,此時對每個頂點/像素執(zhí)行之前就能確定其執(zhí)行順序因此不會有并發(fā)的性能問題。動態(tài)分支根據(jù)每個Varying的值確定執(zhí)行順序雖然也可以執(zhí)行單性能開銷會大很多。

5. 可編程的Shader語言和API發(fā)展

這里介紹整個Shader語言的體現(xiàn)以及其發(fā)展過程具體如下圖:

以上基本介紹了主流3D渲染API的發(fā)展過程,主要分為三個框架,DirectX.OpenGL和Vulkan。

DX的發(fā)展過程如下:

OpenGL的發(fā)展歷過程如下:

Vulkan是基于Mantle的新架構的渲染庫。

6. VertexShader

頂點著色器顧名思義是處理頂點數(shù)據(jù)的著色器,有前面GPU運行原理可知每個頂點數(shù)據(jù)都是單獨有VertexShader進行運算的因此可以多頂點多著色器并行執(zhí)行。一個頂點著色器至少要有一個裁剪空間的坐標作為輸出。使用頂點著色器可以實現(xiàn)對模型的形變,控制模型動畫,程序形變(eg:布料,水波),通過對整個幀緩沖區(qū)內容處理實現(xiàn)熱浪卷曲等功能。

7. TessellationShader

7.1 概述

TS的作用就是描述曲面細節(jié),這是一個可選的階段,最早在DX11中使用后被OpenGL4.0 OpenGL ES3.2支持。TS優(yōu)點也很明顯其控制LOD的能力可以做到不增加額外總線帶寬(無需CPU傳輸新的模型數(shù)據(jù)給GPU)的情況下在性能和表現(xiàn)上做到很好的平衡。TS通常由三個部分組成(DX定義):Hull Shader, Tessellator, Domain Shader。OpenGL中定義的名稱有所不同但功能是一樣的。(OpenGL中Hull Shader被稱為Tessellation Control Shader細分控制著色器. Domain Shader被稱為Tessellation evaluation Shader細分評價著色器)Tessellator是固定管線不可編程的。三個步驟的具體負責內容如下:Hull Shader, Tessellatior, Domain Shader。

7.2 Hull Shader

在該Shader中定義了曲面細分規(guī)則相關的控制點等參數(shù)并以特殊的patch圖元為輸入,經(jīng)過該Shader處理后(eg:可以修改patch,增刪控制點),將相關數(shù)據(jù)傳遞給DomainShader和Tessellatior。

7.3 Tessellatior

該階段是固定管線部分不可編程,由曲面細分控制著色器傳入的圖元和細分規(guī)則控制點等參數(shù)生成新的頂點。(利用HullShader傳入的參數(shù)可以決定生成曲面類型:三角形,四邊形,isoline也可以根據(jù)內緣/外緣數(shù)決定分割三角形的形式和數(shù)量)最終將包含了新生成的點和三角形的patch圖元傳遞給細分評價著色器。

7.4 Domain Shader

細分評價著色器根據(jù)Tessllatior傳入的新的頂點數(shù)據(jù)和Hull Shader傳入的細分控制參數(shù)為這些新增的點計算位置法線,UV坐標等信息并傳出到下一步驟。

8. GeometryShader

幾何著色器可以將圖元轉化為其他類型的圖元例如將三角形網(wǎng)格轉化為線框。這是TS無法做到的,對GS的支持早于TS,DX10 OpenGL3.2 OpenGL ES 3.2都已支持了GS。此外,GS可以用于修改傳入的數(shù)據(jù)或者制作有限數(shù)量的副本。例如:一個用途是生成六個不同transform的副本,用于同時呈現(xiàn)立方體的六個面,詳見10.4.3。在一個DC中,整個管線只有三個部分會在GPU中創(chuàng)建工作:光柵化、TS和GS。而考慮到所需要的資源和內存,GS是最不可控的,因為它是完全可編程的。在實踐中,GS很少會被使用,因為它無法很好的利用GPU的優(yōu)勢。在一些移動平臺,它甚至是在軟件層開發(fā)的,所以嚴重阻礙了它的使用。

9. 流輸出

標準的渲染管線流程是當頂點數(shù)據(jù)經(jīng)過VS(TS,GS)處理后送入光柵化然后在PS中計算。流輸出提供了一個頂點被VS(TS,GS) 處理完成后輸出的一種機制。可以輸出一個數(shù)據(jù)流(有序的數(shù)組)甚至可以將光柵化及之后的流程全部關閉。當然這里輸出的數(shù)據(jù)還可以被重新送回管線。(例如模擬流水或者其他例子特效) 流輸出錦衣浮點數(shù)形式返回數(shù)據(jù),因此會有明顯的內存開銷。輸出數(shù)據(jù)以圖元為單位將丟失原始mesh中的頂點共享(頂點索引)關系。每個三角形都會生成自己的三個頂點數(shù)據(jù)。OpenGL中流輸出被稱為transform feedback。

10. 像素著色器

在完成VS(TS,GS)之后,圖元經(jīng)過裁剪及光柵化(不可編程)就進入了PS階段。經(jīng)過光柵化后頂點數(shù)據(jù)被光柵化到三角形全部或者部分覆蓋的像素上。被三角形全部或者部分覆蓋的像素被稱為片元fragment,OpenGL中PS被稱為FragmentShader。VS中定義的輸出參數(shù)經(jīng)過光柵化會作為PS的輸入,除此之外在ShaderModel3.0以上版本中PS還可以獲取的該片元在平面上位置,當前片元屬于三角形正面/背面。根據(jù)這些數(shù)據(jù)PS可以計算出一個片元顏色當然也可以通過discard指令丟棄對當前片元的繪制。此外在PS中也可以修改深度值,甚至在DX11.3還支持了修改模板stencilbuffer值。當對片元計算完顏色后可以直接輸出的合并階段處理也可以使用MRT輸出到指定緩沖區(qū)(延遲渲染)。在PS計算當前片元顏色時有時會用到相鄰像素的顏色值,一個常用的做法是使用兩個pass,第一個pass先繪制到緩沖區(qū)第二個pass對緩沖區(qū)中向量數(shù)據(jù)采樣。此外PS還提供了內置指令用于獲取沿平面X/Y軸每像素內差值的變化量。(使用限制是不能有邏輯分支,因為并行機制在有邏輯分支時會被被分配在不同的組內)。 DX11引入了Unordered acess view(UAV無序資源視圖)緩沖區(qū) OpenGL4.3引入了Shader storage buffer object(SSBO著色器存儲緩沖區(qū)對象)支持對任意位置的訪問。但因為GPU是并發(fā)的,因此使用是可能出現(xiàn)訪問沖突,訪問沖突的問題后續(xù)講解。

11. 合并階段

合并階段是用于將片元的深度和顏色(PS輸出)與緩沖器上的信息進行合并。這個階段在DX中成為output merger OpenGL中成為pre-sample操作。這個階段的操作包含深度緩沖區(qū)模板緩沖區(qū)并且會觸發(fā)顏色混合(alpha blend)。試想下如果PS計算出了像素顏色但發(fā)現(xiàn)因為深度或者模板測試不能通過,這樣白白浪費了PS計算。為了避免這種情況 ,可以將合并階段的一些測試放到PS之前(如深度測試、模板測試),如果測試不通過則直接丟棄片元不會進行計算。這個功能就是early-z(后續(xù)章節(jié)會詳細介紹)。合并階段一般是固定管線處理的,但它是高度可配置的。(例如配置混合方式混合操作等) DX11.3提供了一個方法可以通過ROV(Rasterizer order views光柵化順序視圖,強制執(zhí)行順序)實現(xiàn)programmable blending(可編程融合)但其性能會有一些代價。ROV和合并階段都是按照順序渲染的,也就是output invariance輸出不變性。不管PS的輸出順序如何,API要求結果按照輸入順序,逐物件和三角形的排序并發(fā)送到合并階段。

12. 計算著色器(ComputeShader)

GPU不僅可以用來實現(xiàn)圖形渲染管線,也可以用于非圖形的計算,如AI計算。DX11開始引入計算著色器概念,這個Shader不固定在渲染管線中,但它也可以被用來進行渲染相關的計算入粒子特效,面部動畫,提高深度精度等。CS的優(yōu)勢在于并行計算并且全部在GPU中省去了數(shù)據(jù)從CPU到GPU傳輸?shù)拈_銷。

13. 總結

  • 本章使我們了解了GPU的基本架構,了解了GPU如果通過并發(fā)處理計算大規(guī)模數(shù)據(jù)提升效率
  • 了解了GPU邏輯渲染管線: VS ---(TS) ---(GS) --- 裁剪 ---屏幕映射---三角形轉配及遍歷--- 光柵化 ---(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)化驅動層開銷提升性能。 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單獨發(fā)展
  • 頂點著色器用于計算頂點并至少以裁剪空間的頂點為輸出數(shù)據(jù)
  • 細分著色器分為三個部分: 細分控制著色器用于接受圖元定義細分參數(shù)控制點等信息,細分器用于按照細分控制著色器參數(shù)和圖元生成新的點,細分評價著色器則根據(jù)新的點和細分控制著色器中的控制參數(shù)為每個點計算生成位置法線等屬性信息。
  • 幾何著色器用于控制幾何圖元變更修改
  • 流輸出則是提供一個可輸出的頂點數(shù)據(jù)流。
  • 像素著色器的目的是計算最終的像素顏色值,其參數(shù)有VS輸出的頂點屬性經(jīng)過光柵化而來的數(shù)據(jù),目前PS自帶了片元在屏幕中位置,片元在三角形正/反面等信息。計算時可以通過兩個PASS的方式或者使用SSBO/UAV的方式實現(xiàn)相鄰像素的讀取使用。
  • 融合默認是固定管線,可以使用early-z的方式將深度檢測模板檢測提前到PS之前,DX11.3以后也可以通過可編程的方式實現(xiàn)自定義混合。
  • 計算著色器可以用來進行非圖形學計算如AI,也可以為圖形學進行復制計算,其與CPU相比的優(yōu)點是高并發(fā)且減少了CPU到GPU的數(shù)據(jù)傳輸消耗。

總結

以上是生活随笔為你收集整理的3维线程格 gpu_图形处理单元(GPU)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。