GPU 基本運行原理
GPU 發展簡史
-
1981 年,最早的顯卡:是 IBM 推出的 5150 PC(Personal Computer,個人電腦)上所搭載的 MDA 和 CGA 兩款 2D 加速卡。
-
1988 年,第一代 VGA Card(顯卡):只具備圖像顯示功能,輸出 640×480 分辨率、256 彩色圖像,而真正的圖形運算還是全部依賴 CPU,所以當 Microsoft Windows 圖形化操作系統出現後,PC 的 CPU 就開始不堪重負了。
-
1991 年,第二代 Graphics Card(圖形加速卡):專門用於支撐 Windows 圖形界面。通過一顆專用的芯片來處理圖形運算,從而將 CPU 的圖形運算負載卸載了,使得 Windows 界面運行起來非常流暢。它加速了 Windows 的普及,讓 PC 走進了圖形化界面時代。
-
1994 年,第三代 Video Card(視頻加速卡):支持視頻編解碼加速,進一步卸載了 CPU 的圖形運算負載。
-
1996 年,第四代 3D Accelerator Card(3D 圖形渲染加速卡):NVIDIA 發佈了性能強大的單芯片 TNT 和 TNT2 系列 3D 加速顯卡。在 3D 技術走向普及的時代,進一步卸載了 CPU 的圖形運算負載。
-
1999 年,第五代 GPU(圖形處理器):NVDIA GeForce 256 是一款劃時代的產品,面相時興的 3D 遊戲圖像處理加速。在 PC 遊戲領域,使得 GPU 上升到了與 CPU 同樣的高度。GeForce 256 GPU 具有完整的 Transform(座標轉換)、Lighting(光源處理)、Setup(三角形設置)和 Rendering(渲染引擎) 這 4 種 3D 處理引擎,一些以前必須由 CPU 來完成的圖形運算工作現在完全可以卸載到 GeForce256 GPU 芯片獨立完成。
-
現在,第六代 GPGPU(通用 GPU):不再侷限於 3D 遊戲領域,而是在 AI、HPC 等領域大放異彩。
值得注意的是,GPU 只是顯卡的最核心部件。在物理電氣層面,一張現代顯卡通常由 GPU(圖形處理器)、顯存、PCIe 總線接口、PCB 板、RAM DAC、VGA BIOS、VGA 功能插針、D-sub 插座、VGA、DVI 顯示器接口、HDMI 顯示器接口、S-Video 端口和 Display Port 接口、扇熱器等電器元件組成。
GPU 的基本分類
NVIDIA GeForce 256 首先提出了 GPU(Graphic Processing Unit,圖形處理器)的概念。讓 PC 從依賴 CPU 的 “集顯” 演進爲了專項硬件加速的 “獨顯”。
在獨顯市場,NVIDIA 是行業的奠基者和龍頭,佔據近 70% 份額。NVIDIA 的代表產品有 GeForce 系列、GTX 系列、RTX 系列等。
GPU 和 CPU 的本質區別
設計目的(通用計算 v.s. 專用計算)
GPU 設計目的和 CPU 截然不同。
CPU:爲通用計算而設計,是一種低延遲的設計,因此具有複雜的控制單元,但 Core 數量較少。
-
CPU 有強大的 ALU(邏輯運算部件),時鐘頻率很高,但 ALU 單元數量少,只佔據了很小一部分的 CPU 片上空間。;
-
CPU 有複雜的控制邏輯,例如:複雜的流水線(pipeline)、分支預測(branch prediction)、亂序執行(Out-of-order execution)等;
-
CPU 的容量較大的 Cache,一般包含 L1、L2 和 L3 三級高速緩存。
GPU:爲專用計算(並行計算)而設計,是一種高吞吐的設計,主要用來處理計算性強而邏輯性不強的計算任務,具有數百或數千個內核,可並行運行大量計算。
-
GPU 有大量的 ALU;
-
沒有複雜的控制邏輯,沒有分支預測等這些組件;
-
Cache 很小,緩存的目的不是保存後面需要訪問的數據的,而是爲 Thread 提高服務的,這點和 CPU 不同;
簡單來說,CPU 是一個具有多種功能的優秀領導者。它的優點在於調度、管理、協調能力強,但計算能力一般。而 GPU 相當於一個接受 CPU 調度的 “擁有大量計算能力” 的員工。
因此,相較於 CPU,GPU 在具備大量重複數據集運算和頻繁內存訪問等特點的應用場景中具有無可比擬的優勢,GPU 能夠讓某些計算比傳統 CPU 上運行相同的計算速度快 10 倍至 100 倍。例如:圖形渲染任務具有高度的並行性,對運行分析、深度學習和機器學習算法尤其有用。
計算模型(串行運算 v.s. 並行勻速啊)
GPU 是並行編程模型,和 CPU 的串行編程模型完全不同,導致很多 CPU 上優秀的算法都無法直接映射到 GPU 上,並且 GPU 的結構相當於共享存儲式多處理結構,因此在 GPU 上設計的並行程序與 CPU 上的串行程序具有很大的差異。
-
CPU 串行運算
-
GPU 並行運算
存儲器(主存 v.s. 顯存)
一般來說,CPU 和 Memory 之間的帶寬只有數十 GB/s。例如:Intel Xeon E5-2699 v3 具有 68GB/s 內存帶寬。
而 GPU 的高速緩存雖然較小,但是高速緩存與顯存之間的帶寬可以達到數百 GB/s。例如:P40 的顯存帶寬爲 346GB/s,遠遠大於 CPU 的內存帶寬。但是即便如此,相對於 GPU 的計算能力,顯存仍然是性能瓶頸的所在。
GPU 3D 渲染的基本工作原理
GPU 的工作依舊是由 CPU 安排的,GPU 從 CPU 那裏得到渲染命令後,會進行一系列操作,最終把圖像渲染到屏幕上,這個過程被稱之爲圖形流水線(Graphic Pipeline)。例如:3D 圖形渲染工作。
-
頂點處理:3D 圖形的頂點都有一個三維空間的座標,但是我們的屏幕是二維的,GPU 的計算過程實際上就是將三維的座標數據繪製到二維屏幕上。所以 GPU 需要把這些頂點在三維空間裏面的位置,轉化到屏幕這個二維空間裏面。這個轉換的操作,就被叫作頂點處理。這樣的轉化都是通過線性代數的運算來完成的。這裏每一個頂點位置的轉換,互相之間沒有依賴,可以進行並行計算。這階段 GPU 讀取描述 3D 圖形外觀的頂點數據並根據頂點數據確定 3D 圖形的形狀及位置關係,建立起 3D 圖形的骨架。在支持 DX8 和 DX9 規格的 GPU 中,這些工作由硬件實現的 Vertex Shader(頂點着色器)完成。
-
圖元組裝(Primitive Assembly):定點座標映射到二維空間後,在這一步,根據這些頂點的原始連接關係還原出網格結構。然後進行剪裁,例如:當兩個頂點在屏幕內,一個頂點在屏幕外,這時我們在屏幕上看到的就是一個四邊形。最後把圖元處理完成之後多邊形各個頂點連起來,形成三角形面片。
-
柵格化(Rasterization):顯示器實際顯示的圖像是由像素組成的,需要將上面生成的圖形上的點和線通過一定的算法轉換到相應的像素點。把一個矢量圖形轉換爲一系列像素點的過程就稱爲光柵化。例如:一條數學表示的斜線段,最終被轉化成階梯狀的連續像素點。
-
片元着色(Fragment Shader)/ 紋理帖圖:計算每一個像素的顏色、透明度等信息,給像素點上色。頂點單元生成的多邊形只構成了 3D 物體的輪廓,而紋理映射(Texture Mapping)工作完成對多邊形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應的圖片,從而生成 “真實” 的圖形。TMU(Texture Mapping Unit)即是用來完成此項工作。
-
像素操作(Pixel Operation):這階段(在對每個像素進行光柵化處理期間)GPU 完成對像素的計算和處理,從而確定每個像素的最終屬性。在支持 DX8 和 DX9 規格的 GPU 中,這些工作由硬件實現的 Pixel Shader(像素着色器)。例如:
-
消除遮擋面:圖像背對着我們的那些面就可以直接刪除不處理了。
-
紋理處理:根據像素的紋理座標和光線,查詢對應的紋理值,紋理化後的圖像會更加真實。
-
混合處理:這個就是常見的 Alpha blending,根據目前已經畫好的顏色,與正在計算的顏色的 Alpha 值混合,形成新的顏色。
-
最終輸出:由 ROP(光柵化引擎)最終完成像素的輸出,1 幀渲染完畢後,被送到顯存幀緩衝區,最終進入顯示器。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/-iuMbGytbNpuZATYK4s5Fw