記憶體牆
這一階梯上的每一篇指南,迄今都在講如何讓運算*更快*——更小的電晶體、FinFET 和 GAA 通道、更多的核心、專用引擎。但一顆每秒能做一兆次乘法的處理器,如果大部分時間都耗在*等待要相乘的數字*上,那它就毫無用處。數十年來,邏輯速度和記憶體速度的成長速率天差地別:處理器吞吐量陡然攀升,而主記憶體能交付資料的速度卻在爬行。兩者之間的差距年復一年地拉大,這道越拉越大的鴻溝有個名字——記憶體牆。
看清兩者*為何*分道揚鑣很有幫助。邏輯一路緊貼 摩爾定律:塞得更多、切換更快,循環往復。而主記憶體——DRAM——首要追求的是密度,以十億計地堆出廉價的位元;從一個遙遠的儲存單元裡讀出一個位元、再把它跨過電路板運送過來,這套物理過程根本沒能以同樣的速度提速。於是晶片越來越飢餓,廚房卻始終以同一個節奏上菜。結果就是處理器在大多數時間裡處於*閒置*——不是因為沒活兒幹,而是因為它需要的資料還沒送到。
重點是頻寬,而不只是容量
這裡有一個絆倒大多數人的區分。記憶體有兩個截然不同的數字。容量是它能裝*多少*——以 GB 計,相當於倉庫的大小。頻寬是你能*多快*地把資料搬進搬出——以 GB/秒計,相當於裝卸月台的寬度。人們本能地擔心容量(「我的模型是不是大到放不下?」),但在現代加速器上,一次又一次真正先用完的,其實是頻寬。
一個廚房的比喻能把它說具體。容量是你儲藏室的大小;頻寬則是你每分鐘能從儲藏室往爐台搬多少食材。哪怕你擁有一倉庫的食物,只要兩者之間只有一道窄門,你照樣做菜很慢。更糟的是,這個問題是可以量化的:假設你的處理器每做 1 次算術運算就需要 100 位元組的資料,那麼無論算術單元多快,那道門都決定了你的真實速度。工程師用運算密度來追蹤它——即每取一個位元組所完成的運算次數。當密度很低時,你就是*受記憶體限制(memory-bound)*的,此時換一個更快的運算引擎對你毫無幫助。
HBM:把 DRAM 疊起來
那麼,要怎麼把裝卸月台加寬呢?一個簡單粗暴的答案是:不再把記憶體晶片*平鋪*在電路板上、靠一小撮窄窄的接腳去搆它們,而是把它們垂直堆疊成一座高塔,再筆直地穿過矽打出連接。這就是 高頻寬記憶體(HBM):把普通的 DRAM 裸晶——通常 8 顆、12 顆甚至更多——一顆疊一顆地摞起來,鍵合成單獨一個立方體。
奧妙在於垂直布線。堆疊中的每一顆裸晶都被成千上萬個 矽穿孔(TSV)刺穿——那是一個個灌滿銅的微小孔洞,*貫穿*矽,把一顆裸晶直接連到它上方和下方的裸晶。訊號不必再跑到晶片邊緣、橫穿電路板、再繞回來,而是搭上一段短短的「電梯」,徑直順著這座塔向上。連接短,就意味著你能負擔得起*非常多*的連接,而大量並行的連接正是頻寬的本質所在:每一摞堆疊提供一條 1024 位元寬的通路,相比之下傳統記憶體只有 32 位元或 64 位元。
ordinary DRAM (flat, narrow bus) HBM stack (tall, very wide bus)
[DRAM] [DRAM] [DRAM] +----------+
| | | | DRAM 8 |
+------+------+ <- ~64-bit bus, +----------+
| long board traces | DRAM 7 | } each die
[ logic ] +----------+ pierced by
| ... | 1000s of
wide = few wires, far apart +----------+ TSVs (||||)
| DRAM 1 |
+----------+
| base die | <- 1024-bit bus
+----------+
|||| TSVs straight up中介層上的 HBM
一條 1024 位元的匯流排很美妙,但它帶來了一個新問題:上千根線得從記憶體立方體接進邏輯晶片,而普通封裝根本沒法把這麼多精細的連接並排布出來。解決辦法是把 HBM 堆疊和邏輯裸晶*兩者*都安放在一塊共用的矽板上,這塊板叫 中介層——本質上是一塊微型、超緻密的電路板,只不過它由矽製成,因而能承載像晶片本身一樣精細的線。
由於中介層是矽做的,它能在記憶體和邏輯之間並排塞進成千上萬根微觀走線,兩者僅相隔幾毫米。HBM 堆疊最終就*緊挨著*處理器——不是隔著一塊板,而是幾乎貼在一起——由一條寬到用任何其它方式都布不出來的匯流排連接起來。這種布局是 異質整合 與 先進封裝 的旗艦範例:記憶體和邏輯各自分開製造,各用自己最擅長的製程,再在中介層上結合到一起。這和 小晶片 那篇指南裡的理念如出一轍——在對的製程上造出對的那一塊,再縫合起來——只不過這次應用到了記憶體上。
short, very wide bus (1000s of wires)
+-----------+ <==============================> +-----------+
| HBM stack | | LOGIC |
| (DRAM x8 | | die (GPU/|
| + TSVs) | | AI accel)|
+-----------+ +-----------+
===|===========|=======================================|===========|===
| silicon INTERPOSER (fine wiring, both dies sit on it) |
===============================================================
| package substrate |
+--------------------------------------------------------------+
o o o o o o o o o o o <- solder balls to board近記憶體與記憶體內計算
HBM 把裝卸月台大幅加寬了——但請注意,它依舊是*同一個思路*:取來資料,把它運到運算引擎,再在那裡做運算。每一個位元組仍然要跑一趟來回,而搬動一個位元組是要耗費能量和時間的。於是一個更激進的問題隨之而來:如果我們不再把資料往運算這邊拖,而是反過來,把一點點運算搬到資料那邊呢?
這就是被稱為近記憶體計算與記憶體內計算的一類思路。*近記憶體*把簡單的處理邏輯放到記憶體緊旁邊——比如放在 HBM 堆疊下面那顆基底裸晶上——這樣歸約和過濾就能在資料離開之前先完成。*記憶體內*(即 compute-in-memory,存內計算)走得更遠,直接在記憶體陣列*內部*完成運算:由於記憶體網格的連線方式,可以誘使一排儲存單元幾乎免費地做一次乘加,而這恰恰是 AI 最倚重的運算。其動機直截了當——如果連線才是瓶頸,那麼最便宜的資料搬運,就是你壓根不做的那一次。
AI 對頻寬的飢渴
每一種工作負載都能感受到記憶體牆,但 AI 撞得最狠,值得弄清楚原因。訓練和運行一個大型神經網路,其核心就是在做巨大數字矩陣的乘法——數以十億計的權重。每個數字上的算術微不足道(一次乘法加一次加法),但你必須把*每一個權重*都流經運算引擎,而且往往每一批輸入都得重來一遍。這正是前面講過的低運算密度、受記憶體限制的情形,只不過被放大到了行星級的規模:模型大到根本無法待在快速的晶片上記憶體裡,於是只能持續不斷地從 HBM 中取出來。
這正是為什麼我們將在最後一篇指南中遇到的那些 AI 加速器——GPU、TPU、NPU——都被一摞摞 HBM 包裹著,也是為什麼每一代新晶片在吹噓*記憶體頻寬*時,嗓門跟吹噓算力時一樣大。一個面向 AI 的 領域專用架構,不只是一個更快的乘法器;它是一個由盡可能寬的管道餵養的更快乘法器,而且資料被精心布置,讓這根管道永不斷流。收束本階梯的那篇壓軸綜述會把這些線索串到一起:專用化、封裝與頻寬,不是各自獨立的把戲,而是同一套策略——當你再也無法把電晶體做得更好時,你就去把*整個系統*做得更好,而餵飽這頭猛獸,正是這場仗的一半。