John Hennessy 和 David Patterson 是 2017 年圖靈獎獲得者,目前這兩位學者都供職於谷歌,前者是谷歌母公司 Alphabet 的董事會主席,後者任谷歌傑出工程師,致力於研究機器學習和人工智慧。他們更為人所知的就是共同完成的計算機系統結構學科「聖經」《計算機體系結構:量化研究方法》了。
本文《計算機架構的新黃金時代》是兩人在 2019 年新發表的文章,完整介紹了計算機晶片的發展歷程,以及所有架構的未來趨勢,值得所有希望瞭解硬體架構的人閱讀。
圖注:2019 年 2 月刊發
2018 年 6 月 4 日,我們回顧了自 20 世紀 60 年代以來計算機架構的發展,並以此開始了我們的圖靈講座(Turing Lecture)。除了那個回顧,我們還在講座中介紹了當前的難題和未來機遇。我們還預測未來十年計算機架構領域將迎來下一個黃金時代,就像 20 世紀 80 年代那樣——我們做的研究能為我們帶來回報,能改善成本、能源、安全以及效能。
「不能銘記過去的人註定要重蹈覆轍。」
——George Santayana,1905
軟體與硬體的通訊是透過指令集架構(ISA)進行的。在 1960 年代早期,IBM 有四個互不相容的計算機產品線,每個都有自己的 ISA、軟體堆疊、I/O 系統和利基市場(分別針對的是小型企業、大型企業、科研和實時應用)。包括 ACM 圖靈獎獲得者 Fred Brooks, Jr. 在內的 IBM 工程師都認為他們可以創造一種能有效統一所有這四種 ISA 基礎的單個 ISA。
他們需要一種技術解決方案,讓便宜的 8 位資料路徑計算機與高速的 64 位資料路徑計算機都能共用一個 ISA。這些資料路徑是處理器的「身體」,它們在其中執行算術運算但相對而言較容易「變寬」或「變窄」。對於那時以及現在的計算機設計者來說,最大的難題是處理器的「大腦」——控制硬體。受軟體程式設計的啟發,計算先驅和圖靈獎獲得者 Maurice Wilkes 提出了簡化控制的方法。控制可被描述為一個二維陣列,他稱之為「控制儲存器(control store)」。這個陣列的每一列都對應於一條控制線,每一行都是一個微指令(microinstruction),而編寫微指令則被稱為微程式設計(microprogramming)。一個控制儲存器包含一個用微指令編寫的 ISA 直譯器,所以執行一個常規指令需要多個微指令。這種控制儲存器是透過記憶體實現的,成本比邏輯門要低得多。
表 1 列出了 IBM 在 1964 年 4 月 7 日宣佈的新 System/360 ISA 的 4 種型號。資料路徑的變化範圍有 8 倍,記憶體容量的變化範圍有 16 倍,時脈頻率是 4 倍,效能是 50 倍,成本接近 6 倍。成本最高的計算機的控制儲存器最寬,因為更復雜的資料路徑使用更多控制線。成本最低的計算機因為硬體更簡單而有更窄的控制儲存器,但因為它們需要更多時鐘週期來執行一個 System/360 指令,所以需要更多微指令。
表 1:IBM System/360 系列四個型號的特性;IPS 表示每秒執行指令數。
在微程式設計的推動下,IBM 將公司的未來押在了這款新 ISA 上,寄希望其能革新計算行業,為 IBM 贏得回報。IBM 成功主宰了這一市場,IBM 計算機家族的大型機後裔在推出 55 年後仍然每年創造著 100 億美元的收入。
正如我們反覆看到的那樣,儘管市場並不能完美地判定各種技術問題,但鑑於架構和商業計算機之間聯絡緊密,市場才能最終決定架構創新是否成功,而這往往需要大量的工程開發投入。
積體電路,CISC,432,8086,IBM PC
當計算機開始使用積體電路時,摩爾定律意味著控制儲存器可以變大很多。更大的記憶體反過來又意味著允許使用更復雜的 ISA。要知道,數字裝置公司(Digital Equipment Corp.)在 1977 年推出的 VAX-11/780 的控制儲存器為 5120 字×96 位,而其前一代僅有 256 字× 56 位。
某些製造商選擇開放微程式設計功能,讓選定的客戶能新增定製功能,他們稱之為「可寫控制儲存器(WCS)」。最有名的 WCS 計算機是 Alto,這是圖靈獎得主 Chuck Thacker 和 Butler Lampson 及其同事於 1973 年一起為施樂(Xerox)帕洛阿託研究中心開發的。這實際上是第一款個人計算機(PC),配備有首款位映像顯示器(bit-mapped display)和首個乙太網區域網。用於這種全新顯示器和網路的裝置控制器是儲存在一個 4096 字×32 位 WCS 中的微程式。
1970 年代的微處理器(比如英特爾的 8080)仍處於 8 位時代,主要依靠組合語言編寫程式。互相競爭的設計者會透過新增新的指令來趕超彼此,他們會透過組合語言示例來展示自己的優勢。
戈登·摩爾(Gordon Moore)相信英特爾的下一代 ISA 將會伴隨英特爾的一生,因此他聘用了很多聰明的電腦科學博士,並將他們送到波特蘭去發明出色的下一代 ISA。英特爾最早命名為 8800 的計算機架構專案雄心勃勃——對任何時代而言都是如此,顯然也是 1980 年代最有野心的。它有基於 32 位的定址能力、物件導向的架構、位長可變的指令以及用時新的程式語言 Ada 編寫的自己的操作傳統。
可惜這個雄心勃勃的專案晚了幾年,迫使英特爾在聖克拉拉開始了一項緊急替換工作,在 1979 年推出了一款 16 位微處理器。英特爾給了新團隊 52 周時間來開發新的「8086」ISA 以及設計和構建晶片。鑑於日程緊迫,這個團隊實際上是把 8080 的 8 位暫存器和指令集擴充套件成了 16 位,最後只用 10 人次的 3 個常規工作周完成了這款 ISA 的設計。這個團隊按時完成了 8086 的開發,但在釋出時卻沒引起什麼關注。
英特爾非常幸運,IBM 當時正在開發一款個人計算機來與 Apple II 競爭,並需要一款 16 位微處理器。IBM 之前感興趣的是 Motorola 68000,其 ISA 與 IBM 360 類似,但卻落後於 IBM 激進的計劃。IBM 轉而使用 8086 的 8 位匯流排版本。IBM 在 1981 年 8 月 12 日推出了這款 PC,希望到 1986 年時能售出 25 萬臺。而實際上該公司在全球售出了 1 億臺,為這款緊急代換的英特爾 ISA 鋪墊了一個非常光明的未來。
英特爾原本的 8800 專案更名了為 iAPX-432,並最終在 1981 年推出,但它需要多塊晶片並且存在嚴重的效能問題。該專案在 1986 年終止,這一年,英特爾在 80386 中對 16 位 8086 ISA 進行了擴充套件,將其暫存器從 16 位擴充套件到了 32 位。因此,摩爾的預測就是正確的了——下一代 ISA 確實會和英特爾一樣長壽,但市場選擇了緊急代換的 8086,而不是專門精心開發的 432。正如 Motorola 68000 和 iAPX-432 兩者的設計師都學到的那樣:市場往往缺乏耐心。
從複雜指令集到精簡指令集計算機
1980 年代早期,人們對更大型控制儲存器中大型微程式使用的複雜指令集計算機(CISC)進行了一些研究。Unix 表明即使作業系統也可以使用高階語言編寫,關鍵問題隨之變成了「編譯器會生成什麼指令?」,而不是「程式設計者會使用什麼組合語言?」。硬體/軟體介面的顯著改進為架構創新帶來了機會。
圖靈獎得主 John Cocke 與其同事為小型計算機開發了更簡單的 ISA 和編譯器。作為實驗,他們將自己研究的編譯器的目標重新設定為:僅使用 IBM 360 ISA 中簡單的 register-register 操作和 load-store 資料傳輸,避免更復雜的指令。他們發現使用這個簡單的子集時,程式執行速度可快達三倍。Emer 和 Clark 發現 VAX 指令中 20% 的指令需要 60% 的微程式碼(microcode),但僅佔據 0.2% 的執行時間。
David Patterson 把在 DEC 的一次學術休假投入到了研究減少 VAX 指令中的漏洞上。他認為,如果微處理器製造商遵循更大型計算機的 CISC ISA 設計,則它們需要一種修復微程式碼漏洞的方法。他為此寫了一篇論文,但期刊《Computer》卻拒絕接收。審稿人認為,使用如此複雜以至於需要修補的 ISA 開發微處理器是很糟糕的。這次拒稿讓人們質疑 CISC ISA 在微處理器方面的價值。諷刺的是,現代 CISC 微處理器確實需要包含微程式碼修復機制,但他被拒稿的主要結果是啟發他為微處理器開發更簡單的 ISA——精簡指令集計算機(RISC)。
這些觀察和向高階語言的轉移為 CISC 向 RISC 的過渡帶來了機會。首先,RISC 指令是經過簡化的,因此無需微程式碼直譯器。RISC 指令通常和微指令一樣簡單,硬體可以直接執行。第二,之前用於 CISC ISA 的微程式碼直譯器的快速記憶體被用作了 RISC 指令的快取。(快取是小而快的記憶體,臨時緩衝近期執行過的指令,因為這樣的指令很可能很快就要重新使用。)第三,基於 Gregory Chaitin 圖著色方案的暫存器分配器使編譯器可以更加容易地有效使用暫存器,這對這些 register-register ISA 是有利的。最後,摩爾定律意味著 1980 年代單塊晶片中已有足以包含完整 32 位資料路徑的電晶體以及相應的指令和資料快取。
在今天的後 PC 時代,x86 的出貨量從 2011 年的頂峰每年都會下降約 10%,而 RISC 處理器晶片出貨量已經激增到了 200 億。
例如圖 1 展示了 RISC-I 和 MIPS 微處理器,它們分別由 UC 伯克利和史丹佛在 1982 與 1983 年開發,它們展示了 RISC 的優勢。這些晶片最終都展示在了頂尖電路會議上,即 1984 年的 IEEE 國際固態電路會議。當時是非常矚目的成果,因為伯克利和史丹佛的一些研究生能構建超越工業上能構建的微處理器。
圖 1:加州大學伯克利分校 RISC-1 和史丹佛大學 MIPS 微處理器。
這些學術界做出的晶片激勵了許多公司構建 RISC 微處理器,也是那之後 15 年內最快的晶片。下面的公式解釋了處理器的效能:
Time/Program = Instructions / Program x (Clock cycles) / Instruction x Time / (Clock cycle)
DEC 工程師後來表明,更復雜的 CISC ISA 每個程式執行的指令數是 RISC 每個程式的 75%(上式第一項),在使用類似的技術時,CISC 執行每個指令要多消耗 5 到 6 個時鐘週期(第二項),使得 RISC 微處理器的速度大約快了 3 倍。
這樣的公式在上世紀 80 年代的計算機架構書中還沒有,後來我們在 1989 年發表了《計算機體系架構:量化研究方法》一書。子標題表明了該書的主題:使用測量方法和基準進行量化評估,而不是像從前那樣依靠架構師的直覺與經驗。我們使用的量化方法也受到了圖靈獎得主 Donald Knuth 關於演算法的書的啟發。
VLIW、EPIC、Itanium
下一個 ISA 創新應該是對 RISC 和 CISC 的繼承。超長指令字(VLIW)及其「表親」顯式並行指令計算機(EPIC)使用了寬指令,其中在每條指令中捆綁了多個獨立操作。VLIW 和 EPIC 的擁護者當時認為,單個指令如果可以指定六個獨立的操作(兩個資料傳輸、兩個整型操作和兩個浮點操作),並且編譯器技術可以有效地將操作分配到六個指令槽,則硬體可以變得更簡單。與 RISC 方法一樣,VLIW 和 EPIC 將工作從硬體轉移到編譯器。
透過合作,英特爾和惠普公司設計了一款基於 EPIC 理念的 64 位處理器來取代 32 位 x86。英特爾和惠普公司對第一款 EPIC 處理器(Itanium)的期望很高,但實際情況與開發商的早期宣告並不相符。雖然 EPIC 方法適用於高度結構化的浮點程式,但它很難實現具有較少可預測的快取丟失或較不可預測分支的整型程式的高效能。正如 Donald Knuth 後來指出:「Itanium 方法...... 原被認為非常贊,直到事實證明所希望的編譯器基本上不可能寫出來。」專家們注意到 Itanium 的延遲和表現不佳,並借鑑泰坦尼克號事件重新將其命名為「Itanic」。市場再次失去了耐心,導致 64 位版本的 x86 成為 32 位 x86 的繼承者,而不是 Itanium。
好訊息是 VLIW 仍然適用於較窄範圍的應用程式、小程式、更簡單的分支和省略快取,包括數字訊號處理。
PC 和後 PC 時代的 RISC vs. CISC
AMD 和英特爾使用了 500 人的設計團隊和頂尖半導體技術來減少 x86 和 RISC 的效能差距。再次受到簡單流水線 vs 複雜指令效能優勢的啟發,指令解碼器在執行中將複雜的 x86 指令轉換為類似 RSIC 的內部微指令。然後 AMD 和英特爾將 RISC 微指令的執行流水線化。RISC 設計師關於效能分離指令、資料快取、晶片二級快取、深度流水線,以及同時獲取和執行多個指令的任何想法,都可以用在 x86 的設計上。AMD 和英特爾在 2011 年 PC 時代的巔峰期出了大約 3 億 5 千萬個微處理器。PC 行業的高產量和低利潤同樣意味著比 RISC 計算機更低的價格。
鑑於每年全球銷售的數億臺 PC,PC 軟體成為一個巨大的市場。雖然 Unix 市場的軟體提供商會為不同的商業 RISC ISA-Alpha、HP-PA、MIPS、Power 和 SPARC 提供不同的軟體版本,但 PC 市場卻享有單一的 ISA,因此軟體開發商提供了「收縮包裝」軟體,只與 x86 ISA 二進位制相容。2000 年,更大的軟體基礎、類似的效能和更低的價格使 x86 在桌上型電腦和小型伺服器市場中佔據主導地位。
蘋果公司在 2007 年幫助推動了後 PC 時代。智慧手機公司不再購買微處理器,而是採用其他公司的設計(包括 ARM 的 RISC 處理器)構建自己的晶片系統(SoC)。移動裝置設計人員對晶片面積和能效以及效能進行評估,表明 CISC ISA 設計的不足之處。此外,物聯網的到來大大促進了處理器的數量以及晶片尺寸、功率、成本和效能所需的權衡。這種趨勢增加了設計時間和成本的重要性,進一步使 CISC 處理器處於不利地位。在今天的後 PC 時代,x86 出貨量自 2011 年達到峰值以來每年下降近 10%,而採用 RISC 處理器的晶片則飆升至 200 億。如今,99%的 32 位和 64 位處理器都是 RISC。
結束這一歷史回顧,我們可以說市場已經解決了 RISC-CISC 的爭論。CISC 贏得了 PC 時代的後期階段,但 RISC 正在後 PC 時代佔據主導。幾十年來,都沒有出現新的 CISC ISA。令我們驚訝的是,在推出 35 年後,今天對於通用處理器來說,最佳的 ISA 仍然是 RISC。
處理器架構的當前挑戰
「如果一個問題無解,那它可能都不成問題,而是一個事實;我們不需要解決,而是隨著時間的推移來處理。」—Shimon Peres
雖然前面的部分聚焦在指令集架構(ISA)設計上,大部分計算機架構師並不設計新的 ISA,而是在現有的實現技術中實現現有的 ISA。自 20 世紀 70 年代後期以來,選擇的技術一直是基於金氧半導體(MOS)的積體電路,首先是 n 型金氧半導體(nMOS),然後是互補金氧半導體(CMOS)。摩爾的預測中捕捉到的 MOS 技術驚人的進步率一直促使架構師設計更積極的方法來為給定的 ISP 實現更好的效能。在 1965 年的最初預測中,摩爾稱電晶體密度會每年翻一番;1975 年,他又預計每兩年翻一番。該預測最終被稱為摩爾定律。因為電晶體密度呈二次增長,而增長率呈線性增長,架構師使用更多電晶體來提高效能。
摩爾定律和登納德縮放定律的終結
儘管摩爾定律已經持續了幾十年(見圖 2),但在 2000 年左右開始放緩。到了 2018 年,根據摩爾定律得出的預測與當下實際能力差了 15 倍。根據當前預測,這一差距將持續拉大,因為 CMOS 技術方法已經接近極限。
圖 2. 每個英特爾微處理器上的電晶體數量 vs. 摩爾定律
伴隨摩爾定律是由羅伯特·登納德(Robert Dennard)預測的登納德縮放定律(Dennard scaling)。他指出,隨著電晶體密度的增加,每個電晶體的能耗將降低,因此矽晶片上每平方毫米上的能耗幾乎保持恆定。由於每平方毫米矽晶片的計算能力隨著技術的迭代而不斷增強,計算機將變得更加節能。登納德縮放定律從 2007 年開始大幅放緩,2012 年左右接近失效(見圖 3)。
圖 3. 每個晶片上的電晶體及每平方毫米的能耗。
1986 年至 2002 年間,指令級並行(ILP)是提高效能的主要架構方法。而且隨著電晶體速度的提高,其效能每年能提高 50% 左右。登納德縮放定律的終結意味著工程師必須找到更加高效的並行化利用方法。
要理解為什麼 ILP 的增加會導致晶片能效大大降低,可以看一看 ARM、英特爾、AMD 當前推出的處理器核。假設該晶片有一個 15 步的工作流程,每個時鐘週期可以傳送 4 條指令。那麼在任意一個時刻,整個工作流程中至多有 60 條指令,包括大約 15 個分支,因為它們代表了大約 25% 的執行指令。為了保持工作流程完整,需要預測分支,並根據推測將程式碼放入工作流程中以便執行。推測的使用是 ILP 高效能和晶片低能效的源頭所在。如果分支預測完美,推測就能提高 ILP 效能,但能耗會增加一些——甚至可能節約能耗——但如果分支預測出現失誤,處理器就必須拋棄錯誤的推測指令,其計算工作及所耗能量就會付之東流。處理器的內部狀態也必須恢復到錯誤預測分支之前的狀態,這將花費額外的時間和能量。
要理解這種設計的挑戰性有多高,可以考慮一下正確預測 15 個分支結果的難度。如果處理器要將做無用功的時間限制在 10%,那麼它必須在 99.3% 的時間裡正確預測每個分支。很少有通用程式能夠如此準確地預測分支。
要理解這些無用功疊加起來是什麼結果,可以參見圖 4 中的資料。圖 4 顯示了有效執行的部分指令,這部分指令由於處理器推測錯誤而變得無用。在英特爾酷睿 i7 基準測試上,19% 的指令都被浪費了,但能耗的浪費情況更加嚴重,因為處理器必須利用額外的能量才能在推測失誤時恢復原來的狀態。這樣的度量導致許多人得出結論,架構師需要一種不同的方法來實現效能改進。於是多核時代就這樣誕生了。
圖 4. 在各種 SPEC 整型數基準上,英特爾酷睿 i7 浪費的指令佔完成指令總數的百分比。
多核將識別並行性和決定如何利用並行性的責任轉移給程式設計師和語言系統。多核並不能解決由登納德縮放定律終結帶來的能效計算挑戰。每個活躍的核都會消耗能量,無論其對計算是否具有有效貢獻。一個主要的障礙可以用阿姆達爾定律(Amdahl's Law)表述,該定理認為,平行計算機的加速受限於序列計算的部分。這一定律的重要性參見圖 5。圖中顯示,假設序列執行的不同部分只有一個處理器處於活躍狀態,那麼與單個核心相比,最多 64 個核心的應用程式執行速度要快得多。例如,如果只有 1% 的時間是序列的,那麼 64 核配置可加速大約 35 倍,所需能量與 64 個處理器成正比,因此大約有 45% 的能量被浪費了。
圖 5. 部分時鐘週期時間為序列模式時,阿姆達爾定律對加速的影響。
真實的程式結構當然會更加複雜,部分元件允許在給定時刻使用不同數量的處理器。然而,週期性通訊和同步的需求意味著大部分應用具備僅可高效使用一部分處理器的元件。儘管阿姆達爾定律已經出現 50 多年了,它仍然是一個很大的障礙。
隨著登納德縮放定律的終結,晶片核心數量的增加意味著能耗也隨之增加。然而,進入處理器的電能肯定有一部分會轉化為熱能。因此多核處理器受限於熱耗散功率(TDP),即封裝和冷卻系統可以移除的平均功率。儘管一些高階資料中心可能使用更先進的封裝和冷卻技術,但沒有一個計算機使用者想要在自己桌子上放置小型熱交換器,或者揹著散熱器來冷卻手機。TDP 的侷限性直接導致了「暗矽」(dark silicon)時代,處理器降低時鐘速率、關閉空閒核心來防止過熱。這種方法的另一種解釋是:一些晶片可以重新分配其珍貴功耗,將其從空閒核心轉移到活躍核心。
登納德縮放定律結束、摩爾定律衰退,而阿姆達爾定律正當其時,這意味著低效性將每年的效能改進限制在幾個百分點(見圖 6)。獲得更高的效能改進(像 20 世紀八九十年代那樣)需要新的架構方法,新方法應能更加高效地利用積體電路。接下來我們將討論現代計算機的另一個主要缺陷——電腦保安問題,之後我們會回來探討有效的新方法。
圖 6:使用整型程式得到的計算機效能提升(SPECintCPU)。
被忽略的電腦保安
20 世紀 70 年代,處理器架構師主要專注於電腦保安,涉及保護環、容量等概念。這些架構師深刻了解到,大部分 bug 存在於軟體中,但他們認為架構支援會有所幫助。作業系統大部分未使用這些功能,作業系統專注於良性環境(如個人電腦),因此具備較大開銷的功能未被使用。在軟體社群中,很多人認為微核心(microkernel)等正式驗證技術會為構建高度安全的軟體提供有效保障。但不幸的是,我們的軟體系統規模和效能驅動器意味著此類技術無法跟上處理器效能。結果就是大型軟體系統仍然有很多安全漏洞,且由於海量線上個人資訊和雲端計算的使用,其影響被放大。
登納德縮放定律的終結意味著架構師必須找到利用並行化的更高效方式。
儘管計算機架構師等很晚才意識到安全的重要性,但他們已經開始對虛擬機器和加密提供硬體支援。不幸的是,推測給許多處理器帶來了一個未知但重要的安全缺陷。具體來看,Meltdown 和 Spectre 安全漏洞給微架構帶來了新的缺陷,使受保護資訊遭到洩露。這兩種漏洞都使用了旁路攻擊。2018 年,研究者展示了在攻擊者不將程式碼載入到目標處理器的情況下,如何利用 Spectre 變體導致網路資訊洩露。儘管這次名為 NetSpectre 的攻擊洩露資訊速度較慢,但它使同一區域網中的所有機器都受到攻擊,這造成了很多新的難題。虛擬機器架構還有兩個漏洞。一個是 Foreshadow,會影響專門保護高風險資料(如加密金鑰)的英特爾 SGX 安全機制。每個月都會發現新的漏洞。
旁路攻擊並非新鮮事,但是在最早期的案例中,促使旁路攻擊成功的是軟體缺陷。而在 Meltdown、Spectre 等攻擊中,硬體實現中的缺陷導致受保護資訊洩露。這是處理器架構師定義什麼是 ISA 正確實現的一個基本難題,因為標準定義中並未提及執行指令序列的效能影響,而僅僅涉及 ISA-visible 執行架構狀態。架構師需要重新思考對 ISA 正確實現的定義,以避免此類安全漏洞。同時,他們還應該重新思考對電腦保安的側重點,以及架構師如何與軟體設計師一道實現更加安全的系統。架構師(以及每個人)都過於依賴資訊系統,以至於對安全的重視程度不如對一流設計的關注。
計算機架構的未來機遇
「我們的機遇就在那些『無解問題』之中。」——John Gardner, 1965
通用處理器固有的低效性,以及登納德縮放定律和摩爾定律的終結,使得處理器架構師和設計師很可能無法維持通用處理器中的顯著效能改進。鑑於改進效能對新的軟體能力的重要性,我們必須問:有沒有其他的有效方法?
現在有兩個很明確的機會,把二者結合起來則是第三個機會。首先,現有的軟體構建技術廣泛使用具備動態型別和儲存管理的高階語言。但是,此類語言的解釋和執行通常非常低效。Leiserson 等人使用一個小例子(執行矩陣相乘)說明了這種低效性。如圖 7 所示,簡單地將 Python 語言程式碼重寫為 C 程式碼就可以將效能提升 46 倍(Python 是典型的高階、動態型別語言)。
在多核上執行並行迴圈(parallel loops)又將效能提升接近 7 倍。最佳化記憶體配置又將效能提升了近 19 倍,而透過單指令多資料(SIMD)並行化操作(一個指令執行 16 個 32-bit 運算)的硬體擴充套件,效能又提升了 8 倍多。也就是說,最終的高度最佳化版本在多核英特爾處理器上的執行速度是初始 Python 版本的 62,000 多倍。這當然只是一個很小的例子,但我們會期望程式設計師使用最佳化庫。儘管這誇大了常見的效能差距,但很多程式的效能差距可能達到 100 到 1000 倍。
圖 7. Python 四次最佳化中矩陣乘法的潛在加速能力。
一個有趣的研究方向有關是否可以使用新的編譯器技術來縮短效能差距(可以輔以體系架構增強)。儘管高效編譯和實現 Python 這樣的高階指令碼語言比較困難,但潛在的收益是巨大的。即使實現 25% 的提升潛力,也能讓 Python 程式的執行速度提升百倍。這個簡單的例子展示了現代語言中,程式設計師強調生產力和傳統方法強調效能之間的巨大差距。
特定領域的體系結構。一種更加以硬體為中心的設計思路是設計針對特定問題和領域的架構,並給與它們強大(且高效)的效能,因此它們是「特定領域的體系結構(DSA)」,這是一種特定領域的可程式設計處理器,通常是圖靈完備的,但針對特定類別的應用進行了定製。從這個意義上來說,它們與專用積體電路(ASIC)不同,後者僅適用於單一功能,程式碼很少有變化。DSA 通常被稱為加速器,因為與在通用 CPU 上執行整個應用程式相比,它們可以加速某些應用程式。此外,DSA 可以實現更好的效能,因為它們更貼近應用的實際需求;DSA 的例子包括圖形加速單元(即 GPU),用於深度學習的神經網路處理器,以及軟體定義處理器(SDN)。DSA 效率更高,能耗更低是因為以下四個原因:
首先最重要的是,DSA 為特定領域的計算使用了更加有效的並行形式。例如單指令多資料並行(SIMD)比多指令多資料(MIMD)更有效,因為它在一個時鐘步長內只需處理一個指令流和處理單元。儘管 SIMD 相比 MIMD 沒那麼靈活,但前者適用於很多 DSA。DSA 也可以使用 VLIW 方法來實現 ILP,而不是推測性的無序機制。如前文所述,VLIW 處理器與通用性程式碼不匹配,但對於有限領域更加有效,因為它的控制機制更加簡單。特別是大多數高階通用處理器都是超標量的,需要複雜的控制邏輯來啟動和完成指令。與之相對的是,VLIW 在編譯時執行必要的分析和排程,這對於顯式並行程式來說可以很好地工作。
第二,DSA 可以更有效地利用記憶體層次結構。如 Horowitz 所述,記憶體訪問要比算數計算的成本高出很多。例如,訪問 32 千位元組快取需要的能量相當於做 32 位加法的大約 200 倍。這種巨大的差異使得最佳化儲存器訪問對於實現高能效來說至關重要。通用處理器的執行程式碼,其中的儲存器訪問通常表現出空間和時間區域性性,但在編譯時不是非常可預測的。因此,CPU 使用多級快取記憶體來增加頻寬,並隱藏相對較慢的晶片外 DRAM 延遲。這些多級快取記憶體通常消耗大約一半的處理器能量,但幾乎忽略了所有片外 DRAM 訪問,這些訪問需要大約 10 倍於最後一級快取記憶體訪問的能量。
快取有兩大缺點:
當資料集非常大的時候,時間空間位置較低時快取的工作效率很低;
當快取工作效率高的時候,位置非常高,這意味著同時根據定義,大多數快取在大多數時間都處於空閒狀態。
在那些編譯時可以很好地定義和發現記憶體訪問模式的應用程式中——這對於典型的 DSL 來說是常見的——程式設計師和編譯器可以比動態分配的快取更好地最佳化記憶體的使用。因此,DSA 通常使用由軟體明確控制運動的儲存器層次,類似於向量處理器的操作。對於合適的應用,使用者控制的儲存器可以比快取記憶體使用更少的能量。
第三,DSA 在可接受時可以使用較低的精度。適用於通用任務的 CPU 通常支援 32 和 64 位整型數和浮點數資料。對於很多機器學習和影像應用來說,這種準確率有點浪費了。例如在深度神經網路中(DNN),推理通常使用 4、8 或 16 位整型數,從而提高資料和計算吞吐量。同樣,對於 DNN 訓練程式,浮點數很有意義,但 32 位就夠了,16 為經常也能用。
最後,DSA 受益於以特定領域語言(DSL)編寫的目標程式,這些程式可以實現更高的並行性,更好的記憶體結構訪問和表示,並使應用程式更有效地對映到特定域的處理器。
特定領域的語言
DSA 要求將高階運算定位到體系架構中,但一般嘗試從 Python、Java、C 或 Fortran 等通用語言抽取結構和資訊實在太難了。因此特定領域的語言(DSL)特別支援這一過程,並儘可能高效地程式設計 DSA。例如 DSL 可以令向量、密集型矩陣和稀疏性矩陣運算變得顯式化,並允許 DSL 編譯器高效地將運算對映到處理器中。DSL 有很多常見的例子,例如專注矩陣運算的語言 Matlab、專注 DNN 程式設計的資料流語言 TensorFlow,以及專注程式設計 SDN 的語言 P4 和專注影像處理中高階轉換的 Halide 等。
使用 DSL 的挑戰是如何保證足夠的架構獨立性,使得 DSL 中編寫的的軟體可以移植到不同的架構,同時軟體對映到底層 DSA 的效率還要非常高。例如 XLA 系統將 TensorFLow 程式碼轉化為能使用 GPU 或 TPU 等異構處理器的計算圖。DSA 之間的平衡可移植性以及效率是程式語言設計者、編譯器設計者和 DSA 架構師都感興趣的研究領域。
以 TPU 為例
作為 DSA 的示例,我們可以考慮谷歌 TPU 1 的設計,它旨在加速神經網路的推斷過程。TPU 自 2015 年投入生產,它從搜尋引擎到語言翻譯和影像識別支援著谷歌各種各樣的業務,同時也支援著 AlphaGo 和 AlphaZero 等 DeepMind 前沿研究。TPU 的目標是提升深度神經網路推斷過程的效能與能源效率 10 倍。
如下圖 8 所示,TPU 的組織架構與通用處理器完全不同。它的主計算單元是矩陣單元,即每個時鐘週期提供提供 256×256 乘加運算的脈動陣列(systolic array)。TPU 還結合了 8-bit 精度、高效脈動架構(systolic structure)和 SIMD 控制特性,這意味著每個時鐘週期所能執行的乘加(multiply-accumulates)數是一般通用單核 CPU 的 100 倍。
TPU 使用 24MB 的本地記憶體以代替快取記憶體,大約是 2015 年相同功耗 CPU 的兩倍。最後,啟用值記憶體和權重記憶體(包括儲存權重的 FIFO 結構)可以透過使用者控制的高頻寬記憶體通道連線。使用谷歌資料中心常見的 6 個推斷問題的加權算術均值作為度量,TPU 比一般 CPU 要快 29 倍。因為 TPU 要求的能源少了一半,它的能源效率在這樣的工作負載中是一般 CPU 的 80 倍。
圖 8:谷歌張量處理單元(TPU v1)的功能性組織架構圖。
小結
我們考慮了兩種不同的透過提升硬體技術效率來提升程式設計效能的方法:首先,透過提升現代高階語言的效能;其次,透過構建領域特定的相比通用 CPU 能顯著提升效能和效率的架構。DSL 是另一個如何改進支援 DSA 等架構創新的硬體/軟體介面的例子。要透過這些方法獲得顯著收益將需要一個垂直整合的設計團隊,該團隊瞭解應用程式、領域特定的語言和相關的編譯器技術、計算機體系結構、組織以及底層實現技術。在行業橫向結構化之前,需要在跨抽象層次上垂直整合並做出設計決策,這是計算機技術研發早期的主要特徵。在這個新時代,垂直整合變得更加重要,能夠檢查和進行復雜權衡以及最佳化的團隊將會受益。
這個機會已經帶來了大量的架構創新,吸引了很多有競爭力的架構設計思想:
GPU:英偉達 GPU 使用了很多核心,每個核心都有大型暫存器檔案、很多硬體執行緒和快取;
TPU:谷歌 TPU 依賴於大型二維收縮乘法器和板載記憶體的硬體控制;
FPGA:微軟在其資料中心裡部署了現場可程式設計門陣列器件(FPGA),專用於神經網路應用;
CPU:英特爾提供透過大型高階快取和一維 SIMD 指令增強的帶有很多核心的 CPU,微軟使用的 FPGA,以及一種新型的神經網路處理器,這種處理器相比 CPU 更加接近 TPU。
除了這些大企業外,還有數十家創業公司正在推行自己的方案。為了滿足不斷增長的需求,架構工程師正在將數百到數千個此類晶片互連以形成神經網路超級計算機。
DNN 架構的雪崩式湧現使計算機架構領域進入了一個有趣的時代。在 2019 年很難預測這些方向中哪些(或者即使有)會贏,但市場肯定會像在解決過去的架構爭論一樣解決競爭問題。
開放式架構
受開源軟體成功的啟發,計算機架構的第二個機會是開放的 ISA。要建立處理器中的「Linux」,該領域需要行業標準的開放式 ISA,除了擁有專利技術的個別公司以外,社群可以建立開源核心。如果許多組織使用相同的 ISA 設計處理器,那麼更大的競爭可能會推動更快的創新。目標是為晶片提供處理器,成本從幾美分到 100 美元不等。
第一個例子是 RISC-V(稱為「RISC Five」),這是加州大學伯克利分校開發的第五個 RISC 架構。RISC-V 有一個社群,在 RISC-V 基金會的管理下維護架構。開放性允許 ISA 在公開環境中演變,硬體和軟體專家在決策最終確定之前進行協作。開放式基金的另一個好處是 ISA 不太可能主要出於營銷原因而擴充套件,這有時是專有指令集擴充套件的唯一原因。
RISC-V 是一個模組化指令集。一小部分指令執行完整的開源軟體堆疊,然後是可選的標準擴充套件,設計人員可以根據需要包含或省略。該基礎包括 32 位地址和 64 位地址版本。RISC-V 只能透過可選擴充套件來增長;即使架構師不接受新的擴充套件,軟體堆疊仍然執行良好。專有架構通常需要向上的二進位制相容性,這意味著當處理器公司新增新功能時,所有未來的處理器也必須包含它。對於 RISC-V,情況並非如此,所有增強功能都是可選的,如果應用程式不需要,可以刪除。以下是目前為止的標準擴充套件,使用代表其全名的縮寫:
M. 整型數乘法/除法;
A. 原子記憶體操作;
F/D. 單/雙精度浮點數;
C. 壓縮指令。
更少指令。RISC-V 的指令少得多。base 中有 50 個指令,與原始 RISC-I 相近。剩餘的標準擴充套件(M、A、F 和 D)增加了 53 條指令,再加上 C 又增加了 34 條,共計 137 條。ARMv8 有超過 500 條指令。
更少的指令格式。RISC-V 的指令格式非常少,只有六種,而 ARMv8 至少有 14 種。
簡單性減少了設計處理器和驗證硬體正確性的工作量。由於 RISC-V 的目標範圍覆蓋了資料中心晶片到物聯網裝置,因此設計驗證可能是開發成本的重要組成部分。
RISC-V 是一種簡潔的設計,誕生 25 年後,它的設計師從其前輩的錯誤中吸取了教訓。與第一代 RISC 架構不同,它避免了微架構或技術依賴的功能(例如延遲分支和延遲載入)或創新(例如暫存器視窗),這些功能被編譯器技術的進步所取代。
最後,RISC-V 透過為自定義加速器保留大量操作碼空間來支援 DSA。
安全專家不相信不可見的安全性,因此開放式實現很有吸引力,開放式實現需要開放式架構。
除 RISC-V 外,英偉達 2017 年還宣佈一個免費開放的架構,稱之為英偉達深度學習加速器(NVDLA),這是一種可擴充套件的可配置 DSA,用於機器學習推理。配置選項包括資料型別(int8、int16 或 fp16)和二維乘法矩陣的大小。模具尺寸從 0.5 mm^2 到 3 mm^2,功率從 20 毫瓦到 300 毫瓦。ISA、軟體堆疊和實現都是開放的。
開放的簡單架構與安全性具有協同作用。首先,安全專家不相信安全性,因此開放式實現很有吸引力,而開放式實現需要開放式架構。同樣重要的是增加可以圍繞安全架構進行創新的人員和組織的數量。專有架構限制了員工的參與,但開放式架構允許學術界和工業界的所有最佳人才幫助提高安全性。最後,RISC-V 的簡單性使其實現更容易檢查。此外,開放式架構、實現、軟體堆疊以及 FPGA 的可塑性意味著架構師可以線上部署和評估新穎的解決方案,並每週而不是每年迭代它們。雖然 FPGA 比定製晶片慢 10 倍,但這種效能仍然足以支援線上使用者,同時帶來安全創新,解決真正的攻擊。我們希望開放式架構成為架構師和安全專家進行硬體/軟體協同設計的典範。
敏捷硬體開發
Beck 等人 2001 年提出的《敏捷軟體開發宣言》(The Manifesto for Agile Software Development)徹底改變了軟體開發方式,克服了瀑布式開發中傳統精細規劃和文件的頻繁失敗。小型程式設計團隊很快開發了有用但不完整的原型,並在進行下一次迭代之前獲得了顧客的反饋。敏捷開發的 scrum 版本集合了 5 到 10 名程式設計師組成的團隊,每次迭代進行 2 到 4 周的衝刺。
再次受到軟體開發成功的啟發,第三次機會是敏捷硬體開發。對架構師來說的一個好訊息是,當代電子計算機輔助設計(ECAD)工具提高了抽象水平,使得敏捷開發成為可能,而且這種更高水平的抽象增加了設計的重用性。
考慮到從設計交付到返回晶片所需的幾個月時間,稱硬體只需四周的衝刺時間似乎有些不太可信。圖 9 概述了敏捷開發方法是如何透過在適當的層上改變原型起作用的。最內層是軟體模擬器,如果模擬器能夠滿足迭代需求,這是進行更改的最方便快捷的地方。第二層是 FPGA,其執行速度是具體軟體模擬器的數百倍。FPGA 可以執行作業系統和完整的基準測試(像那些來自標準效能評估公司的測試),允許對原型進行更精確的評估。亞馬遜在雲端提供了 FPGA,所以架構師們可以使用 FPGA,而無需購買硬體和建立實驗室。為了記錄晶片面積和功率的數字,第三層使用 ECAD 工具生成晶片佈局。即使在工具執行之後,在準備製造新的處理器之前,也需要進行一些手動步驟來完善結果。處理器設計者將第四層稱為「tape in」。前四個層都支援四周衝刺。
圖 9:敏捷硬體開發方法。
出於研究目的,我們可以在 tape in 上停下來,因為面積、能量和效能估計非常準確。但這就像是在長跑比賽中在離終點約 100 米的地方停下來一樣,因為跑步者可以準確預測最後時間。雖然在準備比賽方面下足了功夫,跑步者仍會錯過穿過終點線的興奮和滿足感。硬體工程師相較於軟體工程師的一個優勢是,他們搭建的是實物。測量晶片,執行真正的程式,然後向朋友家人展示,這是硬體設計的一大樂趣。
很多研究者覺得必須停下來,因為製造晶片的成本太過高昂。當設計作品很小時,它們出奇地便宜。架構師只要花 14,000 美元就可以訂購 100 個大小為 1 平方毫米的晶片。在 28 奈米制程上,1 平方毫米的晶片可以容納數百萬電晶體,這對 RISC-V 處理器和 NVLDA 處理器來說足夠大了。如果設計者的目標是設計一個較大的晶片,那最外層的成本將非常高,體系架構設計者可以用很多小晶片來闡述很多新想法。
總結
「最黑暗的時刻,是黎明來臨之前。」——Thomas Fuller, 1650
要從歷史教訓中獲益,架構設計者們必須意識到軟體創新也能激勵架構發展,而提高硬體/軟體介面的抽象水平會帶來創新的機會,市場最終會解決計算機架構的爭論。iAPX-432 和 Itanium 說明了架構投入如何超過回報,而 S/360、8086 和 ARM 則連續數十年帶來很高的回報,而且將繼續下去。
登納德縮放定律和摩爾定律的終結,以及標準微處理器效能提升的減速並非必須解決的問題,而是公認的事實。這一事實也提供了驚人的機會。高階、特定領域的語言和架構將架構師從專有指令集的鏈條中釋放出來,公眾也提高了對安全性的需求,所有這些將為計算機架構師帶來一個新的黃金時代。藉助開源生態系統,敏捷開發的晶片將展示其進步,從而加速商業應用。這些晶片中通用處理器的 ISA 理念很可能是 RISC,後者經受住了時間的考驗。我們期待著這次能與上一個黃金時代一樣快速改善,不過這次是在成本、能源、安全以及效能方面的改善。
未來十年,將會有一場新計算機架構的寒武紀爆炸,這對業界和學界的架構師們來說將是激動人心的時刻。
原文地址:https://cacm.acm.org/magazines/2019/2/234352-a-new-golden-age-for-computer-architecture/fulltext