JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

功率與能耗:真正的限制

數十年來架構師追逐速度;如今決定一顆晶片的問題卻是「我們能排掉多少熱、又會耗掉多少電池?」。本篇把功率與能耗分開,打開產生兩者的電晶體開關動作,並說明為什麼像能量延遲積這樣的指標,才是你真正該去最佳化的對象。

為什麼成為高牆的是功率而非速度

在這個梯級先前的篇章裡,你學會了用效能鐵律來界定效能:CPU 時間 = 指令數 x CPI x 週期時間,也看到了為什麼單看 MIPS 與高時脈會誤導人。在週期時間背後,一直潛伏著第四個量,如今它已走到舞台正中央:功率。一顆現代晶片能設計得更快,前提是你供得起它所汲取的電流、也排得掉它所產生的熱。當你做不到,速度就不再重要了——這顆零件會自我降頻或燒掉。如今功率而非純粹的週期數,才是其他每個決策都要從中支出的預算。

有兩個詞老是被混為一談,所以先把它們釘清楚。功率是能量被使用的速率,以瓦特計量;它是冷卻系統與牆上插座在每一瞬間都得跟上的東西。能量是功率對時間的積分,以焦耳計量;它是消耗電池、出現在電費單上的東西。一顆 10 瓦的手機晶片與一顆 100 瓦的桌機晶片,功率差了十倍,但若桌機把同一件工作做得快上十倍,兩者花的能量可以一樣多。這個區別不是吹毛求疵:為其中之一最佳化,可能會實實在在地傷害另一個,而你在乎哪一個,完全取決於你在打造什麼。

瓦特從哪來:動態功率與靜態功率

要知道該轉哪個旋鈕,你得打開電晶體,看看它燒掉功率的兩種方式。第一種是動態功率:每當一個電晶體真的切換時所花的能量。每個邏輯閘的輸出都驅動一個微小的電容——它所連接的導線與閘輸入——把那個節點從 0 翻到 1 會替電容充電,再翻回去則把那些電荷傾倒到地、化為熱。在一顆晶片上每秒做這件事數十億次,累積起來就很可觀。其支配關係式很短、值得背下來:動態功率正比於 C times V^2 times f,其中 C 是被切換的電容、V 是供應電壓、f 是時脈頻率。

用架構師的眼光來讀這條公式。頻率 f 只出現一次,所以把時脈加倍大致會把動態功率加倍——若沒能把實際工作量也加倍,這已是個糟糕的交易。但電壓 V 是平方出現,這是整篇最重要的事實:小幅降壓能換來大幅降功率。這正是為什麼單純把時脈往上拉——也就是效能鐵律早已警告過你的百萬赫茲迷思——是雙重地糟:你直接在頻率上付出,而且因為更快的時脈通常需要更高的電壓才來得及切換,你還在電壓的平方上付出一次。

第二種流失是靜態功率,也稱為漏電。即便一個電晶體靜止不動、什麼都沒切換,仍會有一絲電流從它身上滲過——現代電晶體是不完美的開關,而它們做得越薄越小,就漏得越兇。靜態功率只因為晶片通著電就持續地付出,不管它有沒有在做有用的工作。早年漏電可以忽略;在今日深奈米製程裡,它可能占總功率的三分之一甚至更多,這正是為什麼一支「睡著」的手機仍在耗電,也是為什麼把整塊電路徹底關掉,如今成了第一等的設計手法。

total chip power = dynamic + static

  dynamic  ~  C  x  V^2  x  f     (paid only when nodes switch)
  static   ~  V  x  I_leak        (paid continuously, just for being on)

knobs and what they cost / save:
  raise f      -> linear power up,  faster (if work scales)
  lower V      -> QUADRATIC power down,  but slower switching
  gate a block -> kills its dynamic power, idle clock saved
  power off    -> kills its static power too, but slow to wake
兩個功率項,以及架構師實際拉動的槓桿——注意電壓對動態項那平方般的掌控力。

動用電壓旋鈕:DVFS 與閘控

因為電壓以平方主宰動態功率,最有力的單一槓桿,就是在不需要全速時把電壓與頻率一起調低。這就是動態電壓頻率調整,即 DVFS。當你在讀文字、或手機閒置時,晶片降到低電壓與低時脈;當遊戲一開,它再把兩者拉回來。單獨降頻能省功率卻不省能量——你跑得更慢、跑得更久,燒掉的焦耳一樣多才把事做完。真正的勝利來自把它與降壓配對,因為較低的時脈可以用較低的電壓達成,而那個平方項,正是真正省下能量的所在。

第二類手法是閘控:別再替你沒在用的部分付錢。時脈閘控把送往閒置電路的時脈凍結,於是它的暫存器停止翻動、動態功率降到近乎零——但它仍通著電,所以仍在漏電。電源閘控更進一步,把供往該電路的電壓整個切斷,連靜態功率也一併殺掉,代價是會失去該電路的狀態、並需要時間把它重新通電喚醒。可以用一間房子來想:時脈閘控是把空房間的燈關掉;電源閘控是把整個側翼的總開關拉下。前者瞬間且復原便宜;後者省得更多,但回來要花一點時間。

對的指標:能量、延遲,與兩者之積

那你到底該最佳化哪個數字?只把功率壓到最低是個陷阱:功率最低的晶片,是那顆被關掉、什麼都不算的。只把能量壓到最低比較好,卻仍不完整——你大可靠著慢得令人抓狂來在能量上取勝。誠實的答案是,效能與能量必須一起權衡,而最乾淨地做到這件事的單一數字,就是能量延遲積。你把一件工作所花的能量,乘上它所花的時間(延遲);較低的能量延遲積意味著你每焦耳做了更多工作,而不是只靠把速度全部換掉來達成。

能量延遲積也揭露了為什麼一個低電壓、低頻率的設計,並不自動就是「高效」。把電壓降得太狠,切換會慢到延遲暴增;每次運算的能量也許降了,但延遲升得更快,乘積反而變差。這裡有個甜蜜點,它落在哪,取決於你在乎什麼:一個每小時才醒一次的電池感測器,把延遲看得很輕、在能量上猛推,而一台交易伺服器則把延遲看得很重。有些團隊用能量乘上延遲平方,好把天平更往速度那邊壓。指標是一種選擇,它應當映照你的目標。

注意這如何繞回這個梯級稍早的效能鐵律。鐵律告訴你執行時間是 指令數 x CPI x 週期時間,而每一層——編譯器、指令集架構、微架構、製程——都撥動其中一個因子。能量是同一個故事、多了一個維度:一個聰明的微架構縮小了 CPI,卻把每條指令所切換的電容加倍,它也許跑得更快,卻燒掉更多焦耳。你無法把時間與能量關在不同房間裡各自最佳化;一個對鐵律有益的改動,可能傷害能量延遲積,而一個認真的架構師永遠把兩者一起呈報。

為什麼這結束了一個時代——又通往何處

大約四十年裡,晶片幾乎免費地越來越快,這背後的原因有個名字:Dennard 縮放。隨著電晶體縮小,你可以同步降低電壓,於是每一個新世代塞進更多電晶體、每個還切換得更快,而功率密度——每平方毫米的瓦特數——卻大致維持不變。回頭看 C times V^2 times f,你就能看出那個魔法:更多、更快的電晶體配上更低的 V,讓每單位面積的熱維持平坦。這正是悄悄推動 1990 年代時脈節節攀升的引擎,一頓與摩爾定律給你更多電晶體並行運作的免費午餐。

大約在 2005 年,那具引擎熄火了。電壓無法再隨每次縮小而下降,因為在很低的電壓下,漏電流會爆增、電晶體也不再可靠地切換。當 V 卡住,V^2 這一項就停止下降,於是塞進更多、更快的電晶體如今意味著每單位面積更多的熱——你便撞上了功率牆,也就是你根本無法替一顆讓所有東西全速運轉的晶片散熱的那個點。這是現代計算機結構單一最重要的轉捩點,而它不是行銷話術式的放緩;它是物理。Dennard 縮放的終結,正是為什麼你的筆電沒能一路爬過幾個 GHz。

接下來發生的一切,都是業界對這道牆的回應,也為你接下來的攀登鋪好了路。若你無法在功率預算內把單一核心做得更快,那就改在晶粒上放許多較慢、較省的核心——這正是為什麼多核心會突然到來,而非因為平行程式設計變容易了。若你負擔不起讓每個電晶體同時都在切換,就讓一些保持黑暗——也就是本梯級最後一篇正面迎擊的暗矽。而若一個通用核心每次有用運算浪費太多能量,就打造一個專用加速器,用一小部分的能量去做某一件事。功率不只限制了架構;它重新導向了整個領域。