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

為何要專門化?後摩爾時代的賭注

幾十年來,通用晶片每年都自動變快,免費的,所以打造專用硬體毫無道理。那段免費搭車的歲月結束了——本篇解釋為什麼專門化的加速器如今成了最划算的賭注、它的代價何在,以及它真正划得來的時機。

結束了的免費午餐

在計算史的大半時間裡,想要速度的程式設計師只要等就好。摩爾定律 讓晶片上的電晶體數量大約每兩年翻一倍,而一條較安靜的夥伴定律——Dennard 縮放——意味著那些更小的電晶體也切換得更快、耗電更少,於是時脈率自動往上爬。同一支 C 程式,在明年的通用 CPU 上不用任何人動手就跑得更快。在那個世界裡,打造專用硬體是件傻事:等你的客製晶片流片完成,一顆普通處理器早已迎頭趕上。

接著,夥伴定律先垮了。大約在 2005 年,Dennard 縮放實際上走到了盡頭:電晶體持續縮小,但你再也無法同步降低它們的電壓,於是功率密度不再下降。把更多、切換更快的電晶體塞進同一塊面積,如今意味著比你能散去的更多熱量——這就是 功率牆(power wall)。我們在時脈率上撞到了一道硬天花板,這也正是業界轉向 多核心 而非單一顆越來越快的核心的原因。摩爾定律本身此後也放緩了、變得貴得驚人,迎來了我們所謂的 後摩爾時代

暗矽,以及專門化的理由

這就是功率牆把我們逼進的尷尬牆角。摩爾定律仍然每塊晶片多給我們一些電晶體,但 Dennard 縮放的終結意味著,我們無法在不熔化的前提下,讓它們全部同時全速運轉。為了守住功率預算,你在任一時刻必須讓晶片上閒置(變暗)的那一部分,就叫 暗矽(dark silicon)——而它隨著每一代製程不斷變大。於是問題反轉了。稀缺的資源不再是電晶體,而是能量。新的賽局不是「我要怎麼用光所有電晶體?」,而是「在我點得起的那幾顆裡,每一焦耳能榨出多少有用的工作?」

這個重新框定,就是 專門化 的全部論據。一顆通用 CPU 把大半能量花的不是你真正的算術,而是「保持彈性」這套機制上:擷取並解碼每一條指令、預測分支、重命名暫存器、為了能跑你丟給它的任何程式而重排與追蹤指令。對一次乘法來說,這些額外開銷可能讓乘法本身相形見絀。一個 硬體加速器 把那層開銷剝掉。如果你已經知道工作負載——譬如矩陣相乘——你就能打造只做這件事的硬體,幾乎不付擷取解碼的稅,把你珍貴的能量預算花在算術上,而不是花在記帳上。專門化如今勝出,正正因為極限是能量,而不是電晶體。

彈性光譜與四條準則

專門化不是一個開關,而是一個旋鈕。想像一條從最有彈性到最有效率的光譜。CPU 什麼都能跑,卻把能量浪費在彈性上。GPU 犧牲通用性換來數以千計的簡單車道——一千個實習生各做一個小小的加法——在規律而平行的工作上閃閃發亮。FPGA 是一塊製造後還能重新接線的邏輯織物,犧牲一些速度與密度,換來「幾乎能變成任何電路」的能力。ASIC 則是蝕刻在矽裡的硬體,把一件事做到極致,別的什麼都不做。當你往效率那一端移動,你贏得每瓦效能,卻失去改變主意的自由——下一篇會詳細走過這條 CPU 到 ASIC 的光譜。

當架構師真的往那效率端設計一個 領域專屬架構 時,有幾條準則反覆出現,頻繁到讀起來像一份食譜。它們全都源自同一個目標:把能量花在真正的計算上,而不是花在搬資料或保持通用上。

  1. 使用專屬、由軟體管理的記憶體。不要用一層層自動的快取階層,而是給加速器小巧、明確、由編譯器掌控的 便箋記憶體。當你事先就知道資料的流動,你就能把它擺到完美的位置,省下快取的能量與猜測。
  2. 把電晶體花在算術上。用大量平行運轉的算術單元,取代 CPU 的擷取-解碼-排程開銷。一個領域加速器可能有數百到數千個乘法器,而一顆 CPU 核心只有寥寥幾個。
  3. 善用該領域自身的平行性。讓硬體去貼合問題的形狀——影像像素用寬闊的資料平行車道,矩陣相乘用一張網格——讓工作負載中天然的平行性,以最少的控制直接映射到矽上。
  4. 把精度降到該領域所能容忍的最低。許多領域並不需要 64 位元浮點。改用 8 位元整數或 16 位元浮點,讓每個算術單元更小、更便宜,於是你能塞進多得多的單元,每個結果搬動的位元也少得多。

招牌範例:深度學習加速器

把四條準則展現得淋漓盡致的教科書代言人,是 深度學習加速器,而 Google 的 張量處理單元(TPU)是經典案例。為什麼神經網路掙得了一顆自己的晶片?因為它們的內層迴圈幾乎全是同一個運算——稠密的 矩陣相乘——以龐大的規模反覆進行,而那正是專門化最愛的「龐大、穩定、平行」的工作負載。一個網路把同樣形狀的算術做上數十億次,所以付一次性的硬體代價把它做好,攤提起來漂亮極了。

TPU 的核心是一個 脈動陣列(systolic array):一張由微小乘加單元構成的網格,矩陣資料有節奏地流過它,就像你早先見過的洗衣流水線,每個單元在每一個時脈滴答把自己的部分結果交給鄰居。整套設計的重點在於:一個值一旦從記憶體讀出,就在陣列上行進,被許多單元重複使用後才離開——於是每擷取一個位元組,你就做了巨量的算術。這很要緊,因為在這個領域,真正的瓶頸不是乘法而是 資料搬移:餵飽算術單元比打造它們還難,這也是為什麼這個設計如此拚命地重複使用每一個位元組。下一篇會逐個單元拆開這個 脈動陣列

精度那條準則在這裡展現得活靈活現。訓練與推論能容忍出奇粗糙的數字,所以這些晶片倚重 降低精度——bfloat16(一種 16 位元浮點,保留 32 位元浮點 那寬廣的指數範圍,卻丟掉尾數位元)與 int8(推論用的 8 位元整數)。一個 int8 乘法器的面積大約只有 32 位元浮點乘法器的四分之一,於是你能塞進多得多的乘法器,並且只需把四分之一的位元送過珍貴的記憶體連線。在這裡,精度低不是瑕疵;它是一個刻意的、由領域所正當化的取捨,買到吞吐量、省下能量。

無處不在的加速器,與誠實的但書

深度學習搶走了頭條,但加速器其實老資格而且到處都是。一個 數位訊號處理器(DSP)是為音訊與無線濾波的乘加運算調校的。視訊編解碼器是固定功能的區塊,以 CPU 能量的極小一部分編碼與解碼串流——這正是你的手機播放 4K 卻不發燙的原因。一個 加密引擎 用硬體做 AES 與雜湊,讓加密幾乎免費;一個 智慧網卡或 DPU 則把網路與儲存的工作整個從主 CPU 卸載出去。模式始終如一:找一個熱門、重複、被充分理解的任務,把它烤進專屬的矽裡。

在現代手機或筆電裡,這些東西沒有一個是孤立存在的——它們全都同住在一顆 系統單晶片(SoC,system-on-chip)上:單一塊晶片上載著 CPU 核心、一顆 GPU、一個影像處理器、一個神經加速器、一個 DSP、視訊編解碼器等等,由一張晶片內的網路縫合在一起。設計這樣一頭巨獸,逼出了 軟硬體協同設計:晶片與驅動它的軟體是一起塑形的,因為一個加速器若沒有真能餵飽它算術單元的編譯器與執行時,就一文不值。你不再是把一顆完工的 CPU 交給程式設計師;你把矽與它的軟體當成同一個系統來設計。