gpu邏輯管線

https://developer.nvidia.com/content/life-triangle-nvidias-logical-pipeline

1、程序通過圖形API(DX、GL、WEBGL)發出drawcall指令,指令會被推送到驅動程序,驅動會檢查指令的合法性,然後會把指令放到GPU可以讀取的Pushbuffer中。
2、經過一段時間或者顯式調用flush指令後,驅動程序把Pushbuffer的內容發送給GPU,GPU通過主機接口(Host Interface)接受這些命令,並通過前端(Front End)處理這些命令。
3、在圖元分配器(Primitive Distributor)中開始工作分配,處理indexbuffer中的頂點產生三角形分成批次(batches),然後發送給多個PGCs。這一步的理解就是提交上來n個三角形,分配給這幾個PGC同時處理。
4、在GPC中,每個SM中的Poly Morph Engine負責通過三角形索引(triangle indices)取出三角形的數據(vertex data),即圖中的Vertex Fetch模塊。
5、在獲取數據之後,在SM中以32個線程爲一組的線程束(Warp)來調度,來開始處理頂點數據。Warp是典型的單指令多線程(SIMT,SIMD單指令多數據的升級)的實現,也就是32個線程同時執行的指令是一模一樣的,只是線程數據不一樣,這樣的好處就是一個warp只需要一個套邏輯對指令進行解碼和執行就可以了,芯片可以做的更小更快,之所以可以這麼做是由於GPU需要處理的任務是天然並行的。
6、SM的warp調度器會按照順序分發指令給整個warp,單個warp中的線程會鎖步(lock-step)執行各自的指令,如果線程碰到不激活執行的情況也會被遮掩(be masked out)。被遮掩的原因有很多,例如當前的指令是if(true)的分支,但是當前線程的數據的條件是false,或者循環的次數不一樣(比如for循環次數n不是常量,或被break提前終止了但是別的還在走),因此在shader中的分支會顯著增加時間消耗,在一個warp中的分支除非32個線程都走到if或者else裏面,否則相當於所有的分支都走了一遍,線程不能獨立執行指令而是以warp爲單位,而這些warp之間纔是獨立的。
7、warp中的指令可以被一次完成,也可能經過多次調度,例如通常SM中的LD/ST(加載存取)單元數量明顯少於基礎數學操作單元。

8、由於某些指令比其他指令需要更長的時間才能完成,特別是內存加載,warp調度器可能會簡單地切換到另一個沒有內存等待的warp,這是GPU如何克服內存讀取延遲的關鍵,只是簡單地切換活動線程組。爲了使這種切換非常快,調度器管理的所有warp在寄存器文件中都有自己的寄存器。這裏就會有個矛盾產生,shader需要越多的寄存器,就會給warp留下越少的空間,就會產生越少的warp,這時候在碰到內存延遲的時候就會只是等待,而沒有可以運行的warp可以切換。
9、一旦warp完成了vertex-shader的所有指令,運算結果會被Viewport Transform模塊處理,三角形會被裁剪然後準備柵格化,GPU會使用L1和L2緩存來進行vertex-shader和pixel-shader的數據通信。
10、接下來這些三角形將被分割,再分配給多個GPC,三角形的範圍決定着它將被分配到哪個光柵引擎(raster engines),每個raster engines覆蓋了多個屏幕上的tile,這等於把三角形的渲染分配到多個tile上面。也就是像素階段就把按三角形劃分變成了按顯示的像素劃分了。
11、SM上的Attribute Setup保證了從vertex-shader來的數據經過插值後是pixel-shade是可讀的。

12、GPC上的光柵引擎(raster engines)在它接收到的三角形上工作,來負責這些這些三角形的像素信息的生成(同時會處理裁剪Clipping、背面剔除和Early-Z剔除)。

13、32個像素線程將被分成一組,或者說8個2x2的像素塊,這是在像素着色器上面的最小工作單元,在這個像素線程內,如果沒有被三角形覆蓋就會被遮掩,SM中的warp調度器會管理像素着色器的任務。

14、接下來的階段就和vertex-shader中的邏輯步驟完全一樣,但是變成了在像素着色器線程中執行。 由於不耗費任何性能可以獲取一個像素內的值,導致鎖步執行非常便利,所有的線程可以保證所有的指令可以在同一點。
15、最後一步,現在像素着色器已經完成了顏色的計算還有深度值的計算,在這個點上,我們必須考慮三角形的原始api順序,然後纔將數據移交給ROP(render output unit,渲染輸入單元),一個ROP內部有很多ROP單元,在ROP單元中處理深度測試,和framebuffer的混合,深度和顏色的設置必須是原子操作,否則兩個不同的三角形在同一個像素點就會有衝突和錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章