真正會用完的東西
把一顆晶片遞給初學者,他們只會問一個問題:它跑多快?速度感覺像是頭條數字——幾 GHz、每秒幾十億次運算。但只要跟那些真正在出貨手機與伺服器的工程師待上一天,你就會一次又一次聽到另一個詞:功耗。你的筆電處理器其實可以在幾秒內跑兩倍快——然後它就會自己把速度降下來,因為它已經燙到不能摸了。你手機的晶片其實夠快了;大家抱怨的是電池到晚餐時間就沒電了。真正的天花板幾乎從來不是「我們速度用完了」,而是「我們的功耗預算用完了」。
功耗把三種看似毫不相干的抱怨,串成同一個工程問題。電池:你的設計每浪費一毫瓦,就是某個人在火車上少了一分鐘的螢幕時間。電費:一座超大規模資料中心可以拉到幾十百萬瓦的功率,效率差個幾個百分點,就是一年數百萬美元,甚至是一個國家用電量裡量得出來的一塊。發熱:晶片消耗的每一焦耳能量,最後都會化成熱,從一個郵票大小的封裝裡冒出來,而你能多快把這些熱帶走、不讓矽晶片真的劣化,有一道很硬的物理上限。同一個數字——功耗——穿著三套不同的戲服。
破裂的好交易:登納德縮放與熱牆
有大約三十年的時間,晶片設計師活在一頓美麗的免費午餐裡。每隔一兩年就有一個新的製程節點,帶來更小的電晶體;而 1974 年由 Robert Dennard 提出的一項觀察,許諾了某種近乎魔法的好處:只要你把電晶體的每一個維度都縮小 30%,同時把它的供應電壓按同樣比例降低,功率密度——也就是每平方毫米的瓦數——就會維持不變。你在同樣的面積、同樣的發熱之下,得到更多、跑更快的電晶體。這就是登納德縮放,也是晶片能年復一年大幅變好卻不會熔掉的原因。
然後,大約在 2005 年,這筆交易崩盤了。問題出在電壓。要守住登納德的協議,你就得持續降低供應電壓;但一旦低於大約 1 伏特,電晶體的臨界電壓就不再配合——再往下壓,電晶體就永遠關不乾淨,於是漏電電流暴增。電壓不再縮放了。而一旦電壓停止下降、電晶體數量卻繼續攀升,功率密度就會開始飛快上升。突然之間,你能塞進晶片的電晶體數量,遠遠超過你能同時開啟、又不超過封裝散熱上限的數量。
那道缺口有個名字:暗矽。在現代晶片上,任一瞬間都必定有一大部分電晶體得閒置——也就是「暗」著——純粹因為把它們全部同時點亮,就會撐爆功率與散熱預算。這正是 2005 年之後晶片變了形狀的最大單一原因:我們不再追求一顆愈來愈快的核心,而是換成許多核心,外加一堆專用加速器,平時都關著,直到它們的工作恰好出現的那一刻才打開。整門現代晶片設計的藝術,就是在挑選哪一塊矽要保持暗著。
主方程式:P = 動態功耗 + 漏電功耗
要對付功耗,你得先替它命名——說清楚它跑去哪了。在一顆 CMOS 晶片裡——這是當今幾乎所有數位設計背後的技術——總功耗會乾淨地分成兩桶,而這整個軌道接下來,就是一套縮小這兩桶的工具箱:
P_total = P_dynamic + P_leakage
( the work ) ( the tax )
P_dynamic ≈ α · C · V² · f <-- charging & discharging wires/gates
│ │ │ │
│ │ │ └─ clock frequency (toggles per second)
│ │ └────── supply VOLTAGE, squared ← the big lever
│ └────────── capacitance you must charge
└────────────── activity factor α (0..1): how OFTEN it toggles
P_leakage ≈ V · I_leak <-- current that flows even when IDLE好好盯著動態那一項:P ≈ α·C·V²·f,因為它四個旋鈕裡有三個,都點名了本軌道未來的某一階。電壓 V 是被平方的——這是整個低功耗設計裡最強大的單一槓桿,也是為什麼把供應電壓從 1.0 V 降到 0.7 V,動態功耗就大約砍掉一半。f 是時脈頻率:跑慢一點就燒少一點,這正是動態電壓與頻率調節(DVFS)的核心想法。而 α 是活動因子——某個節點真正翻轉的時脈週期所佔的比例。每個週期都翻一次的節點 α = 1;一秒才變一次的控制訊號 α 趨近於零。如果某個區塊什麼都沒做,最便宜的做法就是確保它的 α(理想上連同它的時脈)真的是零。
我們來真的算一次:一個實際區塊的功耗
方程式在你還沒把數字塞進去之前,總是顯得抽象。所以我們就來估一個區塊——比方說手機 SoC 裡的一小條資料路徑——只用動態那一項。我們會估它的動態功耗,並看著每一個旋鈕如何在公式裡掙得自己的位置。跟著步驟走;這裡的算術是刻意保持簡單的。
- 寫下四個旋鈕。 我們的區塊有大約 C = 1 nF 的切換電容(會翻轉的閘極與導線總電容),跑在 V = 0.8 V、時脈 f = 1 GHz,平均每個週期約有 α = 0.1 的節點會翻轉(一個典型、沒滿載的區塊)。
- 代入 P = α·C·V²·f。 也就是 0.1 ×(1×10⁻⁹ F)×(0.8 V)²×(1×10⁹ Hz)。注意電容帶來的 10⁻⁹ 與頻率帶來的 10⁹ 剛好抵消——一個讓心算變乾淨的美好巧合。
- 乘起來。 0.8² = 0.64。所以 P = 0.1 × 0.64 = 0.064 W ≈ 64 mW。這就是你這個區塊的動態功耗——大約等於一顆亮指示燈 LED 的耗電,而它只來自一小條資料路徑。
- 現在拉一根槓桿,看看會怎樣。 把供應電壓降到 V = 0.6 V(其他都不動)。因為 V 是平方的,0.6² = 0.36,於是 P 降到 0.1 × 0.36 = 36 mW——光一次電壓改動就砍掉 44%。改成把活動因子減半到 α = 0.05,功耗也減半到 32 mW。這就是整個軌道的縮影:每一章都是一種有紀律地去推動其中一個旋鈕的方法。
ESTIMATE (dynamic only) P = α · C · V² · f
baseline α=0.10 V=0.8 → 0.10 · 1nF · 0.64 · 1GHz = 64 mW
lower V α=0.10 V=0.6 → 0.10 · 1nF · 0.36 · 1GHz = 36 mW (-44%)
lower α α=0.05 V=0.8 → 0.05 · 1nF · 0.64 · 1GHz = 32 mW (-50%)
───────────────────────────────────────────────────────────────
...and on top of ALL of these sits a constant leakage tax,
burned even when the block is idle: P_leak = V · I_leak這個軌道將交到你手裡的工具箱
現在,你可以把這個軌道接下來的內容,當成一場有組織的單一戰役來讀。每一章都是一件工具,瞄準 P = α·C·V²·f + V·I_leak 裡的某一項——而知道某項技巧在攻打哪一項,本身就等於理解了它的一半。
- 攻打 α(活動): 時脈閘控(clock gating)——當某個區塊無事可做時,就切斷它的時脈,讓它的節點乾脆停止翻轉。最便宜的一瓦,是你從來沒切換過的那一瓦。
- 攻打 V(電壓): 多電壓域與動態電壓頻率調節(DVFS)——讓忙碌發熱的部分跑在全電壓,讓打瞌睡的部分待在較低電壓。因為 V 是被平方的,這是手上能拿到的最大單一勝利。
- 攻打 I_leak(漏電): 電源閘控(power gating)——對一個完全睡著的區塊,從實體上切斷它的供電,讓連那筆常駐的漏電稅都趨近於零。這就是手機能在你口袋裡撐上好幾天的原因。
- 描述並落實意圖: 一套功耗意圖格式(UPF)讓你能用機器可讀的方式告訴工具:哪些電域可以關閉、每個域跑在什麼電壓、訊號要怎麼安全地在域之間跨越——好讓你做出來的矽,真的照著你畫的功耗計畫去運作。
注意這套策略的形狀。動態功耗是有用工作的代價,所以遊戲規則是:只在需要的地方與時刻才做工——而且用你能勉強撐住的最低電壓去做。漏電則是「只是被供著電」就要繳的稅,所以遊戲規則是:把任何閒置的東西徹底關掉。速度從來沒有從畫面裡消失;它只是變成一樣你刻意花功耗去買的東西,在它值回票價的地方買、在其他每個地方省。