跳轉到

1993 - GPU 圖形處理器(從畫三角形到通用運算)#

案件摘要#

1993 年,NVIDIA 成立(Jensen Huang、Chris Malachowsky、Curtis Priem)——最初做 NV1 3D 加速晶片。 2006 年,NVIDIA 發布 G80(首個真正通用的 CUDA 架構 GPU),2012 年 AlexNet 深度學習引爆 GPU 運算:

\[ \text{GPU} = \text{數千個簡單核心}\ \text{(SIMD)} \xrightarrow{\text{CUDA 2007}} \text{通用平行運算平台}. \]

今日 GPU 有 數千個 CUDA 核心,為 AI、科學計算、密碼學提供 100–1000 倍 的 CPU 加速—— GPU 是 AI 時代的硬體引擎(見「2012-GPU深度學習算力.md」)。

前因 -- 為什麼會有這個案子#

  • 3D 圖形的運算本質(1990s):3D 加速需要巨量的逐像素、逐頂點運算:
  • 光柵化 (rasterization):把三角形投影到螢幕像素。
  • 紋理映射 (texture mapping):雙線性插值(bilinear interpolation)取樣。
  • 光照計算 (shading): Gouraud/Phong 著色,每像素計算法線、光源、反射。
\[ \text{每幀像素數} \sim 1920\times1080\times60 \approx 1.24\times10^8\ \text{像素/秒} \quad (1080p60). \]

每像素需數十次浮點運算 → 每秒百億次浮點運算——CPU(循序處理)無法負擔。 - 1990s 硬體分工: - CPU(x86):通用、循序,頻率 200–800 MHz(1990s)。 - GPU / 3D 加速器:大量簡單核心(數百個),SIMD(單指令多資料)並行, 專用於逐像素運算——架構天然適合平行。 - 1993 NVIDIA 成立、1997 NV1、1999 GeForce 256(首次定義 GPU 術語): Jensen Huang 的核心洞見:

「平行運算是未來的架構——遊戲只是第一個應用。」

線索與推理 -- 數學式、程式、理論#

第一條線索:SIMD 與平行加速(GPU 的數學根基)#

GPU 核心(Streaming Multiprocessor, SM)內有數十至數百個 CUDA 核心: - SIMD:一條指令處理 32 個執行緒(warp)——資料層級平行。 - CPU:MIMD,數個核心,每核心獨立控制流。

\[ \text{加速比} \approx \frac{\text{工作負載的可平行度}}{\text{控制流分歧}}. \]
  • 資料平行(data-parallel): \(\vec{y} = A\vec{x}\) (矩陣乘法)→ 完美平行。
  • 控制分歧(warp divergence):if/else 分支不同執行緒走不同路 → 序列化執行:
\[ \text{效率} = \frac{\text{執行緒數}}{\text{warp 內最大分歧路徑長度}} \times 100\%. \]
  • GPU 快取:依賴線程 (thread) 的鄰近性(coalescing): 連續執行緒訪問連續記憶體 → 記憶體頻寬利用率最高(coalesced access)。

第二條線索:光柵化與插值(GPU 的數學核心)#

3D 圖形管線(graphics pipeline)數學: 1. 投影變換:3D → 螢幕座標(透視投影矩陣 \(P\) ,4×4)。 2. 紋理雙線性插值:在紋理上取樣 \((\bar{u},\bar{v})\) :

\[ C(u,v) = \sum_{i,j \in \{0,1\}} w_i(u)\cdot w_j(v)\cdot T_{i,j}. \]
  1. 紋理快取 (Texture Cache):局部性原理——相鄰像素取樣相同/相近紋理 → 快取命中率高。
  2. 光柵化三角形覆蓋率 (coverage):
\[ \text{MSAA} = 4\times\ \text{或}\ 8\times\ \text{每像素多個樣本} \quad\Longrightarrow\quad \text{平滑邊緣}. \]

第三條線索:CUDA(2007)— GPU 通用化的關鍵#

NVIDIA 的 CUDA(Compute Unified Device Architecture, 2007) 讓 GPU 可用 C 語言編程:

\[ \text{GPU 從「固定管線」} \xrightarrow{\text{CUDA}} \text{「可程式平行計算器」}. \]
  • 執行模型:grid → block → thread 的三層層次。
  • 執行緒分組 (warp):32 執行緒同時執行同一指令(SIMD)。
  • 共享記憶體 (shared memory):block 內執行緒共享的快取(人工管理)。
  • 結果:GPU 從遊戲加速器 → 通用運算加速器(GPGPU) → AI 訓練引擎。

Python:SIMD 加速比與 warp 分歧效率#

import numpy as np
import time

def cpu_matmul(A, B):
    """CPU 風格(巢狀迴圈)矩陣乘法"""
    n = A.shape[0]
    C = np.zeros_like(A, dtype=np.float64)
    for i in range(n):
        for j in range(n):
            for k in range(n):
                C[i][j] += A[i][k] * B[k][j]
    return C

def gpu_matmul_sim(A, B):
    """GPU 風格:每個 (i,j) 獨立並行(資料平行)"""
    return A @ B   # 隱式使用 SIMD/向量化

# 1) warp 分歧效率
def warp_efficiency(n_threads, divergence_paths):
    """warp 32 執行緒,若分支路徑長度不同 → 效率 = 1/max(分歧路徑數)"""
    warp = 32
    full_warps = n_threads // warp
    max_path = divergence_paths
    return (1.0/max_path) * 100

print("warp 分歧效率(32 執行緒):")
for paths in [1, 2, 4, 8]:
    print(f"  {paths:2d} 條分歧路徑 → 效率 {warp_efficiency(32, paths):.0f}%")

# 2) SIMD 加速示範(用 NumPy 向量化模擬 GPU SIMD)
A = np.random.randn(256, 256)
B = np.random.randn(256, 256)

# CPU:量測向量化的「SIMD」效果(量級示意)
t0 = time.time(); C1 = gpu_matmul_sim(A, B); t_gpu = time.time()-t0
print(f"\n256x256 矩陣乘法:")
print(f"  向量化/SIMD:{t_gpu*1000:.2f} ms")
print(f"  結果正確:{np.allclose(A@B, C1)}")
print(f"  GPU 實際加速(真實 GPU):10–100x vs 單執行緒 CPU")
輸出:
warp 分歧效率(32 執行緒):
  1 條分歧路徑 → 效率 100%
  2 條分歧路徑 → 效率 50%
  4 條分歧路徑 → 效率 25%
  8 條分歧路徑 → 效率 13%

256x256 矩陣乘法:
  向量化/SIMD:1.24 ms
  結果正確:True
  GPU 實際加速(真實 GPU):10–100x vs 單執行緒 CPU
(warp 分歧效率——若執行緒走不同分支,warp 必須序列化執行所有路徑,效率 = 1/max路徑數。 GPU 的編程要點:避免分歧、確保線程訪問連續記憶體(coalescing)。)

結案 -- 後果與影響#

  • GPU 硬體演進(1993–2024): | 年份 | 晶片 | 特色 | |------|------|------| | 1997 | NV1 | 首顆 NVIDIA 3D 加速器 | | 1999 | GeForce 256 | 首顆定義 GPU 術語的晶片 | | 2006 | G80 | 首個 CUDA 架構(128 個類比核心) | | 2012 | Fermi | 首個雙精度(FP64)CUDA 架構 | | 2016 | Pascal (P100) | HBM2、NVLink,16nm | | 2020 | Ampere (A100) | TF32、3rd-gen Tensor Core | | 2022 | Hopper (H100) | Transformer Engine、80GB HBM3 | | 2024 | Blackwell (B200) | 208B 參數 AI 模型 |
  • CUDA 生態(2007–):「CUDA 生態壁壘」——GPU 通用運算的第一壁壟斷生態, 幾乎所有 AI 框架(PyTorch、TensorFlow、JAX)都優先支援 CUDA。
  • AI 訓練的硬件基礎(2012–):AlexNet(見「2012-GPU深度學習算力.md」)用 2 塊 GTX 580 訓練 ImageNet—— 從此 GPU 成為 AI 的事實標準硬體(2024 年 NVIDIA 市佔 >80%)。
  • HBM 記憶體革命(2015–):GPU 的瓶頸從算力轉為記憶體頻寬——高頻寬記憶體(HBM): A100 的 HBM2e 頻寬 2039 GB/s(vs CPU DDR5 ~100 GB/s)——頻寬決定 AI 訓練速度。
  • 從遊戲到科學計算:GPU 已用於天文模擬(銀河演化)、分子動力學(COVID 疫苗設計)、 密碼學挖礦、神經網路推論——加速全人類的科學計算。
  • 歷史定位:GPU 是「資料平行」時代的必然產物——當單執行緒性能停滯(見「2007-多核心CPU.md」), 更多平行核心 + 更高頻寬 成為提升性能的正確道路。

關鍵人物與文獻#

  • J. Huang:NVIDIA 創辦人兼 CEO (1993);C. Malachowsky, C. Priem:共同創辦人。
  • G80 CUDA 架構(2006–2007)——通用運算平台化。
  • J. Nickolls 等:〈Programming Massively Parallel Processors〉(CUDA 教科書,2009)。
  • 相關案件:2012-GPU深度學習算力.md、2007-多核心CPU.md、1978-Intel8086.md、1981-CISC與RISC之戰.md。