記憶體頻寬(memory bandwidth)
想像一條水管。有兩個不同的問題在描述它:一滴水從一端走到另一端要多久(那是延遲),以及它全開時每分鐘能送多少公升(那是頻寬)。一條粗消防水管有巨大的頻寬,即使任何單一一滴水的旅程並沒有更快。記憶體頻寬就是記憶體的「每分鐘公升數」:記憶體系統每秒能向處理器來回串流多少位元組。
具體來說,尖峰記憶體頻寬由一個簡單的乘積構成:匯流排寬度 x 傳輸率 x 通道數。一個 64 位元(8 位元組)的通道跑在 DDR4-3200(每秒 3200 百萬次傳輸)下,得到 8 x 3200 x 10^6 = 約 25.6 GB/s;兩個這樣的通道得到約 51.2 GB/s;八個快速 DDR5 通道得到數百 GB/s。那是理論尖峰——真實持續頻寬會更低,因為有列衝突、更新、讀寫轉向,以及不完美的存取模式。頻寬回答的是「我每秒能搬多少」,這跟延遲那個「一次存取要多久」是完全不同的一個軸向。
為何重要與誠實的標題:對於大量現代工作負載——稠密線性代數、深度學習訓練、圖處理、影像、科學模擬——設定效能上限的是記憶體頻寬、而非核心。一顆計算速度遠快過記憶體餵料速度的處理器,只能閒著等資料。Roofline 模型抓住了這點:在某個算術強度(每取一位元組做幾次運算)以下,你受頻寬限制,加再多計算也沒用。這正是高頻寬記憶體存在的原因,也是為何真正重要的數字往往是頻寬、而不是 GHz。
對一個 10 GB 的陣列求和需要從記憶體讀 10 GB。在 50 GB/s 的持續頻寬下,那是一個純由頻寬決定的 0.2 秒下限——再多的 CPU 速度都打不過它,因為核心整段時間都在等資料。
對受頻寬限制的工作,執行時間由搬運的位元組數除以頻寬決定,而非由核心決定。
標稱的尖峰頻寬是一個你很少達到的天花板。真實程式因為更新、列衝突與讀寫切換,大概只到尖峰的 50 到 80%——而且頻寬與延遲彼此獨立:一條粗管仍可能有很長的旅程時間。