從零開始手搓GPU,照著英偉達CUDA來,只用兩個星期

机器之心發表於2024-05-13
從學習晶片的基礎知識開始。

「我花兩週時間零經驗從頭開始構建 GPU,這可比想象的要難多了。」

圖片

總有人說老黃的晶片供不應求,大家恨不得去手搓 GPU,現在真的有人試了。

近日,美國一家 web3 開發公司的創始工程師之一 Adam Majmudar 分享了他「手搓 GPU」成功的經歷,引發了網友們的一大片點贊。令人驚訝的是,他僅用兩週時間就完成了這一腦力壯舉。在 Twitter/X 的主題帖子中,Majmudar 進行了直播,一步步帶我們回顧了整個過程。

圖片

自造 GPU 的實踐當然也被公開在 GitHub 上,現在這個專案已有 5300 的 Star 量了。

圖片

專案連結:https://github.com/adam-maj/tiny-gpu

需要明確的是,該專案目前的節點是在 Verilog 中的晶片佈局,最終透過 OpenLane EDA 軟體進行了驗證。在這之後,GPU 還將透過 Tiny Tapeout 7 提交流片,因此註定會在未來幾個月內成為物理形態的晶片。

圖片

Majmudar 詳細列出了設計 GPU 所完成的任務流程。顯然,作為一個「從頭開始」的專案,在試探性邁出第一步之前就需要進行大量的研究和思考。由於專有技術的主導地位,GPU 是一個相對複雜的研究領域,想想就難,實踐起來更難。

手搓 GPU 要分幾步?

實際上對於 Majmudar 來說,操作比這個步驟還要多,因為他真的沒啥技術基礎,是從學習 GPU 架構的基礎知識開始的。

他首先開始嘗試透過學習英偉達的 CUDA 框架來理解 GPU 軟體模式,進而理解了用於編寫 GPU 程式(稱為核心)的相同指令多資料 (SIMD) 程式設計模式。

有了這些背景,Majmudar 開始深入學習 GPU 的核心元素:從全域性記憶體、計算核心、分層快取、記憶體控制器到程式排程

然後在每個計算核心中,我們還要了解其中的主要單元:包括暫存器、本地 / 共享記憶體、載入儲存單元 (LSU) 、計算單元 、排程程式、獲取器和解碼器。

圖片

好了,你已經是一個瞭解了現代 GPU 架構的人了,下面讓我們來手搓一塊 GPU 吧。

此處 Majmudar 表示,由於複雜性如此之高,我們必須將 GPU 簡化到新手能夠設計的水平,否則專案就工期爆炸了。

接下來就是建立一個自己的 GPU 架構。我們的目標是創造一個最小的 GPU 來突出 GPU 的核心概念,並消除不必要的複雜性,以便其他人可以更輕鬆地瞭解 GPU。

Majmudar 表示,設計自己的 GPU 架構是一項令人難以置信的實踐。

他一邊學習一邊操作,隨後決定在設計中強調以下幾點:

  • 並行化 - 在硬體中實現 SIMD 模式;
  • 記憶體訪問 - 觀察 GPU 如何應對從緩慢且頻寬有限的記憶體訪問大量資料的挑戰;
  • 資源管理 - 最大限度提高資源利用率和效率。

透過對上述架構的多次迭代,Majmudar 決定專注於通用平行計算 (GPGPU) 功能,面向機器學習(machine learning)的更廣泛用例。

設計稱得上緊跟時代。

圖片 這裡的一切都是最簡單的形式。

第三步是為這塊 GPU 編寫自定義的組合語言。

Majmudar 表示,其中一個最關鍵的因素是他 GPU 實際上可以執行用 SIMD 程式設計模式編寫的核心。為了實現這一點,就必須為 GPU 設計自己的指令集架構(ISA),以便用來編寫核心。他製作了自己的 11 條小型指令 ISA,該 ISA 受到 LC4 ISA 的啟發。在這之後,他又編寫一些簡單的矩陣數學核心作為概念證明。

圖片 這是 Adam Majmudar 提出的 ISA 的完整表格,其中包括每條指令的確切結構。

接下來,Majmudar 編寫了兩個在其 GPU 上執行的矩陣數學核心。這些矩陣加法和乘法核心將演示 GPU 的關鍵功能,並提供其在圖形和機器學習任務中應用有效的證據。

圖片 為矩陣加法和乘法編寫的核心。

Majmudar 用 Verilog 構建 GPU 帶來了許多問題。這是最困難的部分,學會了很多知識,但也多次重寫了程式碼。值得一提的是,Majmudar 得到了美國知名駭客 George Hotz 的建議與幫助。

最初,他將全域性記憶體實現為 SRAM,大佬給出的反饋說這違背了構建 GPU 的整個目的 ——GPU 的最大設計挑戰是管理訪問有限頻寬的非同步記憶體(DRAM)延遲。

因此,Majmudar 最終使用外部非同步記憶體重建了設計,並最終意識到還需要新增記憶體控制器。

其次,Majmudar 一開始是用 warp-scheduler 來實現 GPU 的,這是一個很大的錯誤,對於該專案來說太複雜且沒有必要。還好 George Hotz 及時提出了反饋。當一開始收到反饋時,Majmudar 甚至沒有足夠的背景知識來完全理解它,所以花了很多時間嘗試構建一個 Warp 排程程式,這才醒悟過來。

這還沒有完,一開始的設計中,Majmudar 沒有在每個計算核心內正確實現排程,因此不得不回過頭,分階段設計計算核心執行以獲得正確的控制流。

最終,Majmudar 對程式碼的第三次重寫實現了目標,修復了計算核心的執行排程

圖片 這是用 Verilog 構建的 GPU 中單個執行緒的執行流程,它的執行方式與 CPU 非常相似。

經過大量重新設計後,我們終於可以看到 GPU 執行矩陣加法和乘法時核心的景象了。看到一切正常工作,GPU 輸出了正確的結果,這是一種不可思議的感覺。

圖片

然後,我們還需要將設計透過 EDA 流程,轉換為完整的晶片佈局。

圖片

完整的 Verilog 設計是透過 OpenLane EDA 實現的,採用 Skywater 130nm 工藝節點(用於 Tiny Tapeout)。Majmudar 特別解釋說,一些設計規則檢查 (DRC) 失敗,需要返工。

經過兩週的努力,Majmudar 的 GPU 設計的 3D 視覺化如下圖所示:

圖片

CPU、GPU 都做了出來

Adam Majmudar 表示自己在很短的時間內,瞭解了晶片架構的基礎知識,掌握了晶片製造的細節,並使用 EDA 工具完成了他的第一個完整晶片佈局,即手搓 CPU。

談到如何能做到「手搓晶片」,Majmudar 總結主要分 6 步:

  • 學習晶片架構的基礎知識;
  • 學習晶片製造的基礎知識,包括材料、晶圓製備、圖案化和封裝等;
  • 透過逐層製作 CMOS 電晶體開始電子設計自動化;
  • 用 Verilog 建立第一個完整電路;
  • 為電路實施模擬和形式驗證;

設計完整晶片佈局,使用 OpenLane(一種開源 EDA 工具)進行設計和最佳化。

在工程師圈子裡,時不時會有人去嘗試「手搓晶片」,用最硬核的方式去了解晶片架構的基礎知識。不過在以前,大多數人因為難度,嘗試的是 CPU。

2020 年,中國科學院大學公佈了首期「一生一芯」計劃的結果,曾經引發了人們的熱議。該計劃是在國內首次以流片為目標,由 5 位 2016 級本科生主導完成一款 64 位 RISC-V 處理器 SoC 晶片設計並實現流片。

此專案還得到了 RISC 體系奠基人、圖靈獎得主 David Patterson 教授的關注。

圖片 圖片來自 @包雲崗 https://www.zhihu.com/question/409298856

得益於開源晶片、敏捷設計等行業新趨勢的發展,晶片的設計門檻正在越來越低。

或許手搓 GPU 的先例出現後,我們會看到更多、效能更加強大的自造晶片實踐。

參考內容:
https://www.tomshardware.com/pc-components/gpus/engineer-builds-a-gpu-from-scratch-in-two-weeks-process-much-harder-than-he-expected
https://twitter.com/MajmudarAdam/status/1783304235909877846

相關文章