1993 - GPU 圖形處理器(從畫三角形到通用運算)#
案件摘要#
1993 年,NVIDIA 成立(Jensen Huang、Chris Malachowsky、Curtis Priem)——最初做 NV1 3D 加速晶片。 2006 年,NVIDIA 發布 G80(首個真正通用的 CUDA 架構 GPU),2012 年 AlexNet 深度學習引爆 GPU 運算:
今日 GPU 有 數千個 CUDA 核心,為 AI、科學計算、密碼學提供 100–1000 倍 的 CPU 加速—— GPU 是 AI 時代的硬體引擎(見「2012-GPU深度學習算力.md」)。
前因 -- 為什麼會有這個案子#
- 3D 圖形的運算本質(1990s):3D 加速需要巨量的逐像素、逐頂點運算:
- 光柵化 (rasterization):把三角形投影到螢幕像素。
- 紋理映射 (texture mapping):雙線性插值(bilinear interpolation)取樣。
- 光照計算 (shading): Gouraud/Phong 著色,每像素計算法線、光源、反射。
每像素需數十次浮點運算 → 每秒百億次浮點運算——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,數個核心,每核心獨立控制流。
- 資料平行(data-parallel): \(\vec{y} = A\vec{x}\) (矩陣乘法)→ 完美平行。
- 控制分歧(warp divergence):if/else 分支不同執行緒走不同路 → 序列化執行:
- GPU 快取:依賴線程 (thread) 的鄰近性(coalescing): 連續執行緒訪問連續記憶體 → 記憶體頻寬利用率最高(coalesced access)。
第二條線索:光柵化與插值(GPU 的數學核心)#
3D 圖形管線(graphics pipeline)數學: 1. 投影變換:3D → 螢幕座標(透視投影矩陣 \(P\) ,4×4)。 2. 紋理雙線性插值:在紋理上取樣 \((\bar{u},\bar{v})\) :
- 紋理快取 (Texture Cache):局部性原理——相鄰像素取樣相同/相近紋理 → 快取命中率高。
- 光柵化三角形覆蓋率 (coverage):
第三條線索:CUDA(2007)— GPU 通用化的關鍵#
NVIDIA 的 CUDA(Compute Unified Device Architecture, 2007) 讓 GPU 可用 C 語言編程:
- 執行模型: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
結案 -- 後果與影響#
- 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。