每天資訊特斯拉自研晶片架構帶來的啟示

菜單

特斯拉自研晶片架構帶來的啟示

如果我們說特斯拉只對機器學習感興趣是輕描淡寫的。事實上這家電動汽車製造商建造了一臺名為 Dojo 的內部超級計算機,針對訓練其機器學習模型進行了最佳化。

與許多其他超級計算機不同,Dojo 沒有使用現成的 CPU 和 GPU,例如 AMD、Intel 或 Nvidia 的。特斯拉根據他們的需求設計了自己的微架構,讓他們做出更通用架構無法做出的權衡。

在本文中,我們將根據特斯拉在 Hot Chips 上的演示來了解該架構。該架構沒有單獨的名稱,因此為簡單起見,每當我們在後面提到 Dojo 時,我們都是在談論架構。

框圖

從高層次上看,Dojo 是一個 8 寬核心,具有四路 SMT,執行在保守的 2 GHz,具有 CPU 風格的pipeline,使其比 GPU 更能容忍不同的演算法和分支程式碼。Dojo 的指令集在標量方面類似於 RISC-V,但 Tesla 的工程師添加了一組自定義向量指令,專注於加速機器學習。

特斯拉自研晶片架構帶來的啟示

特斯拉 Dojo 核心的簡化框圖

Tesla 將 Dojo 描述為“高吞吐量、通用 CPU”。從效能的角度來看,這肯定有一些道理。但為了提高計算密度,特斯拉做出了犧牲,與我們在臺式機、膝上型電腦和智慧手機中熟悉的 CPU 相比,Dojo 核心非常難以使用。在某些方面,Dojo 核心的處理方式更像 IBM 的 Cell 中的 SPE,而不是傳統的通用 CPU 核心。

像Cell的 SPE?

在 2000 年代中期推出的IBM Cell 處理器具有八個“協同處理元件”(Synergistic Processing Elements)或 SPE,由一個功能齊全的 CPU 核心(“電源處理元件”或 PPE:Power Processing Elemen)控制。乍一看,Dojo 與 SPE 有很多相似之處。

Dojo 和 SPE 都針對向量處理進行了最佳化,並且依賴於單獨的主機處理器進行工作分配。在 Dojo 或 SPE 上執行的程式碼不能直接訪問系統記憶體。相反,應用程式預計主要在一小部分本地 SRAM 中工作。此本地 SRAM 由軟體管理,不能用作快取。如果需要來自主儲存器的資料,則必須使用 DMA 操作將其引入。

最後,Dojo 和 Cell 的 SPE 都缺乏對虛擬記憶體的支援。稍後我們將詳細介紹這意味著什麼,但簡而言之,它使多工處理變得非常困難。

特斯拉自研晶片架構帶來的啟示

Tesla Dojo 和 IBM Cell SPE 之間的非常簡化的比較

Dojo 在幾個重要方面有所不同。由於 Dojo 在設計時並未考慮小規模部署,因此主機處理器駐留在單獨的主機系統上。這些主機系統具有帶介面處理器的 PCIe 卡,然後透過高速網路鏈路連線到 Dojo 晶片。相比之下,Cell 的主處理器駐留在同一個晶片上。這使得單獨部署單個 Cell 晶片成為可能——這在 Dojo 中是不可能的。Dojo 的 1。25 MB 本地塊是 SRAM,它比只有 256 KB SRAM 的 Cell SPE 大得多,頻寬也更高。Cell 的 256 KB SRAM 只有一個埠,每個週期能夠提供 128B。Dojo 的 SRAM 有五個 64B 埠。當然,架構目標是非常不同的。Dojo 是寬時鐘和低時鐘,而 Cell SPE 具有專為高時鐘設計的窄而深的pipelines。

前端:CPU Comforts等

讓我們從前端開始簡要介紹一下 Dojo 的pipelines。有某種分支預測器,因為特斯拉的圖表顯示了 BTB(branch target buffer:分支目標緩衝區)。它的預測能力可能無法達到我們在 AMD、ARM 和 Intel 的高效能核心上看到的水平,因為 Dojo 需要優先考慮在向量執行上花費裸片區域。但即使是一個基本的分支預測器也比沒有預測器有了很大的進步,Dojo 的分支預測能力在處理分支程式碼或更大的指令佔用空間時應該比 GPU 提供更好的效能。

一旦分支預測器生成了下一條指令提取指標,Dojo 可以每個週期從“小”指令快取中提取 32 個位元組到每個執行緒的提取緩衝區中(per-thread fetch buffers)。該指令快取可能有助於降低本地 SRAM 的指令頻寬壓力,確保資料端可以訪問 SRAM 時儘可能少地爭用。此外,指令快取記憶體不連貫。如果將新程式碼載入到本地 SRAM 中,則必須在分支到該新程式碼之前重新整理指令快取。

特斯拉自研晶片架構帶來的啟示

來自特斯拉的 Hot Chips 簡報

從提取緩衝區中,Dojo 的解碼器每個週期可以處理來自兩個執行緒的八條指令。我對“每個週期兩個執行緒”的含義有點困惑,因為具有 SMT 的 CPU 通常每個週期處理一個執行緒並在週期邊界上切換執行緒。也許 Dojo 將解碼器分成兩個叢集,並選擇兩個執行緒在每個迴圈中為它們提供資料。這可能會減少所採用分支的解碼吞吐量損失。

在解碼時,某些指令(如branches, predicated operations和immediate loads (“list parsing”) )可以在前端執行並從pipeline中刪除。這有點像更新的 x86 CPU 在重新命名器(renamer)中消除了暫存器到暫存器的副本。但是您沒聽錯——Dojo 不會透過pipeline跟蹤“已消除”的指令以維持in-order retirement。其他處理器跟蹤所有內容以退出,以便它們可以在任何指令邊界處停止,並保持恢復執行所需的所有狀態。這種能力被稱為“precise exceptions”,現代作業系統使用它來提供各種好東西,比如paging to disk,或者告訴你你的程式碼到底在哪裡搞砸了。

特斯拉並不關心precise exceptions。Dojo 確實具有除錯模式,其中更多指令透過pipeline以提供“更精確”的exceptions,但沒有像正常無序 CPU 那樣的有序退出邏輯。

Dojo 的執行引擎

在看到一個寬前端之後,看到一個只有兩個 ALU 和兩個 AGU 的 4 寬整數執行引擎可能會有點奇怪。但是這個漏斗形的流水線是有意義的,因為一些指令是在前端執行和丟棄的。

Dojo 也不會進入客戶端系統,其中標量整數效能很重要。因此,整數端提供了足夠的吞吐量來處理控制流和地址生成,以保持向量和矩陣單元的饋送。

Dojo 的向量和矩陣執行端放置在核心pipeline中的標量執行引擎之後,並且有兩個執行pipeline。兩個pipeline可能聽起來不多,但 Dojo 在這些pipeline後面有非常寬的執行單元。一個pipeline可以執行 512 位向量執行,而另一個pipeline執行 8x8x4 矩陣乘法。因此,只要指令公開足夠的顯式並行性,Dojo 就能夠實現非常高的吞吐量——尤其是在使用矩陣單元的情況下。Tesla 聲稱具有 354 個 Dojo 核心的晶片在 2 GHz 時可以達到 362 BF16 TFLOPS,這表明每個核心每個週期可以執行 512 BF16 FLOPS。

我們不確定 Dojo 是否可以完全亂序執行。但特斯拉確實表示,整數端可以在向量端之前執行很遠,這表明它可以執行過去停滯的指令,直到其中一個排程程式被填滿。缺乏按序引退也指向無序執行能力。

通常,實現無序執行會帶來很多複雜性。這是因為 CPU 必須按順序執行指令。AMD、ARM 和 Intel 的高效能 CPU 使用大型重新排序緩衝區(和其他結構)跟蹤指令,以便它們的結果可以按程式順序提交。這意味著如果一個程式做了一些愚蠢的事情,比如除以零,這些核心可以準確地顯示出哪條指令出錯了。而且,它們可以顯示 CPU 狀態,該狀態反映了故障之前所有指令的動作,但之後沒有。這意味著您可以修復導致指令錯誤的任何原因,並恢復執行。Dojo 放棄了這種能力。作為交換,Dojo 可以避免與透過其pipeline跟蹤每條指令相關的功率和麵積開銷,以確保按程式順序提交結果。

SRAM 訪問

通常,我們會在這裡討論快取。但是 Dojo 不能直接訪問系統記憶體,所以我們將討論 1。25 MB 的 SRAM 塊。它每個週期可以處理兩個 512 位負載,使其每個週期的頻寬與支援 AVX-512 的英特爾 CPU 相匹配。Tesla 表示 SRAM 有五個 512 位埠(2 個載入埠、1 個儲存埠和兩個到網格停止埠)。但是標量端只有兩個 AGU,這可能意味著核心無法在每個週期內承受兩個 512 位負載和一個 512 位儲存。

因為 Dojo 的本地 SRAM 塊不是快取,所以它不需要與資料一起儲存的標記和狀態位。SRAM 前面也沒有 L1D 快取,因此它必須足夠快以處理所有載入和儲存指令而不會造成瓶頸,即使它的大小更接近 L2 快取。不將 SRAM 實現為快取可能是特斯拉保持低延遲的方式。如果我們回顧很久以前的 AMD 的 Hammer 架構,我們可以看到在檢測到 L1D 未命中後訪問 1 MB L2 需要 8 個週期(總延遲為 12 個週期)。如果直接定址 1 MB 的 SRAM 而不是用作快取,則可能會刪除三個階段,從而將延遲降低到 5 個週期:

來自較早的 Hot Chips 簡報的幻燈片,顯示了 L2 快取訪問所涉及的pipeline階段。如果 L2 不是快取,則可以跳過的階段標記為紅色。

考慮到幾十年的工藝節點改進,甚至比 Athlon 更低的時鐘速度目標,很容易看出特斯拉如何以類似 L1 的延遲訪問 L2 大小的 SRAM 塊。跳過一級快取當然可以節省面積和功耗。

為了進一步減少延遲、面積和核心複雜性,Dojo 沒有虛擬記憶體支援。因此,它沒有 TLB 或頁面遍歷機制(page walk mechanisms)。現代作業系統利用虛擬記憶體為每個程序提供自己的記憶體檢視。程式使用的記憶體地址不是直接訪問物理記憶體地址,而是由 CPU 使用作業系統設定的分頁結構轉換為物理地址。這就是現代作業系統如何使程式相互隔離,並防止一個行為不端的應用程式導致整個系統癱瘓。

虛擬記憶體也是您可以執行比物理記憶體更多的程式的方式。當您用完實際記憶體時,作業系統會取消對映頁面,將其寫入磁碟,併為您的程式提供所需的記憶體。當其他糟糕的程式嘗試訪問該記憶體時,CPU 會嘗試將虛擬地址轉換為物理地址,但發現轉換不存在。CPU 丟擲一個頁面錯誤異常,作業系統透過將被驅逐的頁面讀回物理記憶體並填寫頁表條目來處理該異常。

在 Dojo 上這些都不可行。核心的 4 路 SMT 功能更多的是讓單個應用程式公開顯式並行性,而不是提高多工處理效能。例如,一個執行緒可以執行向量計算,而另一個執行緒將資料從系統記憶體非同步載入到 SRAM(透過 DMA)。

為了進一步簡化設計,Dojo 可以只用 21 個地址位定址 SRAM,這可以簡化 Dojo 的 AGU 和定址匯流排。這些權衡可能讓特斯拉以足夠低的延遲訪問該 SRAM,以避免在其前面實現單獨的 L1 資料快取。

記憶體存取

說到系統記憶體,Dojo 晶片並不直接連線到記憶體。相反,它們連線到配備 HBM 的介面處理器。這些介面處理器還負責與主機系統通訊。

特斯拉自研晶片架構帶來的啟示

具有 25 個獨立晶片的 Dojo tile 可以訪問 160 GB 的 HBM 記憶體。

Tesla 表示,他們可以跨 tile 邊界從每個晶片邊緣傳輸 900 GB/s,這意味著可以以 4。5 TB/s 的鏈路頻寬訪問介面處理器及其 HBM。因為訪問 HBM 需要透過單獨的晶片,所以訪問延遲可能非常高。

是小,如何做到的?

Dojo 是一個 8 寬的核心,具有至少一些 OoO 執行能力、不錯的向量吞吐量和一個矩陣乘法單元。但即使有 1。25 MB 的本地 SRAM,它最終還是一個非常小的核心。相比之下,富士通的A64FX在同一工藝節點上佔據的面積是其兩倍以上。

處理器設計就是要做出正確的權衡。特斯拉希望透過將大量核心封裝到晶片上來最大限度地提高機器學習的吞吐量,因此單個核心必須很小。為了實現其區域效率,Dojo 使用了一些熟悉的技術。它以保守的 2 GHz 執行。較低的時鐘電路往往佔用較少的面積。它可能有一個基本的分支預測器和一個小的指令快取。如果程式的程式碼佔用量很大或有很多分支,這會犧牲一些效能。

但特斯拉還透過削減執行內部工作負載所不需要的功能來進一步減少功耗和麵積使用。它們不進行資料端快取,不支援虛擬記憶體,也不支援precise exceptions。

特斯拉自研晶片架構帶來的啟示

結果是一個處理器核心提供了現代 CPU 核心的效能靈活性,同時在許多方面不如 Intel 8086 對使用者和程式設計師友好。除了核心之外,Tesla 還透過設計專門用於部署的 Dojo 晶片來節省芯片面積大規模。

物理實現

縮小,Dojo 核心是在一個非常大的 645 平方毫米的裸片上實現的,稱為 D1。與我們熟悉的其他晶片不同,單個 Dojo 晶片不能自給自足。它沒有 DDR 或 PCIe 控制器。die 邊緣周圍有 IO 介面,可以讓 die 與相鄰的 die 進行通訊,延遲約為 100 ns。

特斯拉自研晶片架構帶來的啟示

要訪問系統記憶體,Dojo D1 晶片必須與具有板載 HBM 的介面處理器通訊。該介面處理器又透過 PCIe 連線到主機系統(介面處理器安裝在 PCIe 卡上)。理論上,最小的功能性 Dojo 部署將涉及一個 Dojo 晶片、一個介面處理器卡和一個主機系統。但特斯拉將 Dojo die部署在每個包含 25 個die的模組中,以提供規模感。Dojo D1 die專門設計用於超級計算機的構建塊,僅此而已。

特斯拉自研晶片架構帶來的啟示

這種專業化可以節省更多的裸片面積。Dojo D1 不會在 DDR 和 PCIe 控制器上花費空間。大部分裸片都被大量 Dojo 核心佔據,除了外部設計用於與相鄰裸片介面的定製 IO 聯結器。

特斯拉自研晶片架構帶來的啟示

相比之下,設計時考慮到更多部署靈活性的晶片在 IO 上花費了大量空間。AMD 的 Zen 1 “Zeppelin” 晶片很好地展示了這一點。Zeppelin 可以直接連線到 DDR4 記憶體、PCIe 裝置、SATA 驅動器和 USB 裝置——非常適合滿足客戶要求。在伺服器中,IFOP 介面讓它與相鄰的晶片進行通訊。位於 IFOP 附近的大塊 SRAM 可能是窺探過濾器(snoop filters),有助於在高核心數設定中有效地保持快取一致性。Dojo 不會嘗試跨核心保持快取一致性,並且不會將任何 SRAM 用於窺探過濾。

特斯拉自研晶片架構帶來的啟示

來自 AMD 在 ISSCC 2021 上的小晶片演示

AMD 透過將大約 44% 的“Zeppelin”裸片區域用於除核心和快取之外的邏輯來為這種靈活性付出代價。Dojo 僅將 28。9% 的裸片面積用於 SRAM 和核心以外的東西。

最後的話

特斯拉 Dojo 超級計算機背後的微架構展示瞭如何實現非常高的計算密度,同時仍保持 CPU 處理分支程式碼的能力。要到達那裡,您需要放棄定義我們現代計算體驗的大部分舒適設施。如果您可以假設圍繞 Dojo 核心構建您的桌面,那麼任何使用過 MS-DOS 的人都可能會覺得這種體驗很熟悉。您不能同時執行多個應用程式。單個行為不端的應用程式可能會迫使您重新啟動系統。如果您沒有足夠的 RAM 來執行某個程式,您可以完全忘記執行它(無需分頁到磁碟)。

但這些權衡在特斯拉的超級計算機中非常有意義。Tesla 不需要 Dojo 核心來同時處理多個正在執行的應用程式,Dojo 只需執行內部的可信程式碼。所以,特斯拉並不關心虛擬記憶體支援。同樣,在 Dojo 上執行的機器學習程式將在編寫時考慮到該特定系統。您不會有一批任意程式可能要求比可用記憶體更多的記憶體。這意味著您不需要precise exceptions(和虛擬記憶體)來允許諸如過度使用記憶體、記憶體壓縮或在磁碟之間交換記憶體頁面等技術。precise exceptions對於除錯也很有用,但 Tesla 透過單獨的除錯模式以更便宜的方式進行除錯。

特斯拉自研晶片架構帶來的啟示

可以肯定的是,特斯拉為獲得高計算密度而採用的權衡取捨在消費者或伺服器 CPU 中是不可能的。但他們在行動中非常有趣,我們必須感謝特斯拉花時間在 Hot Chips 上展示。

在過去的二十年裡,程序節點的改進一直在放緩,導致單執行緒效能的進步更慢。在過去的五年中,電源和冷卻限制一直在降低多執行緒效能。但對更多計算能力的需求並沒有放緩,因此公司正在轉向更專業的硬體以跟上步伐。

Tesla 的 Dojo 超級計算機中的架構是一個很好的例子,說明了如何進行權衡以提高計算密度,以及當前趨勢如何有利於為吞吐量受限的應用程式引入專用硬體。