How a GPU Actually Works
原始來源與檔名:2026-08-14T094618+0800-How a GPU Actually Works.md
SOURCE | 資訊源評估
- 準確性: 高 - 作者以淺顯易懂但技術上極度精確的方式,解釋了 GPU 的記憶體頻寬與算力之間的根本矛盾(Arithmetic Intensity),是所有 LLM 工程師必備的底層知識。
- 易理解性: 高 - 屏除了艱澀的硬體手冊術語,透過「車間與倉庫」的比喻以及簡單的算術,將深奧的硬體限制具象化。
- 閱讀策略建議: 建議反覆閱讀「Work per byte (每位元組工作量)」的計算邏輯,並對照自己在優化 LLM 推理(Inference)時遇到的瓶頸,就能豁然開朗。
NAPKIN | 餐巾紙
餐巾紙公式
效能瓶頸 = Arithmetic_Intensity (Operations / Bytes_fetched) ↔ Break-even_Ratio
如果每次從主記憶體抓資料所做的運算量(Work per byte),低於硬體的損益平衡點(如 H100 約為 300),則系統被「記憶體頻寬」卡死,算力再高也沒用。
一句話
GPU 算力很廉價,真正昂貴的是資料移動;在 LLM 領域,Token 生成慢不是因為 GPU 算不動,而是被記憶體頻寬(搬運參數)給塞爆了。
餐巾紙草圖
┌──────────────────────────────────────────
│ GPU Memory Hierarchy
│
│ [Thread] Register (Free, Instant)
│ ↓
│ [SM] Shared Memory / L1 (Very Cheap)
│ ↓
│ [Chip] L2 Cache (Noticeably Slower)
│ ↓
│ [Off-chip] HBM / VRAM (Slowest, Bottleneck) ◄── 140GB Weights Live Here
└──────────────────────────────────────────
ROUND 1: SKELETON | 骨架掃描
“這本書在說什麼”
- 核心問題: 為什麼我們租了頂級的 GPU,跑 70B 參數的語言模型生成 Token 時,算力利用率極低,每秒只能產出少量的 Token?
- 核心答案: 因為運算很便宜,但資料搬運極度昂貴。生成單一 Token 是「Memory-bound(受限於記憶體頻寬)」的極端案例(每次運算只做 1次乘加,卻要搬運整個模型的權重),必須透過批次處理(Batching)與降低精度(Quantization)來提高 Arithmetic Intensity。
- 論證結構: 演繹型(先講述 GPU 硬體設計原則,再推導出算力與記憶體的損益平衡點,最後應用在 LLM 推理場景)。
章節骨架
- 根本不對稱 (Asymmetry): 運算便宜,抓取資料昂貴。
- GPU 的架構選擇: 放棄 CPU 的複雜控制與快取預測邏輯,塞滿簡單的算術單元(ALU),靠著「瞬間切換 Warp」來隱藏資料等待時間。
- 記憶體階層 (Memory Ladder): 暫存器 -> 共享記憶體(SM內) -> L2 快取 -> 主記憶體(HBM/VRAM)。
- 損益平衡點 (Break-even ratio): 用硬體峰值算力除以峰值頻寬(以 H100 為例,大約是 300 Ops/Byte)。
- LLM 推理的極端狀況: 解析為何 Prefill 是 Compute-bound,而 Token 生成是 Memory-bound。
- 優化手段的本質: 所有優化(Batching, Fusion, Quantization)都是為了增加分子(算力)或減少分母(搬運量)。
ROUND 2: DISSECTION | 血肉解剖
“憑什麼這麼說”
論證鏈
┌────────────────────────────────────────────────────────────
│ 【硬體現實】GPU 算力成長速度遠大於記憶體頻寬成長速度
│ ↓
│ 【架構妥協】GPU 刪除複雜預測器,改以大量 Thread 切換來隱藏延遲
│ ↓
│ 【效能黃金公式】Arithmetic Intensity = Ops / Bytes。H100 門檻約為 300
│ ↓
│ 【LLM 應用】生成 1 個 Token 需要讀取所有權重(如 70B模型=140GB),但每個權重只做 2 個 Ops(乘加)
│ ↓
│ 【推導】Ops/Byte = 1。遠低於 300 的門檻。
│ ↓
│ 【結論】Token 生成永遠卡在記憶體頻寬。加大 Batch Size 是唯一能重複利用權重、提高 Ops/Byte 的方法
└────────────────────────────────────────────────────────────
關鍵證據
- H100 規格試算:989 TFLOPS (BF16) / 3.35 TB/s 頻寬 ≈ 295 Ops/Byte。任何低於此比例的任務都無法跑滿 GPU 算力。
- 生成速率的天花板:70B 模型在 16-bit 下約佔 140GB。以 3.3 TB/s 頻寬計算,讀取一次全身權重至少需要 42 毫秒 (140/3300),因此 Batch Size = 1 時,物理極限就是每秒 ~24 個 Token,不管軟體怎麼改都無法突破。
隱形假設與邊界
- 隱形假設:
- 假設模型權重太大,完全無法放入 L2 快取,必須頻繁從最慢的 HBM (VRAM) 讀取。
- 假設讀取是連續且最佳化的(如果是不連續的 Scattered 讀取,頻寬會浪費,效能會比理論極限更慘)。
- 邊界條件:
- 如果是小於 GPU HBM 頻寬極限的小模型,或者是一次灌入長文檔的 Prefill 階段(每個權重會被所有 prompt token 共用,Ops/Byte 急劇上升),瓶頸就會從 Memory-bound 轉移到 Compute-bound。
ROUND 3: SOUL | 靈魂提取
“還能怎麼用”
- 知識連接: 這一套分析方法(Roofline Model)與資料庫底層設計(Disk I/O vs CPU 運算)如出一轍。在分散式系統中,網路頻寬與本地運算的取捨也是同理。
- 行動觸發: 當你在開發 LLM 應用,發現延遲過高時,不要再盲目去升級 GPU 的運算核心(例如買更多的 TFLOPS),而是要看 GPU 的記憶體頻寬(Memory Bandwidth)有多大,或是透過降低精度(Quantization)來減少記憶體搬運。
留白提問 (Guided Reflection)
- 提問:既然 Token 生成的極限卡在記憶體頻寬,如果你是下一代 AI 晶片的架構師,你會如何設計硬體來打破這個物理極限?
- 架構師視角 (引導思路):目前的做法是把 HBM 盡可能靠近運算單元(如 2.5D/3D 封裝)。更激進的思路是「存算一體 (Processing-in-Memory, PIM)」,直接在記憶體晶片內部放入簡單的 ALU 完成乘加運算,徹底消滅那條「搬運權重的走廊」。
- 提問:為什麼 Continuous Batching (vLLM 等框架的核心技術) 在商業部署中如此重要?
- 架構師視角 (引導思路):從 Ops/Byte 公式來看,單一 Request 的 Ops 太少。Batching 把 10 個用戶的 Request 疊加,權重只需從 HBM 搬出 1 次,就能對應 10 個不同的 Context 做運算,直接將 Arithmetic Intensity 提升了 10 倍。不實作 Batching,你的 GPU 只是昂貴的暖爐。
跨域映射
- 在 高效能運算 (HPC),這叫 Roofline Model
- 在 企業管理,這叫 瓶頸理論 (Theory of Constraints, TOC) —— 擴張非瓶頸資源(GPU 算力)並不會提升整體產出,唯有解決瓶頸(記憶體頻寬)才有意義。
DEEP READ | 精讀指引 (Must-Read Segments)
[!IMPORTANT] 學習的本質需要「認知阻力」。請親自回到原文閱讀以下核心段落,感受原始論述的阻力,不要只依賴 AI 的總結。
- The break-even ratio
- 「Take the chip’s peak arithmetic rate and divide it by its peak memory bandwidth. That gives you the work-per-byte ratio… Below 300, you are limited by memory. Above 300, you are limited by arithmetic.」
- 推薦理由: 這是整篇文章最精華的數學核心(Roofline Model)。理解這個比例,你就能具備診斷任何 GPU 效能瓶頸的架構師直覺。
- Why generating a token is the worst case imaginable
- 「140 billion operations funded by 140 GB of traffic, which is 1 operation per byte… roughly three hundred times below break-even.」
- 推薦理由: 完美解釋了 LLM Inference 在 Decode 階段為何如此低效。它殘酷地指出了生成單一 Token 時的極度不平衡,打破了工程師對「買更好 GPU 就能加速生成」的迷思。
How a GPU Actually Works (Architectural Deep Dive)
前言/背景
本文旨在打破軟體工程師對 GPU 效能的迷思。當我們在頂規資料中心 GPU 上運行 70B 大型語言模型時,常會發現算力利用率極低、Token 生成速度不如預期。作者透過深入淺出的硬體原理解析,揭示了 GPU 架構中「算力廉價、記憶體頻寬昂貴」的核心矛盾,並解釋了為何 quantization、batching 與 speculative decoding 等技術是突破物理限制的必然手段,而非單純的軟體技巧。
章節詳細總結
1. 核心矛盾與 GPU 架構設計
- 根本不對稱 (The Asymmetry):在現代硬體中,執行算術運算非常便宜,但「把資料搬到運算單元」卻極度昂貴。我們可以把 ALU 想像成車間裡的工作台,而記憶體頻寬是連接倉庫與車間的唯一走廊。當走廊塞滿時,增加工作台(算力)毫無意義。
- GPU 的取捨:CPU 為了讓單一執行緒跑得快,花費大量矽面積在快取、分支預測(Branch Prediction)與亂序執行(OoO)上。而 GPU 因為處理神經網路或圖形時,大量資料執行的指令相同,所以選擇刪除控制邏輯,塞入成千上萬的算術單元。
- 隱藏等待 (Hiding Latency):GPU 面對資料讀取延遲的解法不是「縮短等待」,而是「讓等待隱形」。一個運算單元上會常駐(Resident)大量的執行緒叢集(Warp),當某個 Warp 遇到記憶體讀取停滯時,GPU 硬體能以零成本(單一 Clock tick)切換到另一個準備好的 Warp 繼續運算。這就是為何監控上的「利用率 100%」有時是假的,它只代表晶片有排入工作,但不代表 ALU 正在做有效運算(可能大家都在等資料)。
2. 記憶體階層 (Memory Hierarchy) 與物理限制
資料距離 ALU 越遠,容量越大,但讀取成本呈指數上升:
- 暫存器 (Per-thread storage / Register File):最快、無延遲。
- 共享記憶體 (On-chip scratchpad / Shared Memory):與 L1 快取同級。在同一個 SM (Streaming Multiprocessor) 內的執行緒可共享,成本極低。
- L2 快取 (Shared cache):全晶片共享,速度顯著變慢。
- HBM / VRAM (Main memory):LLM 權重存放的地方,讀取速度最慢,這也是廠商常標榜的「記憶體頻寬」數字來源。
3. 效能診斷指標:Arithmetic Intensity (Work per byte)
這是判斷 GPU 效能瓶頸的唯一真理:每次從主記憶體搬運 1 Byte,你能做多少次算術運算?
- 損益平衡點 (Break-even ratio):以 H100 為例,峰值算力 989 TFLOPS 除以峰值頻寬 3.35 TB/s ≈ 295 Ops/Byte。
- 低於 300 (Memory-bound):運算單元在等資料。擴增算力無用。
- 高於 300 (Compute-bound):資料來得比算得快。擴增頻寬無用。
4. LLM 推理的極端現實
- Token 生成 (Decode Phase):生成一個 Token 需要讀取一次完整的模型權重。每個權重只參與一次乘法與一次加法(2 Ops)。以 16-bit (2 Bytes) 的權重來說,其比例為 1 Op/Byte。這比 H100 的 300 門檻低了 300 倍!這解釋了為何 Token 生成永遠是 Memory-bound。
- 物理極限計算:70B 模型 (140GB) / H100 頻寬 (3.3 TB/s) ≈ 42ms。所以 Batch Size = 1 時,硬體極限就是 24 Tokens/sec。
- Prefill 階段:因為一次處理整段 Prompt,一個權重會與所有的 Prompt Token 相乘,Ops/Byte 瞬間飆高,此時系統轉為 Compute-bound。
5. 所有優化技術的本質歸宿
知道了瓶頸,我們就能理解各大 LLM 優化技術在解決什麼問題:
- Batching (增加分子):多個 Request 一起算,權重搬一次就能算 N 次。這是不增加記憶體負擔下,提升 throughput 最有效的方法。
- Kernel Fusion (減少分母):將多個小運算合併,中間變數留在 SM 的暫存器,不寫回 HBM。
- FlashAttention (減少分母):透過分塊(Tiling)將 Attention 的運算與中間矩陣限制在快取的 SRAM 中,徹底避免大量讀寫 HBM。
- Quantization (減少分母):將 16-bit 降至 8-bit,搬運的位元組直接減半,Ops/Byte 翻倍,生成速度(在 Memory-bound 狀態下)直接翻倍。
總結與結論
- 理解 Roofline Model 是架構師的必修課:GPU 的效能並非單一維度,必須透過
算力 / 記憶體頻寬計算出損益平衡點。了解你的工作負載(Workload)落在曲線的哪一端,才能對症下藥。 - Token 生成的物理限制不可違逆:在 Batch Size 為 1 的情況下,Token 生成的極限只由模型大小與硬體 VRAM 頻寬決定。試圖透過最佳化 CUDA 程式碼來突破這個天花板是徒勞的。
- 優化的兩條根本路徑:未來的 AI 基礎設施架構,如果不是走向極致的 Batching(如 Continuous Batching)以提升算力利用率,就是必須採用模型量化(Quantization)與 FlashAttention 等演算法級優化,盡一切可能減少資料進出 HBM 的次數。