轉自:NVIDIA GPU 架構梳理 - 知乎 (zhihu.com)
REF:NVIDIA GPU 架構演進 | Chenfan Blog (jcf94.com)
目前高性能計算領域,英偉達顯卡一家獨大,因此本文總結一下NVIDIA GPU的架構演變。
目錄:
一、NVIDIA GPU的架構演變歷史
二、Tesla 架構
三、Fermi架構
四、Kepler架構
五、Maxwell架構
六、Pascal架構
七、Volta架構
八、Turing架構
九、Ampere架構
一、NVIDIA GPU的架構演變歷史和基本概念[1]
截止2021年,發布時間離我們最近的8種NVIDIA GPU微架構是:
- Tesla
- Fermi
- Kepler
- Maxwell
- Pascal
- Volta
- Turing
- Ampere
NVIDIA一般以歷史上一些著名科學家的名字命名自己的GPU微架構,上面8種微架構分別是:特斯拉,費米,開普勒,麥克斯韋,帕斯卡,伏打,圖靈,安培。
其中最新的是2020年宣布的Ampere架構。
二、Tesla 架構
Tesla 架構的資料在官網也沒找到多少,不過這是英偉達第一個實現統一着色器模型的微架構。
經典型號是G80,在Fermi架構白皮書的開篇部分有對G80的簡要介紹:
- G80 是第一款支持 C 語言的 GPU,讓程序員無需學習新的編程語言即可使用GPU的強大功能。
- G80 是第一款用單一、統一的處理器取代獨立的頂點和像素管道的 GPU,該處理器可以執行頂點、幾何、像素和計算程序。
- G80 是第一款使用標量線程處理器的 GPU,無需程序員手動管理向量寄存器
- G80 引入了單指令多線程 (SIMT) 執行模型,即多個獨立線程使用一條指令並發執行。
- G80 為線程間通信引入了共享內存(shared memory)和屏障同步(barrier synchronization)。
三、Fermi架構[2]
Fermi 架構是NVIDIA GPU 架構自初代 G80 以來最重大的飛躍。
NVIDIA的GPU研發團隊從G80和GT200兩個型號上汲取經驗,采用全新的設計方法來創建世界上第一個計算 GPU。在這個過程中,專注於提高以下關鍵領域:
- 提高雙精度性能——雖然單精度浮點性能大約是桌面 CPU 性能的十倍,但一些 GPU 計算應用程序也需要更高的雙精度性能。
- ECC 支持——ECC 允許 GPU 計算用戶在數據中心安裝中安全地部署大量 GPU,並確保醫療成像和金融期權定價等數據敏感應用程序免受內存錯誤的影響。
- True Cache Hierarchy—— 一些並行算法無法使用 GPU 的共享內存,用戶需要一個真正的緩存架構來幫助他們。
- 更多共享內存——許多 CUDA 程序員要求超過 16 KB 的 SM 共享內存來加速他們的應用程序。
- 更快的上下文切換——用戶要求在應用程序和更快的圖形和計算互操作之間進行更快的上下文切換。
- 更快的原子操作(Atomic Operations)——用戶要求為他們的並行算法提供更快的讀-修改-寫原子操作。
基於以上出發點,Fermi架構有以下四大亮點:
第三代流式多處理器 (SM)
- 每個 SM 有 32 個 CUDA 內核,是 GT200 的 4 倍
- 8 倍於 GT200 的峰值雙精度浮點性能
- Dual Warp Scheduler 同時調度和分派來自兩個獨立 warp 的指令
- 64 KB RAM,可配置共享內存和 L1 cache
第二代並行線程執行 ISA
- 具有完整 C++ 支持的統一地址空間
- 針對 OpenCL 和 DirectCompute 進行了優化
- 完整的 IEEE 754-2008 32 位和 64 位精度
- 帶有 64 位擴展的完整 32 位整數路徑
- 支持過渡到 64 位尋址的內存訪問指令
- 通過預測提高性能
改進的內存子系統
- 具有可配置 L1 和Unified L2 Caches 的 NVIDIA Parallel DataCache TM 層次結構
- 第一個支持 ECC 內存的 GPU
- 大幅提升原子內存操作性能
NVIDIA GigaThread TM 引擎
- 應用程序上下文切換速度提高 10 倍
- 並發內核執行
- 亂序線程塊執行
- 雙重疊內存傳輸引擎
以上是Fermi 架構相較於初代架構提升的地方
下面具體看看Fermi 架構的配置
第一個基於Fermi架構的GPU,使用 30 億個晶體管實現,共計512個CUDA內核。
這512 個 CUDA 內核被組織成 16 個 SM,每個 SM 是一個垂直的矩形條帶(紅框中的內容),分別位於一個普通的 L2 cache周圍,每個 SM 有32 個CUDA 內核。
一個CUDA 內核為一個線程在每個時鍾周期里執行一條浮點或整數指令。
6個64-bit顯存分區,組成一個384-bit的顯存接口,總共支持高達 6GB 的 GDDR5 DRAM顯存。
GDDR5:第五版圖形用雙倍數據傳輸率存儲器
DRAM:動態隨機存取存儲器
主機接口(host interface )通過 PCI-Express 將 GPU 連接到 CPU。 Giga Thread 全局調度器將線程塊分發給 SM 線程調度器。
整個 GPU 有多個 GPC(圖形處理集群),單個GPC包含一個光柵引擎(Raster Engine),四個 SM(流式多處理器),GPC 可以被認為是一個獨立的 GPU。所有從 Fermi 開始的 NVIDIA GPU,都有 GPC。
上圖是將16個SM中的 1 個拿出來放大后的詳細結構圖,其中包含:
- 橙色部分:2 個 Warp Scheduler/Dispatch Unit
- 綠色部分:32 個 CUDA 內核,分在兩條 lane 上,每條分別是 16 個
- 淺藍色部分:register file-寄存器文件和 L1 cache
- 16 個 Load/Store units (LD/ST Unit)
- 4 個 Special Function Units (SFU)
每個 SM 具有 32 個 CUDA 內核,就是圖中寫着Core的綠色小方塊兒,每個 CUDA 內核都有一個完全流水線化的整數算術邏輯單元 (ALU) 和浮點單元 (FPU):
SM(Streaming Multiprocessors)是GPU架構中非常重要的部分,GPU硬件的並行性就是由SM決定的。
四、Kepler架構
Kepler架構的思路是:減少SM單元數(在這一代中叫SMX單元),增加每組SM單元中的CUDA內核數。在Kepler架構中,每個SM單元的CUDA內核數由Fermi架構的32個激增至192個。
在每個SMX中:
- 4 個 Warp Scheduler,8 個 Dispatch Unit
- 綠色:192個 CUDA 內核,分在12條 lane 上,每條分別是 16 個
- 黃色:64 個DP雙精度運算單元,分在4條 lane 上,每條 lane 上 16 個
- 32 個 LD/ST Unit
- 32 個 SFU
五、Maxwell架構
Maxwell架構的SM單元和Kepler架構相比,又有很大變化,這一代的SM單元更像是把4個Fermi 架構的SM單元,按照2x2的方式排列在一起,這一代稱為SMM單元:
SMM 使用基於象限的設計,具有四個 32 核處理塊(processing blocks),每個處理塊都有一個專用的 warp 調度程序,能夠在每個時鍾分派兩條指令。
每個 SMM 單元提供
- 八個紋理單元(texture units)
- 一個多態引擎(polymorph engine-圖形的幾何處理)
- 專用寄存器文件和共享內存。
每個處理塊中:
- 1個 Warp Scheduler,2 個 Dispatch Unit
- 綠色:32個 CUDA 內核
- 8個 LD/ST Unit
- 8個 SFU
CUDA內核總數 從Kpler時代的每組SM單元192個減少到了每組128個,但是每個SMM單元將擁有更多的邏輯控制電路,便於精確控制。
參考:https://link.zhihu.com/?target=https%3A//developer.nvidia.com/blog/maxwell-most-advanced-cuda-gpu-ever-made/
六、Pascal架構
這里有一個新概念:核心
NVIDIA不同的架構會有幾種不同的核心,Pascal架構有GP100、GP102兩種大核心:
- GP100:3840個CUDA核心,60組SM單元;
- GP102:3584個CUDA核心,28組SM單元;
核心是一個完整的GPU模組,上圖展示了一個pascal架構的GP100核心,帶有 60 個 SM 單元。
不同的顯卡產品可以使用不同的 GP100 配置,一般是滿配或者減配,比如Tesla P100 使用了 56 個 SM 單元。
每個SM單元中,分為2個Process Block,每個Process Block中:
- 1個 Warp Scheduler,2 個 Dispatch Unit
- 綠色:32個 CUDA 內核
- 黃色:16 個DP雙精度運算單元,分在2條 lane 上,每條 lane 上 8個
- 8個 LD/ST Unit
- 8個 SFU
CUDA內核總數從Maxwell時代的每組SM單元128個減少到了每組64個,這一代最大的特點是又把DP雙精度運算單元加回來了。
制程工藝升級到了16nm,性能大幅提升,功耗卻不增加。
七、Volta架構
Volta架構的GV100核心
GV100核心的SM單元
每個SM單元中,分為4個Process Block,每個Process Block中:
- 1個 Warp Scheduler,1個 Dispatch Unit
- 8 個 FP64 Core
- 16 個 INT32 Core
- 16 個 FP32 Core
- 2 個 Tensor Core
- 8個 LD/ST Unit
- 4個 SFU
在前幾代架構中:
一個CUDA 內核在每個時鍾周期里只能為一個線程執行一條浮點或整數指令。
但是從Volta架構開始,將一個CUDA 內核拆分為兩部分:FP32 和 INT32,好處是在同一個時鍾周期里,可以同時執行浮點和整數指令,提高計算速度。
Volta架構在傳統的單雙精度計算之外還增加了專用的Tensor Core張量單元,用於深度學習、AI運算等。
八、Turing架構
Turing架構的TU102核心
Turing架構目前一共有三種核心:
- TU102核心
- TU104核心
- TU106核心
TU102核心的SM單元
每個SM單元有4個處理塊,每個處理塊中:
- 1 個 Warp Scheduler,1 個 Dispath Unit
- 16 個 INT32 Core
- 16 個 FP32 Core
- 2 個 Tensor Core
- 4 個 LD/ST Unit
- 4 個 SFU
這一代架構去掉了對FP64的支持。
九、Ampere架構
Ampere架構的GA102核心
GA102核心的SM單元
每個SM單元分成4個處理塊,每個處理塊中:
- 1 個 Warp Scheduler,1 個 Dispatch Unit
- 8 個 FP64 Core
- 16 個 FP32 Core
- 16 個 INT32 Core
- 1 個 Tensor Core
- 8 個 LD/ST Unit
- 4 個 SFU
這一代架構又把FP64 Core加回來了,同時也是自Volta架構以來的,NVIDIA第三代Tensor技術,保持一代架構更新一次Tensor。