GPU 原理解密(一)畫個三角形居然這麼難

NO IMAGE

系列文章第一篇,介紹些術語,混個眼熟,讓大家有點感性認識。

這是一張顯示卡,它包括中間的 GPU(graphics processing unit)、視訊記憶體(framebuffer / FB)以及一堆小張不認識的電器元件。

這是一枚 GPU

這是 GPU 內部原理圖(晶片型號為 GM 204),這張圖裡值得關注的名詞有:

  • PCI Express 3.0 Host Interface
  • GigaThread Engine
  • GPC (Graphics Processing Cluster)
  • Raster Engine
  • SM (Streaming Multiprocessor)
  • Memory Controller
  • L2 Cache

看到這裡,你一定有個疑惑

為啥搞這麼複雜?

在圖形應用中,每一個繪圖函式(drawcall)都可能生成數量千差萬別的三角形。能活下來的頂點和我們從應用程式中塞給 API 的不一樣的。不可見的三角形、被遮擋住的畫素,種種情況影響下,有些三角形並不需要在螢幕上畫任何東西。同樣大小的一個三角形,有時候需要畫幾百個畫素,有時候卻一個都不畫。

所以啊,三角形在現在的 GPU 裡走的是一條邏輯上的管線(logical pipeline),而非物理上的管線。對管線的概念陌生的讀者,可以想象下富士康的手機組裝流水線。每一個車間工人,就好比 GPU 中的一個單元。車間中的管線是固定的,工人只做一件事情,保證效率。然而 GPU 中的管線是靈活的,好比前一秒在裝蘋果手機的螢幕,後一秒就去裝 VR 頭盔的感測器了。

回到三角形身上,我們現在要畫三角形 A 和 B,它們可能位於不同的管線階段。三角形 A 已經通過座標變換,準備好光柵化(to be rasterized)。A 的一些畫素甚至正在執行畫素著色器(pixel shader),另一坨卻被深度快取(depth-buffer)拋棄了,還有些已經寫到了視訊記憶體(framebuffer),最後還有些畫素在發呆(ZzzzzZzzzz)。這時,三角形 B 粉墨登場,我們還需要獲取 B 的頂點資料。你看,雖然每個三角形都需要照著套路走一場,在三角形一生的不同階段,它們要做不同事情。畫三角形這件事,分為許多微小的工作,這些工作是可以並行的。硬體單元只要空閒了,就會分到新的工作,頂點處理和畫素著色會同時進行。

N 卡的架構自 Fermi 時代以來一脈相承。Giga Thread Engine管理所有進行的工作量。GPU 被劃分為多個 GPC (Graphics Processing Cluster),每個 GPC 又帶了多個 流處理器 (SM / Streaming Multiprocessor) 和一個光柵化引起(Raster Engine)。整個過程中存在大量的溝通交流,最值得一提的是
Crossbar(我也不知道怎麼翻譯),它使得 GPC 上的工作和其他子系統比如 ROP (渲染輸出單元 / render output unit) 進行協作。

SM 是執行 glsl / hlsl / cuda kernel 的運算單元,放大後是這樣的:

SM 包含大量的核(Core)進行數學運算,這些核很無腦,它們以 32 個為一組,接收 Warp Schedulers 的號召,scheduler 決定了運算的邏輯,下達指令“跟著我一起揮舞左手,再揮舞右手”。32 個 Core 乖乖地做,一起揮舞左手,再揮舞右手。

但是,如果 scheduler 下達的指令是“單號的觀眾揮舞左手,雙號的觀眾揮舞右手”,事情就變得有趣了。

在單號的 Core 揮舞左手的時候,雙號的 Core 會處於發呆狀態(ZzzzzZzzzz)。

等單號的 Core 揮舞完了,雙號的 Core 才開始揮舞右手。

每個 GPU 含多少 GPC,每個 GPC 含多少 SM,這些配置取決於不可說的祕密。前面放過的 GM 204 還記得不,它有 4 個 GPC,每個 GPC 含 4 個 SM。Tegra X1 雖然同為 Maxwel 架構,僅有 1 個 GPC 和 2 個 SM。

至於 SM 的設計,包含多少的 core,多少的 scheduler 也是每代晶片都不同,確保可以滿足高階顯示卡、筆記本、手機等的需求。

總結下,這篇文章簡要介紹了 GPU、GPC 和 SM,估計大家看完了依然不明白。沒事兒,我們下集見。

參考資料

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

作者:Vinjn張靜
連結:https://zhuanlan.zhihu.com/p/20918974
來源:知乎