持續了三十年的免費午餐
上一篇導覽以一顆安靜的炸彈作結:綁住現代電腦的限制,是功率而非速度。要看清一切為何改變,我們得把兩條著名的趨勢並排放在一起。摩爾定律是這樣的觀察:隨著製程特徵尺寸縮小,一顆晶片上的電晶體數量大約每兩年翻一倍。光憑這點,那只是更多電晶體而已。魔法來自第二位、較不出名的夥伴——Dennard 縮放——它告訴我們那些更小的電晶體對功率做了什麼。
Dennard 的洞見是這樣的:當你把電晶體的尺寸縮小某個倍數時,你也把它的電壓降低同樣的倍數,於是功率密度——每平方毫米的瓦特數——維持不變。回想上一篇:動態功率大致與電容乘上電壓平方乘上頻率成正比。把所有東西一起縮小,你就得到兩倍數量的電晶體,每顆更小、電壓更低、切換更快,卻抽取相同的總功率。這就是免費午餐:每一代製程都遞給你一顆電晶體更多、時脈率更高、卻不多吃半瓦的晶片。從 1970 年代到大約 2005 年,單執行緒效能幾乎是坐著不動就每兩年翻一倍。
為什麼牆在 2005 年左右立了起來
Dennard 縮放仰賴電壓隨尺寸同步下降。但電壓不能永遠下降。把它推得太靠近電晶體的臨界電壓,元件就無法俐落地切換;更糟的是,來自漏電的靜態功率——即使電晶體理應關閉時仍滲流而過的電流——會隨著電壓與特徵尺寸下降而爆炸式成長。大約在 2005 年,漏電與可靠性的極限意味著電壓基本上停止往下縮放,儘管電晶體仍在縮小。動態功率裡那個電壓平方項不再下降,於是把更多、更快的電晶體塞進相同的面積,如今就意味著每平方毫米更多的瓦特。
這就是功率牆:一顆晶片在把自己烤熟之前只能散掉這麼多熱,而一個固定的封裝只能排出這麼多瓦特。電壓卡住之後,那個顯而易見的老槓桿——把時脈率往上拉——如今會直接撐爆功率預算,因為動態功率隨頻率上升。於是時脈速度停在個位數的低 GHz,從那以後幾乎沒動過。突然之間,前幾篇導覽的效能鐵律狠狠咬了下來:你無法再靠縮短週期時間來持續買速度,因為功率牆禁止這件事。這才是「百萬赫茲迷思」對所有人變得顯而易見地為真的真正原因——時脈就是停止攀升了。
逃生口:不求更快,改求並行
如果你無法讓單一核心更快,但摩爾定律仍遞給你更多電晶體,答案幾乎是自己寫出來的:把多出來的電晶體花在更多核心上,而不是一顆更燙的核心。這正是業界在 2005 年左右轉向多核心晶片的原因——不是因為平行程式設計突然變簡單了(它沒有),而是因為這是把多出來的電晶體變成效能、又不撞上功率牆的唯一剩下的路。兩顆中等時脈的核心,每瓦能做的總工作量,比一顆被推到莽撞時脈的核心更多,因為動態功率隨電壓平方成長,卻只隨核心數線性成長。
但在這裡,第一篇導覽的幽靈回來纏著我們。更多核心只有在程式能被拆到它們之間時才有用,而 Amdahl 定律把這件事封得死死的:哪怕你只有 10% 的工作頑固地序列化,再多核心也贏不過 10 倍加速。所以多核心從來不是舊免費午餐的乾淨替代品——它把一個硬體能解決的問題(縮小電晶體)換成了一個軟體必須解決的問題(找出平行性)。這筆交易至今仍在償還,這也是為什麼一顆塞著上千個小工人的 GPU,在規律、可平行的數學上閃閃發光,碰上序列、滿是分支的程式碼卻一無是處。
暗矽:電晶體多到你點不亮
現在,兩條崩壞的趨勢相撞,產生了現代架構裡最詭異的事實。摩爾定律持續翻倍每顆晶片的電晶體;崩潰的 Dennard 縮放意味著每顆晶片的功率預算大致維持平坦。跨幾個世代算一算,結論無可迴避:在功率預算之內、你能全速點亮的晶片比例,每一代都在縮小。其餘部分在任一瞬間都得閒置——斷電或降頻。那塊永遠暗著的比例,就叫暗矽。
a thought experiment across process generations (transistors double; chip power budget stays flat) gen transistors fraction you can power at once --- ----------- ----------------------------- 1 1x 100% (whole chip lights up) 2 2x ~60% 3 4x ~35% 4 8x ~20% (most of the chip is DARK) numbers illustrative, not exact -- the trend is the point: silicon area is cheap, switching it all at once is not.
暗矽聽起來像純粹的浪費,但它悄悄翻轉了設計的經濟學。如果反正大部分晶片都得暗著,那麼矽面積就很便宜,而能量才是稀缺的資源。於是把暗區填滿許多專用區塊,每塊大部分時間閒置,只點亮恰好適合當前任務的那一塊。一顆現代手機晶片正是如此:一顆系統單晶片上鑲滿了 CPU、GPU、神經引擎、影片編解碼器與加密單元,其中大多數在任一瞬間都是暗的。問題不再是「我們怎麼讓每顆電晶體都忙起來?」,而變成了「為了這份工作,我們該喚醒哪幾顆電晶體?」
工具箱:閘控、DVFS 與專用化
架構師用一個小而鋒利的工具箱對抗功率牆。最直接的工具是閘控:別在你沒在用的部位上浪費功率。時脈閘控凍結通往閒置區塊的時脈,讓它的電晶體停止切換,動態功率掉到接近零;電源閘控更進一步,乾脆切斷供電,連漏電也一併殺掉,代價是重新喚醒需要時間。第二個工具是 DVFS——動態電壓頻率調節——它在重負載下把電壓與時脈一起往上滑,機器閒置時再滑回來。因為功率隨電壓平方下降,在你不需要尖峰速度時把電壓降一點,就能省下大量能量。
- 一陣工作湧到,於是調節器把電壓與時脈拉高(DVFS 升),以低延遲完成它——每週期的能量很高,但工作很快結束。
- 閒置的區塊——比方通話時的 GPU——被時脈閘控,於是它們的電晶體停止切換,不燒任何動態功率。
- 突發工作做完後,調節器降低電壓與時脈(DVFS 降);因為功率隨電壓平方下降,哪怕降一點點也省下大量能量。
- 閒置夠久的區塊會被整個電源閘控,連漏電也殺掉——以較慢的喚醒換取接近零的靜態功率。
但最深層的工具是專用化,而暗矽正是讓它划算的東西。一顆通用 CPU 把大部分能量花的不是在你真正的算術上,而是在額外開銷——擷取、解碼、排程、預測分支、四處搬資料。一個領域專用架構為了一份工作剝掉那些開銷:一顆張量處理器是一片乘加單元之海,除了神經網路的矩陣數學什麼都不做,而且常以低得多的精度(降低精度)運算,因為那任務容許這麼做。做成固定功能的加速器,它在那一份工作上的能效,可以是 CPU 的十到一百倍。這就是為什麼 2005 年後的世界滿是異質晶片:不是因為專用硬體在某種抽象意義上更快,而是因為我們耗盡的是能量,而非電晶體。
誠實的綜合:哪個指標,給誰?
退一步,整一級就猛然對焦了。前幾篇導覽教了效能鐵律、延遲對吞吐量、基準測試,以及能量延遲乘積;這最後一篇解釋的是那股歷史力量——Dennard 縮放的終結——它讓上述每一個指標同時開始變得重要。當時脈能免費攀升時,「更快」幾乎是任何人需要的唯一一個字。當功率牆終結了這件事,整個領域裂解成多核心、GPU 與加速器,「哪個指標?」這個問題也隨之變得無可迴避。
於是誠實的收尾不是一個數字,而是一種思維習慣。在優化任何東西之前,先問你真正在乎什麼,再挑出量到那件事的指標——能量、延遲、吞吐量,或某種加權的混合——然後把它丟進效能鐵律與 Amdahl 定律裡,看看你真正能動的是什麼。暗矽的時代並沒有把電腦變糟;它讓電腦變得誠實。我們再也不能假裝有一個旋鈕能讓一切「變快」。我們必須說清楚:對什麼變快、為誰變快、以及在多少能量下變快——而這份清晰,正是整一級能給你的、最有用的東西。