記憶體牆(memory wall)
想像一位廚藝高超的大廚,一分鐘能切好、做好一百道菜,可食材進廚房的唯一通道,是一個服務生來回走到走廊盡頭的儲藏室去拿。很快,大廚這一班裡大部分時間都在乾站著,等下一籃蔬菜送來。這就是記憶體牆:幾十年來,處理器做算術的速度,遠比記憶體把資料送過來供它運算的速度漲得快。算力變便宜了,搬資料卻沒有。所以對許多真實的工作負載來說,真正的瓶頸不是算,而是餵給它去算。
這道鴻溝,可以一路追溯到你在階梯更低處遇到過的一個極限。2006 年前後 Dennard 縮放走到盡頭、時脈頻率不再上漲,晶片廠商的回應是堆更多核心、更寬的向量與張量單元,於是一顆現代 GPU 或 TPU 每個週期都可能索取驚人數量的資料。主記憶體(DRAM)也在進步,但主要進步在容量上,而不是位元組在那顆獨立記憶體晶片與處理器之間、沿著狹窄的連線和連接器流動的速度。每一次出片下片都要花時間,還要耗掉大量能量,往往遠超過運算本身的能耗。結果就是一顆昂貴的加速器多半處於「挨餓」狀態,它的算術單元都在等運算元。
對付這堵牆有兩大類思路,而且兩者都是在做幾何文章,而不是把電晶體造得更快。第一類是把記憶體在物理上挪得更近、把通路修得寬得多:高頻寬記憶體(HBM)是一疊 DRAM 裸晶用矽通孔(TSV)連起來,再停放在矽中介層(interposer)上、緊挨著處理器,用成千上萬條又短又並排的連線,取代那幾根纖細的板上走線。第二類是把計算挪到資料身邊,也就是近記憶體計算與記憶體內計算,讓簡單的運算發生在記憶體內部或旁邊,於是位元組幾乎不必長途奔波。兩者都沒有讓某一顆電晶體變快,但都縮短了資料必須移動的距離。
off-package DRAM (a few wide-ish DDR channels):
[CPU/GPU] === bus ===========> [ DRAM chip ] far, narrow-ish, power-hungry
HBM stack on a silicon interposer (data travels ~mm, on 1000s of wires):
+--------+ <- DRAM die
+--------+ <- DRAM die } TSV-stacked
+--------+ <- DRAM die
| logic |
[ GPU ]====||==== thousands of short, parallel links
---------- interposer ----------板外 DRAM 逼著資料擠過幾條又長又窄的通道;HBM 則用 TSV 把 DRAM 堆疊起來、放到處理器旁邊的中介層上,用成千上萬條又短又並排的連線換掉那幾根纖細的走線,把管道拓寬。
記憶體牆本質上是資料搬運的頻寬與能耗問題,而不是容量問題——正因如此,真正在對付它的是封裝與整合,而不是更精細的微影。