无主之地2配置高吗|看真人裸体BBBBB|秋草莓丝瓜黄瓜榴莲色多多|真人強奷112分钟|精品一卡2卡3卡四卡新区|日本成人深夜苍井空|八十年代动画片

網易首頁 > 網易號 > 正文 申請入駐

為什么算力追趕這么難?前谷歌架構師現場黑板推演底層架構,看懂芯片底層邏輯里被忽視的“空間博弈”

0
分享至


“芯片絕大部分成本,都花在毫無技術含量的搬運數據上。”

整理 | 王啟隆

出品丨AI 科技大本營(ID:rgznai100)

今天,整個科技圈和數碼圈大概都被華為的一個新名詞刷屏了——“韜(τ)定律”和“邏輯折疊”

各種群里都在轉:不用死磕 EUV 光刻機了,要把芯片里的 2D 平房改造成 3D 立體樓房。只要把關鍵信號跑腿的距離通過物理上的“折疊”縮短,哪怕是用成熟工藝,也能跑出先進工藝的速度

這聽起來很提氣,甚至帶點科幻色彩。但作為非芯片相關從業者,我其實很難在腦海中建立起物理直覺:“信號傳輸路徑縮短”到底為什么能省下那么大的面積和功耗?芯片內部到底長什么樣?為什么半導體行業不拼“原子大小”,改拼“建筑結構”了?

想要真正弄懂這件事,看再多概念稿都沒用,得回到黑板前,看看造芯片的人在顯微鏡下到底面對著什么樣的物理現實


硅谷當紅科技播客 Dwarkesh Patel 的最新一期訪談,正好聊了這件事。這次的嘉賓是新銳 AI 芯片公司 MatX 的 CEOReiner Pope。在創辦這家炙手可熱的初創公司前,Reiner 曾是谷歌 TPU 架構和編譯器團隊的核心人物。

在這場堪稱“硬核黑板推演”的對話中,Reiner Pope 沒有跟你大談宏大的產業博弈,而是從最基礎的“與門”、“或門”講起,帶著你手寫全加器,一路推導出 TPU、GPU 乃至 FPGA 為什么會長成今天這個樣子。

所以底下有個老哥評論:我的碩士課程,居然被做成了 1 小時的油管視頻!


當你跟著他一步步算下一筆筆“門電路賬”時,你會驚駭地發現一個長期被普通人忽略的反直覺真相:在現代芯片里,真正干活的“計算單元”只占極小的面積;芯片里絕大部分的成本、空間和能耗,都花在了毫無技術含量的“搬運數據”上。

搞懂了這個底層邏輯,你再去回看今天刷屏的“邏輯折疊”,瞬間就會豁然開朗——不管是中國巨頭在三維空間里的絕地求生,還是硅谷新銳在脈動陣列上的瘋狂內卷,大家其實都在死磕同一個極其殘酷的物理天花板:在這個后摩爾時代,誰能馴服數據在硅片上奔跑的“距離”,誰就能拿到下一代算力霸權的鑰匙。

核心要點速覽

  • “僅僅是將數據從寄存器移動到邏輯單元的代價,就比計算單元本身昂貴了許多許多倍。這是芯片內部所有隱藏成本浮現的第一步。”

  • “精度位寬與裸片面積之間,存在著平方級的縮放關系。這就是為什么低精度(如 FP4)比你想象的還要暴利,也是低精度算術在 AI 中如此奏效的唯一原因。”

  • “如果你一味把芯片的時鐘速度飆得極快,代價就是要把幾乎所有的面積都花在‘同步數據’的寄存器上,這反而會扼殺你真正的算力吞吐量。”

  • “從一個極高的宏觀視角來看,一塊 GPU,本質上就是把許多‘微型的 TPU’鋪滿了整個芯片。”

  • “大腦運行的批處理大小(Batch size)不是 1000,世界上只有一個我。如果你把一塊 GPU 的頻率從 1GHz 降到 1MHz,它在某種意義上就會開始有點像大腦了。”

以下是這場精彩對話的精編翻譯。

「CSDN 讀者專屬福利」

免費領100小時云算力券·支持主流 AI 框架與模型部署

咖啡領取地址: https://s.csdn.cn/4nPsOp


用邏輯門構建乘加運算

主持人:今天我將和 MatX 這家新銳 AI 芯片公司的 CEO Reiner Pope 對話,探究一下 AI 芯片內部的世界,以及芯片到底是如何運轉的。

順便做個利益披露:我是 MatX 的天使投資人。所以,希望你們確實造出了一款好芯片。

Reiner Pope:希望如此。我會從芯片設計中最微小的基本單元講起,一步步向上構建,直到向你展現一顆真正量產的芯片是什么樣,以及它包含哪些組件。

在芯片的最底層,我們操作的基本單元是邏輯門,也就是“與”、“或”、“非”這樣極其簡單的東西。它們通過導線相連,在芯片上化作實體的金屬線路。AI 芯片最核心的計算任務就是矩陣乘法。而在這之中,最基礎的運算單元就是一對數字的“乘加”(multiply-accumulate)。我們將通過手工推演來演示這種計算的過程,借此推導出對應的電路會是什么樣子。

最直觀的例子是做一個 4 位數與另一個 4 位數的乘加運算。最清晰的基元就是乘加本身。首先是這兩個項的乘法,接著我們還要再加上一個 8 位數。

主持人:我能問個澄清性的問題嗎?為什么對于計算機內部的運算來說,乘加操作會是一種最自然的基礎單元?

Reiner Pope:有幾個原因。它的效率確實稍微高一點,但它之所以成為 AI 芯片的自然選擇,是因為你可以看看矩陣乘法進行時到底發生了什么……簡而言之,矩陣乘法是什么?它就是一個關于 i、j、k 的多重循環:output[i, k] += input[i, j] x other_input[j, k]。在矩陣乘法的每一步中,都在發生乘加運算。

另一個觀察是,累加步驟所需的精度幾乎總是高于乘法步驟。這是 AI 芯片的獨有特征。你把低精度的數字相乘,但在累加時,誤差會迅速成倍放大,所以你需要更高的精度。這就是為什么我們選擇做 4 位乘法和 8 位加法。

主持人:讓我確認一下我是否理解對了。可以從兩個角度來看。一是結果的值會比輸入的值大。二是如果它是浮點數,那可能……這部分對我來說不太直觀。但或許原理是一樣的?

Reiner Pope:原理確實是一樣的。另一個關鍵點是,當你累加這些數字時,你是在把一大堆數字加起來,所以會積攢大量的舍入誤差。而在這個例子中,計算鏈條里只有一次乘法,所以乘法本身并不會累積太多舍入誤差。

主持人:為什么你要把一大堆數字加起來?這里明明只有兩個數字啊。

Reiner Pope:因為這個求和過程重復了 j 次。任何誤差都會累積。

主持人:我明白了。那我們如果手工計算,該怎么做呢?

Reiner Pope:作為人類,我們可能會把它分成兩步來算,但用長乘法我們可以一步到位。首先看乘法部分,我們要把這個 4 位數與另一個 4 位數的每一個位進行相乘。我們把它寫下來。首先,1001 乘以這個位,得到的是數字本身。向左移一位,乘以 0,這給了我們一個全 0 的數字。再向左移一位乘以這個 1,我們得到 1001。最后,對于最后一個位,我們再次得到一個全 0 的數字。


這給了我們一堆為了完成乘法必須相加的項。既然我們都在做求和了,不如順便把那個累加項也加進去。所以我們直接把它抄過來。這就是我們要求的和。這是一個我們需要計算的五路求和。

我們用了哪些邏輯門才走到這個中間步驟?我們需要產生這 16 個部分積。我們如何產生其中一個部分積呢?以這里的數字 1 為例。我們通過把這個數字和那邊的數字相乘來得到它。這可以用一個“與門”(AND gate)來實現。只有當這個位是 1 且那個位也是 1 時,這個數字才是 1。如果其中任何一個是 0,任何數乘 0 都是 0。為了算出這一切,我們總共消耗了 16 個與門。一般而言,如果我做一個 p 位乘 q 位的乘法,就需要 p 乘以 q 個與門。

最后,我把它們加起來。大部分的工作將發生在求和階段。讓我描述一下我們在這里使用的另一種邏輯門。與門幾乎是芯片上存在的最簡單的邏輯門,也幾乎是最小的。在另一個極端,你通常會用到的最大邏輯門叫做“全加器”(full adder)。

做軟件的人可能會以為全加器是把 32 位數字加在一起。但在這種情況下,它只是把三個單比特數字加在一起,比如把 0、1 和 1 加起來。加出來的結果可能是 0、1、2 或 3,所以我們只需要兩位二進制數就能表達它。它的輸入是三個比特,輸出是兩個比特。二進制里的 2 就是 10。這也叫作“3-to-2 壓縮器”,因為它接收三位輸入,產出兩位輸出。

主持人:確認一下我的理解:這兩個輸入是一個 X 值和一個 Y 值,加上某個傳進來的進位……

Reiner Pope:這三個輸入都是在同一個位上的比特,就像這一列里的三個比特。至于兩個輸出,我把它們畫成一豎一橫,以對應這種垂直和水平的布局。這表示在同一列的東西處于同一個位,而在相鄰列的東西則不同。一個是進位輸出,另一個是求和結果。

主持人:所以如果全加器的輸入是,比如 101,那么輸出就是 10。如果是 111,輸出就是 11。如果是 000,輸出就是 00。如果是 010,輸出依然是 01。

Reiner Pope:沒錯。它本質上只是在數有幾個 1,用二進制表達出來。這個電路捕捉了我們人類在按列求和時自然會做的事情。我來展示一下使用全加器求和的一次迭代。

我在這里求和的方式對人類來說會有點不自然。我們會按列求和并記住進位,但在這里我們不記進位,而是明確地把它寫出來。我們從最右邊的列向左推進。在最右邊的列,我們把 1 和 1 加起來,產生了一個 0,并進位了 1。我們在這對比特上使用了這個全加器電路,產生了一對比特作為輸出。

現在我們可以對這一列做同樣的事情。我們有一列四個數字,所以我們取前三個,對它們運行全加器,這給了我們一個 0 和一個 0 作為輸出。它們的和是 00。這就是應用于所有這些比特的全加器。當我用完這些比特時,我會把它們劃掉,表示我已經處理過了。

我們再往下走一點。我取這三個數字,把它們加起來,這給了我一個 1 和一個 0。我已經處理了這三個數字。現在我取這三個數字并把它們加起來,這給了我一個 1 和一個 0,我也處理了這些數字。

你可以這樣看:我有一整網格的數字需要相加。我將不斷地把全加器應用到這里所有的比特上,不斷地從一列中拿走三個數字,寫出兩個數字作為結果。一遍又一遍地繼續,直到最后我只得到一個單一的數字輸出。這種方法被稱為 Dadda 乘法器。這是使用全加器構建高面積效率乘法器的行業標準。

讓我們試著量化一下這個電路的規模,這樣我們對事物的大小就有個概念,以后也能做個比較。我用了多少個全加器?我一開始有多少個數字?我有 16 個部分積,也就是所有這些項與所有那些項的乘積,加上我在這里要加的 8 個項。我一開始有 24 個比特。最終,我在輸出端產生了 8 個比特。在每一步中,我都是劃掉三個數字并寫出兩個數字作為結果。每次使用全加器都會消除這里的一個比特。那么有多少個全加器呢?肯定是 24 減去 8,所以這個電路里有 16 個全加器。在一般情況下這也是成立的。這個電路里會有 p 乘以 q 個全加器。

主持人:讓我梳理一下這里的邏輯。輸入比特數 24,是 p 乘 q,加上 p + q。輸出比特數只是 p + q。所以 p 乘 q 加上 p + q,再減去 p + q,等于 p 乘 q。


Reiner Pope:沒錯。我認為這解釋了,或者至少暗示了我們選擇做乘加運算的第二個原因。第一個原因是它在矩陣乘法中頻繁出現。第二個原因是它給了我們這個非常漂亮、簡單的 p 乘 q 的精簡代數關系。

我們已經描述了整個過程。我在這里采取的每一個原子步驟,都變成了一個邏輯門,導線將它們連接在一起。當我有這三個輸入用來產生這兩個輸出時,如果我想象把這映射到一個物理設備上,會有一根導線將這三個東西連接到一個產生這個輸出的邏輯門上。這是在不同位寬下,AI 芯片內部的主要基本單元。我們將從這里向上構建,看看你將如何使用它來運行你可能想要的所有其他操作。

主持人:現在問這個可能不是時候,但每當 Nvidia 宣傳這款芯片能做 X 次 FP4 運算,或是其一半的 FP8 運算時,似乎在暗示這些電路是可以相互替代的(fungible),并沒有專用的 FP4 或 FP8 電路。但按照你這里的畫法,如果它必須映射到具體的邏輯門上,你需要一個專用的 FP4 乘加器和一個專用的 FP8 累加器。它們能互相替代嗎?

Reiner Pope:就目前所畫的來看,它們并不具備太強的互換性。這實際上是你設計芯片時必須做出的主要抉擇之一:我到底要放多少 FP4,多少 FP8?有時我會從客戶需求的角度來考慮。另一個角度則是為了平衡 FP4 和 FP8 之間的功耗預算。

主持人:當他們報告這些數字,并且碰巧它做 FP4 的數量正好是 FP8 的兩倍時,他們只是選擇給所有的浮點運算分配相等的裸片(die)面積,結果就變成了這樣?為什么比例偏偏是兩倍?部分原因在于,這肯定不會與裸片面積完全等同。

Reiner Pope:這里有一個數據移動層面的原因。等我們看到數據是如何進出內存時,也許會再回到這個問題。從軟件層面來看,有一點非常美妙:我可以把兩個 4 位數字打包進同一個 8 位數字的存儲空間里。當我把它存入內存時,我在芯片內部布線的總線尺寸讓這一切配合得天衣無縫。

主持人:仔細想想,它不僅僅是兩倍的關系。它占用的面積聽起來似乎與位長的平方成正比。這就是為什么更小的精度比你想象的還要有利可圖。

Reiner Pope:這是一個非常重要的原因。事實上,Nvidia 已經做出了改變。從歷史上看,直到 B100 或 B200 之前,每次你將位精度減半,你都會將浮點運算(FLOP)數量翻倍。正如你所說,由于這種平方級的縮放關系,那個比例實際上有點不對。你應該獲得比你原本想象的還要大的速度提升。Nvidia 的產品規格已經開始在 B300 及之后的產品中承認這一點,那里的 FP4 速度是 FP8 的三倍。

主持人:雖說理論上應該是四倍。

Reiner Pope:是的。我在這里展示的是整數乘法最簡單的情況。當你處理浮點數時,就像在 FP4 和 FP8 中那樣,還有一個指數項會使計算復雜化。我們能從這之中看出什么呢?我認為你做出的最大觀察是,存在這種與位寬呈平方關系的縮放,這是非常有效的,也是低精度算術在神經網絡中如此奏效的唯一原因。我們接下來要做的另一件事,是比較花在乘法本身的面積與它周圍所有電路的面積。


多路復用器與數據移動的代價

Reiner Pope:讓我們稍微把時間倒回一點,看看在 Tensor Core 出現之前的 GPU 是如何工作的,這實際上也是 CPU 的工作方式。我們要把這個乘加單元放在哪里?

通常來說,我會這樣描述一個 CUDA 核心或 CPU。你會有一個寄存器文件(register file),它存儲一定數量的條目,在這個例子中可能是 8 個 4 位數的條目,但通常是 32 位數。在 CUDA 核心內部,我會有一個具有一定深度的寄存器文件,還有一個乘加電路。它要做的是從這個寄存器文件中提取三個任意的寄存器,執行乘加運算,寫回寄存器文件。它將寫入這一個,但它能夠從這一個、這一個和另一個隨機的寄存器中讀取。它會像這樣接收三個輸入。

這是許多處理器的核心數據路徑。大多數處理器看起來都是這樣的。你有一組寄存器,有一組邏輯單元,也就是 ALU。我們想要分析數據從寄存器文件移動到 ALU 并返回的代價。最終,會有一個電路說:“我并不總是非得選擇這個家伙。我可以在任何時候選擇任何一個寄存器。”


第一個問題是:我怎么才能構建這樣一個電路?我要找的電路叫做多路復用器(Mux)。在這個例子中,它將有 8 個輸入,來自寄存器文件的每一個條目,并且它將有一個輸出,實際上就是產生這個結果。這東西的代價是什么?我們用來構建它的只有與門和或門。我們怎么構建它?我們用最笨的方法。我們做個掩碼(mask)。當我們想要讀取第三個條目時,我們將把每一個條目與 1 或 0 進行“與”操作,這取決于我們是否想要讀取它,我們將把它們全部“或”在一起。

主持人:確保我懂了基礎概念。多路復用器在做的,僅僅是選擇一個輸入?

Reiner Pope:僅僅是選擇,這對軟件來說是隱形的。你說“我要三號輸入”,這就意味著這里有一個多路復用器。那么這個多路復用器的代價是什么?一個操作 p 位數據的 n 輸入多路復用器。我有 n 行。也就是 8 行,每一行有 p 位寬。

我必須對每一個比特進行“與”操作,所以我得到了 n 乘以 p 個與門。對于每一個輸入,我必須決定是否要把它屏蔽掉。我將把它們全部“或”在一起。將會有 n – 1 乘以 p 個或門。我有所有這些不同的東西,幾乎所有的都是 0,但我需要把這 8 個選項坍縮成 1 個選項。每一步,我都需要把一行“或”進現有的行里。

主持人:有趣的是,你并沒有在硬件的層面上思考。你只是想,“哦,我就選擇元素 3 就好了”,然而如此簡單的一個動作,其本身卻是一個相當復雜的電路。

Reiner Pope:這是所有隱藏的數據移動成本浮現的第一步。我們來比較一下。我必須支付這個代價。我在這里有一個多路復用器,事實上,我的乘加操作的三個輸入中,每一個都還有另外兩份這樣的拷貝。我付出的代價是這邊 3 乘以 n 乘以 p 個與門,而實際做我關心的運算的電路中只有 p 乘以 q 個門。如果我們代入實際的數字,n 是 8,單單在數據移動上我們就用了 24 乘以 p 個門,而——如果 q 是 4 的話——在乘加器本身中只有 4 乘以 p 個門。

主持人:這個 3 是從哪來的?

Reiner Pope:這里有三個不同的輸入。我在暗示的是,所有的這些工作量隨著寄存器文件大小的增加而增加——而這還只是一個非常小的寄存器文件——僅僅是將數據從寄存器文件移動到邏輯單元的代價,就比邏輯單元本身昂貴許多許多倍。

看看多路復用器具體長什么樣可能會有幫助,也許是一個 2 位或 4 位的多路復用器。我們畫一個兩路的多路復用器。


我們有兩個不同的數字,我們有這兩個輸入。這些是需要在它們之間做出選擇的輸入,而選擇器可以是“我要這個”或者“我要那個”。這是一種獨熱編碼(one-hot encoding)。這是我們的起點。讓我們關注這種情況。這是我們實際得到的輸入,我們想要把這個家伙作為結果輸出。

非常費力地,我們把這個比特與所有這些比特進行“與”操作。這就是把這個比特與這一行進行“與”操作。同樣地,我們把這個比特與這一行進行“與”操作。這產生了一排全 0。這里有 4 個與門。最后,我們把這兩者“或”在一起,得到一個 1。我們把這兩者“或”在一起,得到一個 1。我們把這兩者“或”在一起,得到一個 0。我們把這兩者“或”在一起,得到一個 1。這就是那 4 個或門。

這實際上看起來有點像加法。我們做了一模一樣的一組“與”操作。我們把所有這些東西“與”在一起,但我們沒有使用全加器電路來坍縮它,而是用或門進行了非常簡單的坍縮。

主持人:但這看起來不像是 n 乘 p 啊。

Reiner Pope:這是在有 n=2 個輸入的情況下。在一般情況下,我們將有 n 行,每行有 p 位。這給了我們 n 乘以 p 個與門。在我描述的這個電路里,幾乎所有的成本,八分之七的成本,都花在了讀寫寄存器文件上,只有極小一部分成本花在邏輯單元本身。這就是需要解決的問題。這基本上就是 Nvidia Volta 架構前幾代 GPU 的游戲規則。CUDA 核心內部裝的就是這種東西。正是這個痛點,催生了 Tensor Core,也就是更通用術語里的脈動陣列(systolic arrays)。

想想我們將如何解決這個問題。我們把幾乎所有的電路面積都花在了一個我們其實并不關心、而且對軟件程序員不可見的東西上,而我們真正關心的東西并沒有占據多少面積。想辦法讓這一個變大,同時保持那一個大小不變。這就是目標。演進的思路是,在這個階段,我們已經把這么多東西固化到了硬件里。


脈動陣列是如何工作的

Reiner Pope:這一單行操作是一個乘加,這單一的東西被固化到了硬件里。脈動陣列的核心理念是,向上跳出兩層循環,將外層的整個循環直接固化到硬件中。想法是,如果我們有一個粒度大得多的固定功能邏輯塊,也許我們在輸入和輸出上付出的“稅”就會小得多。

主持人:有意思。聽起來你的意思是,如果你在矩陣乘法循環中往上走一層,你就能把平衡點從通信更多地向計算傾斜。

Reiner Pope:沒錯。我們將利用兩種效應。一是每次遍歷寄存器文件時,我們可以做更多的事情。二是在這個循環的某些部分,我們可以利用某些保持不變的變量。

形象地看,我們要觀察這個矩陣乘法。循環的這一部分對應于一個矩陣向量乘法。我們將拿一個矩陣乘以一個向量。我們怎么做呢?每一列乘以向量然后求和。我們將沿列求和。這個 0 和 3 乘以 3 和 7 然后求和,接著 1 和 2 乘以 3 和 7 然后求和。矩陣中的每一個條目都關聯著一個乘加操作。我們將畫出這四個乘加操作。

主持人:為了確保我理解為什么有四個乘加:輸出向量對應的列中的每一個條目都是一個點積,在這個例子中它將是兩次乘法,加上這兩次乘法的結果。你是在累加……實際上每個點積只有一次加法,但我們喜歡從零開始。

Reiner Pope:但它包括了從零初始化的過程。是的。我們想要獲得呈平方級增長的計算量。我們有比以前多出 x 乘以 y 倍的計算。但我們的目標是讓通信量只增長 x 倍。我們的意圖是讓這個優勢項隨著 y 增長。我們已經布下了乘法。我們想要引入一個大小為 2 的向量,這已經符合了我們針對列的目標。這沒問題。然而,我們需要管理這個矩陣的通信,它超出了我們 x 的預算。

我們的殺手锏是,在 AI 的語境下,這個矩陣會在很長一段時間內保持不變。我們這邊坐著一些寄存器文件。從這個寄存器文件中流出的數據量……在某種意義上,這是我們希望隨著 x 增長的項。我們不想在每個時鐘周期都把整個矩陣從寄存器文件中搬進來,因為從寄存器文件拉線的代價太高了。

我們的核心技巧是,這個矩陣可以就地存儲在脈動陣列中。我們將把 0、1、2 和 3 這些數字存放在一種叫作寄存器的邏輯門中,它們在物理上保存著這些數字,并且我們將為大量不同的向量反復重用這些數字。

主持人:這里的優化在于,矩陣乘法的性質決定了你可以把這個方形的、呈平方關系的東西直接存儲在發生邏輯運算的地方,與你不斷交換進出的輸入相比,它多出了一個維度。

Reiner Pope:沒錯。這就是矩陣乘法的本質。你做大量的乘法才能得到一個輸出值。點積就是大量乘法的結果。

主持人:所以這個優化意味著,在得到某個輸出值之前,你可以塞進海量的乘法運算。


Reiner Pope:沒錯。為了完成它具體看起來是怎樣的圖景:我把這里的 3 和 2 互換了。就像這個 0 和 3 將乘以 3 和 7 一樣,我們將沿著列形成一個點積。我們將把 3 和 7 饋入這里。這饋入到這個乘法,也饋入到那個乘法。同樣,這個 3 饋入這里,也饋入這里。我們將沿著這里求和。從一列的頂部開始,我們饋入 0,從底部出來我們得到結果。

直觀地看,在矩陣中沿列執行點積,這與脈動陣列在空間上執行的操作完全映射。這是垂直求和的一個點積,這是同樣垂直求和的第二個點積。需要進出寄存器文件的數據是什么?我們有 x 數量的數據在輸出端出來,我們也有 x 數量的數據從輸入端進來。至少就輸入和輸出向量而言,我們達到了目標,即進出寄存器文件的數據量只有 x 倍。

這就留下了一個懸念:我說過權重矩陣就地存儲在脈動陣列中,那么它一開始是怎么進去的呢?在某個時刻,你需要啟動你的芯片并填充這些數據,那么數據從何而來?

訣竅在于,我們做得非常慢。我們非常緩慢地把它一點點滴灌進脈動陣列。最簡單的策略是我們運行這種菊花鏈(daisy chain):把一個數字饋入這里,在下一個時鐘周期,它會向下移動到脈動陣列的下一個條目。我們可以在每一列并行地做這件事,這也將從這里進來,這給了我們另一個大約 x 個單位的輸入帶寬因子。

主持人:你介意把那句話再重復一遍嗎?

Reiner Pope:我們知道我們很少把數字搬進矩陣里。我們只想出任何一種構造,使得跨越脈動陣列邊界的布線數量被限制在 x 而不是隨 xy 增長。一個特別簡單的策略是,在一個時鐘周期內把一個數字帶入脈動陣列的頂行。在連續的 y 個時鐘周期里,我們每次都把頂行帶進來,并把所有其他行向下移一行。這使得需要從昂貴的寄存器文件拉出的布線只與 x 成正比,而不是 xy。

主持人:我明白了。在通信方面有兩個問題:通信時間和通信帶寬。你的意思是,既然我們只打算把數據加載進去一次,那就讓我們把帶寬降到最低吧,因為帶寬就等于裸片面積。我們在更小的通道上慢慢地把它加載進去,因為我們打算把這個值在里面保留很長一段時間。

Reiner Pope:完全正確。

主持人:讓我覺得有趣的是,上次我們討論多芯片推理時,我們在高層次上試圖優化的核心目標是提高單位內存帶寬(也就是單位通信)的計算量。在這里也是一樣,你試圖相對于將信息從寄存器傳輸到邏輯單元的代價,最大化實際的乘法或加法運算量。在這兩種情況下,你都在試圖最大化計算與通信的比例。

Reiner Pope:這種現象在整個技術棧的上下游隨處可見。這已經非常接近底層,接近邏輯門了。甚至在更底層,在你選擇使用的數字格式的精度上,也有類似的情況。我們看到了同樣的效應。無論是在 ALU 的精度上,還是在矩陣的大小上,都存在著平方與線性的權衡。這個單元是下一個更大的單元。我們有了乘法電路,在此之上我們有了一個相當大的脈動陣列。我把它畫成了 2x2,但早期的 TPU 被描述為這里展示的電路的 128x128 陣列。這最終成了實現矩陣乘法已知最高效的電路。

主持人:我們已經討論了相對通信最大化計算似乎是理所當然的。那么,有哪些非顯而易見的權衡會讓你徹夜難眠?那些你不確定該選 X 還是選 Y、答案并不明顯的抉擇是什么?

Reiner Pope:芯片設計中的絕大多數決策都是關于尺寸的決策。就我們在目前畫出的圖中……AI 芯片里都有這個電路。它們有一個脈動陣列,附近有一個提供輸入和輸出的寄存器文件。即使在這個范圍內,你面臨的尺寸問題也是:我的脈動陣列該做多大?我的寄存器文件該做多大?這兩個問題是耦合的。一種思考方式是設定一個預算,決定你打算把多大比例的芯片面積花在數據移動上。也許我說我希望這個占 10%,脈動陣列占 90%。我就可以確定寄存器文件的大小了。更大的寄存器文件更靈活,它們能讓我從應用層面榨出更多性能,但它們會擠占花在脈動陣列上的面積。


時鐘周期與流水線寄存器

主持人:芯片的時鐘周期是從哪里介入的?是什么決定了它?還有,芯片的時鐘周期到底是什么?

Reiner Pope:最基本的一點值得注意,芯片是極其并行的。一個芯片里有上千億個晶體管。當你擁有海量并行能力時,需要做的一件關鍵事情就是在不同的并行單元之間進行同步。在軟件中,你通常有像互斥鎖(mutex)這樣非常昂貴的同步方法。一個線程完成它正在做的事情,抓住存儲在內存某處的鎖,通知另一個線程它已經完成了。

在芯片上,我們采取了一種截然不同的方法。大約每隔一納秒,芯片中的所有電路都會暫停片刻進行同步。這就是時鐘周期。整個芯片通常會步調一致地同時邁向下一個操作。


這在電路中的表現是,時鐘是由寄存器介導的,也就是我們在其他地方畫過的這些存儲設備。可以這樣想:我有一個存儲位,可能是 0 或 1。我有一團邏輯云,也許是這個脈動陣列或乘法器。我有一堆輸入饋入這團邏輯云,最終會有一個輸出寄存器供它寫入。有一個全局時鐘信號驅動著所有這些寄存器。在某個特定的時間瞬間,當時鐘敲響時,那一刻導線上碰巧是什么值,什么值就會被存儲下來。

挑戰在于,我希望我的時鐘速度跑得越快越好。如果我以兩千兆赫茲(2 GHz)運行,我每秒完成的操作數就是一千兆赫茲的兩倍。但這最終意味著我對穿過這團邏輯云的延遲非常敏感,因為在那里發生的任何計算都必須在下一個時鐘周期到來之前完成。任何芯片優化的一個重點就是讓這個延遲盡可能短。

主持人:有意思。這里的約束似乎是,如果你塞進太多的邏輯,你可能會面臨錯過時鐘周期的風險。但如果你放的邏輯不夠,你又白白浪費了潛在的算力。有沒有這樣一種情況:你以概率的心態賭計算能完成,還是說它嚴格遵守非黑即白——要么在時鐘周期內完成,要么完不成?

Reiner Pope:在標準的芯片設計中,你會留出裕量(margin),這樣確實存在一個概率,但它在好幾個標準差之外。就所有實際意圖和目的而言,它是一個可靠的部件,總是能趕上時鐘。也有一些奇怪的例外,比如跨時鐘域(從一個時鐘域跨越到另一個時鐘域)的情況。那時你確實必須去推理這個概率。但在主路徑上,你會留出足夠的裕量,使得它能在時鐘周期結束前 25% 的時間就到達,從而極大地降低了它錯過時鐘的可能性。

主持人:時鐘同步的地方,即寄存器所在的位置,這是由你作為芯片設計師來決定的嗎?還是一件水到渠成的事——你想要某個特定的邏輯序列,而你用來將 Verilog 轉換為發送給臺積電(TSMC)的數據的軟件,只是自動決定為了讓它工作,你必須在這里、這里和這里放置寄存器,以確保沒有任何一個單一步驟會讓整個芯片的時鐘周期變得比必要的更長?

Reiner Pope:插入這些寄存器實際上是設計芯片工作中的很大一部分。它是通過手動和自動方法的結合來完成的。為了展示你在這里能做的最無腦的版本,你可以把這段邏輯切成兩半。我可以用兩個做同樣事情的更小的邏輯云來代替一團邏輯云,但在中間用一個寄存器把它們隔開。如果你在中間切開它,你可以達到兩倍的時鐘頻率。這太棒了,你獲得了兩倍的性能,但代價是多了一個寄存器,這意味著更多的存儲開銷。

主持人:退一步想,我們為什么需要同步整個芯片?如果你想象在玩《異星工廠》(Factorio)之類的游戲,那里沒有全局時鐘周期。事情做完了就是做完了。板子上有鐵,你想要就可以拿走。

Reiner Pope:順著那個比喻,你需要注意的是,如果我穿過某些邏輯有兩條不同的路徑。假設我必須在這里做計算 f,在這里做計算 g,它們要在計算 h 處匯合。制造上會存在偏差。在某些芯片里 f 會花稍微長一點的時間;在另一些芯片里 g 會花稍微長一點的時間。如果我有一個信號正在傳播,而 f 和 g 的結果必須在 h 處匯合,可能出亂子的地方是 f 提前到了,它遇到了 g 上一次的值,或者 g 下一次的值。


主持人:啊。而 h 需要知道什么時候開始,什么時候下一次迭代已經……

Reiner Pope:正是如此。

主持人:這就解釋了為什么在同一個工藝節點、相同的臺積電技術下制造的不同芯片,可能會有不同的時鐘周期。兩塊在 3 納米工藝下制造的芯片可能會有不同的時鐘周期,這取決于它們是否能優化以確保沒有任何一條關鍵路徑長到拖慢整個芯片的時鐘周期。

Reiner Pope:沒錯。我這里展示的優化方法叫做流水線寄存器插入(pipeline register insertion)。我們在流水線中間插入了一個寄存器。這是時鐘速度和芯片面積之間純粹的權衡。這還是簡單的情況。還有更難的情況。我畫出了一條邏輯流水線,但在其他情況下,你可能會有一些計算實際上會反饋到它自己身上。它運行某個函數 f,寫回它自己。例如,這可能是一個加法,你每個時鐘周期都在加一個數字。這個小電路本質上是在對不同時鐘周期呈現的所有數字求運行總和。

挑戰在于,如果這個加號花的時間太長,我能怎么辦?如果我試圖在它正中間塞一個流水線寄存器,它就改變了所做的計算。我得到的將不再是所有輸入數字的運行總和,而是兩個不同的運行總和。我最終會得到一個偶數數字的運行總和,和一個奇數數字的運行總和。這種約束——我的邏輯中存在一個循環,所有芯片某處都有這種循環——是最難解決的問題,也是它設定了時鐘周期。

主持人:我不明白為什么有這個會是個問題。我甚至不確定在那里放一個寄存器意味著什么。它是一種原子操作嗎?

Reiner Pope:嗯,加號并不是真正的原子操作。正如你剛才展示的。做一次求和需要做大量的工作。你可以提取那項工作的早期部分,在中間塞一個寄存器,提取那項工作的后期部分。

主持人:好吧。臺積電提供了一個制程設計套件(PDK),規定了他們能授予你的芯片邏輯原語。由他們來決定沒有任何一個原語會大到超過某個工藝節點所瞄準的時鐘周期。但除此之外,難道你不能直接拿著臺積電所有的原語,在它們之間不斷添加寄存器,直到達到你想要的時鐘周期嗎?

Reiner Pope:作為邏輯設計師,是芯片架構師設定了時鐘周期。例如,你從臺積電獲得的原語大約是與門或全加器這種級別。這在很大程度上取決于電壓和你選擇的庫,但通常在一個時鐘周期內你可以串聯大約 10、20 或 30 個這樣的東西。這些原語非常快,可能只要 10 皮秒。作為邏輯設計師,原則上,如果你只是把一個寄存器和一個與門放在一個循環里,你可以獲得一個極其瘋狂的時鐘速度,超過 4、5 或 6 千兆赫茲。


但如果你看看這個極其簡單的電路,再看看你在這里花費的面積……這在大小上被稱為一個等效門(gate equivalent),也就是 1 個面積單位。而這個東西(寄存器)在面積上可能占 8 個單位。再次強調,與實際邏輯相比,幾乎你所有的成本都變成了同步或通信成本。這就是你走火入魔的情況。你讓你的時鐘速度變得極快,代價是幾乎把所有的面積都花在了流水線寄存器上。

主持人:有意思。所以你暗示了這樣一種動態:你可以擁有非常快的時鐘速度,但你并沒有完成多少工作。你可以有低延遲,但吞吐量也很低。

Reiner Pope:事實上,這損害了你的吞吐量,因為你芯片的吞吐量等于你每個時鐘周期完成的工作量(這基于面積效率)乘以你每秒獲得的時鐘周期數。

主持人:這其實和我們上次討論的批處理大小(batch size)非常相似,如果你有一個很小的批處理大小,任何一個用戶都能極快地收到他們的下一個 token,但在比如一個小時內處理的 token 總數,將比它本可以達到的水平要低。

Reiner Pope:完全一致。如果你把時鐘速度飆得太高,你壓榨出的并行度就會變少。


FPGA 與 ASIC 之爭

主持人:我記得在為我們上次的聯合采訪做準備時,我與 Jane Street 的一位 FPGA 工程師 Clark 聊過。他向我解釋了他們為什么使用 FPGA。我想象對于高頻交易來說,吞吐量不如延遲重要,所以以一種確定性的方式對時鐘周期進行非常精確的控制才是最重要的事情。也許聊聊為什么你不能直接用 ASIC(專用集成電路)實現這一點,或者為什么你可能會使用 FPGA 來為高頻交易獲得確定性的時鐘周期會很有趣。

Reiner Pope:讓我們考慮一下 FPGA 與 ASIC 的商業案例。FPGA 和 ASIC 在很大程度上使用了相同的概念模型。

你有一系列由微小原語(與門、或門、異或門)構建的門電路,它們通過導線連接,在固定的時鐘周期內運行。

任何你能在 FPGA 中表達的東西,你也能在 ASIC 中表達。只是在 ASIC 上,它的成本會低大約一個數量級,能效更高。權衡之處在于,你的第一塊 FPGA 只花你 1 萬美元,而你制造的第一塊 ASIC 則要花掉 3000 萬美元,因為它需要一次完整的流片(tape-out)。FPGA 的商業應用場景在于:你需要極其確定的延遲、極快的運行速度和極高的并行度,但你的工作負載會頻繁改變,可能每個月都在變。你顯然不想每次都去承擔那昂貴的流片成本。

FPGA 實際上是如何在固定的硬件塊中模擬 ASIC 編程模型的呢?在核心層面,它有我們剛才討論過的兩個組件。它有作為存儲設備的寄存器,它有提供所有門電路的查找表(LUTs)。還有第三個組件。我們有一大群這樣的寄存器和查找表,它們被一組龐大的多路復用器連接起來。在每一個這樣的組件前面,我們都有一個多路復用器,它從其他所有地方選擇一個輸入。我們有一大堆不同的選項饋入所有這些東西。

這帶來的結果是,本質上當我給我的 FPGA 編程時,我可以拿起所有這些組件,疊加一種特定的布線,比如穿過這個查找表,饋入另一個查找表,發送到這個寄存器,再饋入另一個查找表,諸如此類。


FPGA 的意思是現場可編程邏輯門陣列(Field-Programmable Gate Array)。橙色的是在現場(field)編程進去的東西,而白色的是 FPGA 為了最初能夠被制造出來而必須存在的所有物理導線。

主持人:在現場編程是什么意思?

Reiner Pope:在現場編程意味著該設備正被部署在數據中心里。它已經出廠走向世界了,你可以跑去給它編程。

主持人:啊,現場(field)不是指電場之類的,而是指在外面的世界里,懂了。如果我看看現場編程是如何從第一個查找表出來進入第二個查找表的,那是怎么運作的?實現這一點的導線在哪里?

Reiner Pope:我在畫所有這些東西的時候有點偷懶了。這里的每一個設備前面都坐著一個多路復用器,它可以從附近所有可用的電路中進行選擇。FPGA 的實際配置就等同于多路復用器的控制。在這個多路復用器中,我們有數據輸入,我們有進行選擇的控制端。在每一個這種多路復用器的旁邊都坐著一個小小的存儲設備,寫著:“這就是你要從中獲取輸入的地方。”對它進行編程就包括配置每一個這樣的多路復用器。

主持人:有道理。那么查找表內部發生了什么?

Reiner Pope:查找表也會有一點控制信息告訴它該做什么。它的目的是可配置地扮演與門、或門、異或門或任何這些不同東西的角色。你可以考慮用很多種方法來做這件事。傳統 FPGA 中的做法是……一個查找表有 4 位輸入和 1 位輸出。從 4 位到 1 位有多少種不同的映射函數?有 16 種不同的函數。你可以把這制成一張包含 16 個不同數字的表。你有一張比如 0111001 的表,共 16 個條目。這張表就存儲在這個藍色的配置位中。它把這 4 個輸入位看作二進制數,查找表中對應的行,輸出那個比特。這就是查找表的真值表視角。

主持人:好的,所以如果你想想與門、或門、或非門、異或門,它們都把……那些是兩輸入函數。有時我們有三輸入函數,比如三路異或,或者四路異或。在這種情況下,它只是取決于它有多大嗎?

Reiner Pope:查找表的典型大小是 4 個輸入。這算是一個甜點(sweet spot)。這里還有一個計算與通信的權衡。如果它的輸入太少,你就需要使用更多的查找表。

主持人:基本上查找表就是一個真值表。有了真值表,你就可以編程出任何你想要的邏輯門。所以你不把它當查找表,直接把它想成一個可編程邏輯門就行了。

Reiner Pope:沒錯。你能在這里做的一件事是,你可以看出關于 FPGA 比 ASIC 貴一個數量級的經驗法則是怎么來的。你數數這個查找表內部會有多少個邏輯門。我們基本上可以把這個查找表看作是這些多路復用器中的一個。它必須在 16 個不同的值之間進行選擇,所以它是一個有 n=16 個選項和 p=1 位的多路復用器。正如我們之前看到的,這個電路的代價是 n 乘以 p 個門。所以它耗費 np,也就是 16 個與門,以及 16 個或門。

主持人:這個電路指的是多路復用器?

Reiner Pope:沒錯,多路復用器。

主持人:就是進入查找表之前的那個多路復用器?

Reiner Pope:查找表本身你就可以認為是一個巨大的多路復用器,它從所有 16 行中選擇出 1 個輸出。那就是查找表。

主持人:但按照你這里的畫法,有一個多路復用器,然后是一個查找表。


Reiner Pope:一路到底全是多路復用器。里面還有一個第二級的多路復用器。這個多路復用器就是那個多路復用器。

主持人:而另一個多路復用器只是在決定它從這堆混亂的邏輯門中的哪里來。

Reiner Pope:對,而第二個多路復用器是,“好吧,現在你有一個值了,但那個值仍然是一個 4 位的值。”

主持人:懂了,我從大雜燴里選出了 4 個位。我用這 4 個位來選擇我要使用查找表里的哪個條目。

Reiner Pope:假設在第一個多路復用器中,你從附近的 8 個寄存器中提取輸入。總共有 32 個位進去。從中出來 4 個位。這 4 個位進入第二個多路復用器,它位于查找表內部。在這個例子中,這些寄存器是單比特寄存器。如果附近有 8 個寄存器和查找表,那么我總共有 8 個位從附近進來。我從 8 個值中選擇出 4 個不同的值。實際上有 4 個不同的多路復用器,每一個輸入位都關聯著一個小多路復用器。它們每一個都在做 8 選 1。

主持人:那 8 個是從哪來的?

Reiner Pope:附近的寄存器和其他查找表。

主持人:每個寄存器是 1 位。

Reiner Pope:是的。

主持人:我猜 AMD 或其他制造這些 FPGA 的廠商,仍然必須對哪些寄存器連接到哪些寄存器持有固定的意見。你可以編程出實際的邏輯門,但他們在通信拓撲中添加了一根導線,對吧?

Reiner Pope:你在局部粒度上獲得了靈活性。有一個附近的鄰域供你選擇,但對于更粗粒度、長距離的連接,他們對此是有預設框架的。

主持人:那它慢 10 倍的原因是什么呢?

Reiner Pope:如果你看看構建這個查找表的成本,它是 32 個邏輯門。它能給我帶來等同于——我能在這里做的一件有趣的事是——一個四路與門的效果。四路與門意味著與,與,再對與出來的結果進行與操作。這是一個我可以直接用 3 個與門在 ASIC 中實現的電路。使用查找表,我也能實現它,但它將耗費 32 個門而不是 3 個。

主持人:所以額外的開銷實際上來自于這樣一個事實:有一種比列出輸入的所有可能組合(即真值表)更簡潔的方法來描述一個真值表,那就是直接把邏輯門畫出來。

Reiner Pope:是的,鋪設多晶硅和導線等等。


緩存(Cache)與便簽內存(Scratchpad)

主持人:有意思。你向我提出的一個重點是,他們之所以偏好 FPGA 而非 CPU,是因為他們能獲得確定性的時鐘周期。他們確切地知道數據包何時進來、何時出去。為什么在 CPU 里這不能成為一個保證呢?

Reiner Pope:你實際上也可以設計出一個具有確定性延遲的 CPU。事實上,許多 AI 芯片內部的處理器也具有確定性延遲。Groq 就以此為賣點。TPU 的核心中也有這個。挑戰在于如何同時獲得確定性延遲和高速度。非確定性延遲來自于 CPU 中的特定設計選擇。你確實可以移除這些設計選擇,制造出一個具有確定性延遲的 CPU,但那樣的 CPU 在市場上并不怎么吸引人,所以人們不再制造那種 CPU 了。

在某種意義上,確定性延遲是一個更簡單的起點,是一些芯片設計師為了某些目的加入了讓它變得非確定性的東西。舉個具體的例子,CPU 上非確定性最重要的來源可能就是 CPU 緩存(cache)本身。

在 CPU 中,你有 CPU 裸片本身,旁邊有 DDR 內存。你在內部有一個緩存系統,它記住了最近對 DDR 的訪問并把它們存儲下來。當我運行我的 CPU 指令時,每次我有一條訪問內存的指令,它首先檢查數據是否存儲在緩存中。如果沒有,它就去 DDR 里取。


這是一個巨大的優化。緩存比 DDR 快兩個數量級。如果你從不使用緩存,基本上所有的程序都會運行得慢一百倍。緩存的存在對于 CPU 以合理的速度運行是絕對必要的。但是,你是否命中緩存,取決于 CPU 的環境上下文:還有什么其他程序在運行,最近運行了什么,以及緩存系統內部的隨機數生成器在做什么。這就是 CPU 運行時間中一個巨大的非確定性來源。這就是 CPU 的內存系統。

你可以采取一種截然不同的做法:不再讓硬件說“我要讀取內存”然后由硬件來決定數據是否來自緩存,而是將這個決定權交還給軟件。你可以在 TPU 中看到這種設計。我會畫一張同樣的圖,但我會叫它便簽內存(scratchpad)。主要的區別是……這是一個 TPU,在這個例子中你擁有 HBM 而不是 DDR,但它仍然是一個片外內存。與其讓軟件說“首先訪問內存”然后讓硬件來決定,你有一種特定類型的指令專門去訪問便簽內存,還有一種完全不同的指令去訪問 HBM。這種設計風格統稱為便簽內存,而非緩存。關鍵的區別在于,你有一種指令說“讀或寫便簽內存”,和一種完全不同的指令說“讀或寫 HBM”。

主持人:所以便簽內存就相當于那個緩存。

Reiner Pope:是的,這東西就是便簽內存。


為什么 CPU 核心比 GPU 核心大得多

主持人:退一大步看:人們常說計算機采用的是“馮·諾依曼架構”,也就是對信息進行串行處理。也許只是因為我們一直在討論并行加速器,但 FPGA 是超級并行的。AI 加速器、TPU 是超級并行的。如果你想想 CPU 擁有的所有核心,甚至 CPU 也是超級并行的。在什么意義上,現代硬件實際上還是馮·諾依曼架構?這真的是描述現代硬件的一種公平方式嗎?

Reiner Pope:我認為這用來描述 CPU 是公平的。你在 CPU 上獲得的并行度大約是 100 個核心乘以也許 16 路的向量單元,所以在 CPU 上大約是 1000 路的并行度。

主持人:有個問題:CPU 用了一整塊裸片,如果線程那么少,僅僅就晶體管電壓開關這件事而言,難道真的只有一個控制流——裸片上的一小部分——其電壓在開關嗎?你實際上是如何填滿 CPU 的裸片面積的?如果只有這么幾個核心,你把所有的裸片都花在什么地方了?那里到底發生了什么?

Reiner Pope:核心只是大得多也復雜得多。我們應該拿一個 CPU 核心(它占據了裸片的百分之一)去和一個查找表(LUT)比較。一個查找表只有 16 個門。這就很清楚為什么 FPGA 里的查找表數量比 CPU 里的核心數量多得多了。

主持人:但為什么 CUDA 核心的數量比 CPU 核心多呢?CPU 和 GPU 的區別到底在哪里?

Reiner Pope:在 CPU 內部,面積的一大用途是緩存。真正屬于 ALU 的極少。大部分是這些寄存器文件而不是邏輯單元。這兩者在 GPU 中都有對應物,所以這不是一個很大的區別。但 GPU 中沒有對應物的東西是分支預測器(branch predictor)。CPU 中有一大塊區域全是用來預測下一個分支何時出現、目標在哪里的預測器。剝離大量此類組件,使寄存器文件更加緊湊,是 GPU 性能超越 CPU 的主要驅動力。

主持人:分支預測器的目的是什么?同時執行兩個分支,還是它到底做什么?

Reiner Pope:問題在于,當我有了一系列指令,如果我遇到一個分支,處理一條指令的實際步驟需要很長時間。可能需要 5 納秒。注意到我有一個分支、評估布爾值是否為真、將程序計數器更新到新目標、從指令內存中讀取,這一整套流程可能需要 5 納秒才能完成。所以實際上,這可能會在很靠后的時間點才完成。

我希望運行的時鐘速度遠遠快于 5 納秒所允許的速度。5 納秒對應的是 200 MHz 的時鐘速度。我希望能跑到一千兆或兩千兆赫茲。所以我需要在分支被評估的同時運行其他指令。我只想繼續運行排在我后面的指令。但這可能是錯的。如果最終分支被觸發了,那么我需要知道,我實際上不需要評估這些指令,而是需要跳轉到目標所在的位置去運行那些指令。分支預測器的目的就是在 5 個周期前預測到一個分支將會發生,甚至在你到達那條指令之前。


大腦與芯片

主持人:如果我思考一下大腦是如何運作的,再對比你在這里描述的,高層面的區別可能是:雖然你可以在這些加速器中做結構化稀疏以節省一些原本必須用于邏輯門的面積,但在大腦中存在的是非結構化稀疏。任何神經元都可以連接到任何其他神經元,而且不是以它們列對齊的方式。還有一個事實,即內存和計算是同地協作(co-located)的。雖然我猜你也可以說,在某種程度上內存和計算在這些裸片上也是同地協作的。

Reiner Pope:這在某種意義上正是內存和計算的同地協作。

主持人:所以也許那不是一個很大的區別。另一個顯著的區別是,大腦的時鐘周期比計算機慢得多。部分原因是為了保存能量,因為時鐘周期越快,電壓就需要越大,以便信號穩定下來并識別晶體管處于什么狀態。

Reiner Pope:沒錯。

主持人:我不知道你對大腦可能在做什么與這些芯片是如何運作的有什么評論。

Reiner Pope:我們先談談時鐘速度。芯片上的時鐘速度相當高,因為那驅動著更高的吞吐量。當我們比較運行某個工作負載的 GPU 時,它運行的批處理大小(batch size)是 1000。而大腦運行的批處理大小不是 1000,世界上只有一個我。

你可以想象一下說,“拿一塊 GPU,不讓它跑在一千兆赫茲,而是讓它跑在一兆赫茲”,那就會開始看起來有點像你談論的大腦中的對應物。但在硅片的工作方式中,這并不能給你帶來 1000 倍的能效優勢。

它最終看起來的樣子是,你只把這個電路運行一次直到穩定,它將閑置很長一段時間。它在閑置時不會消耗大量能量,因為大部分能量是在將比特從 0 切換到 1 再切換回來時消耗的。我們來談談這樣一個電路的能耗。存儲一個比特的原理可以理解為:你在隱式位于芯片某處的電容器中沉積了一些電荷。當比特變成 1 時它被充電,當它下次變成 0 時它被放電。這個對電容器充電然后把電荷傾倒到地線的過程,就是能量被消耗的地方。這被稱為動態功耗或開關功耗,它是芯片能耗的絕大部分。還有一些其他的能耗僅僅是因為絕緣體不夠完美,但我們忽略不計。

絕大部分能耗來自于從 0 切換到 1 再切換回 0 的過程。如果你讓芯片運行得慢得多,每隔一千個時鐘周期才觸發一次,你的狀態翻轉次數就會少 1000 倍。能耗也會大約少 1000 倍。但這在能效上并不會帶來實質性的優勢。


GPU 只是由一堆微型 TPU 組成的

主持人:好的,你高屋建瓴地描述了 TPU 是如何工作的。那么在宏觀層面上,GPU 和 TPU 的工作方式有什么區別呢?

Reiner Pope:有一個高層面的組織原則是不同的,核心內部的東西也是不同的。從高層面來看,我們將拿一個 GPU 和一個 TPU 來看看頂層塊結構是什么樣的。如果你把這看作是各自的整個芯片,GPU 的組織結構主要是一堆幾乎相同的單元,也就是 SM(流式多處理器)。它們中間有一個 L2 內存,底部還有一堆這樣的 SM。所以這是一個相當規則的核心網格。


如果我們看看 TPU 作為對比,你最終得到的是粒度大得多的邏輯單元。你最終只有幾個矩陣單元,也就是那些巨大的脈動陣列。中間你有一個向量單元,底部有你的矩陣單元。這些帶有中間向量單元的矩陣單元構成了整個 TPU 芯片。你可以想象把這個東西縮小成一個極其微小的單元,帶有一個更小的矩陣單元和一個更小的向量單元,那在某種程度上就是一個 SM。從一個極高的宏觀視角來看,GPU 就是把許多微型的 TPU 鋪滿了整個芯片。

主持人:哦,有意思。你的意思是,流式 SM 內部的 Tensor Core 類比于 MXU(矩陣乘法單元)?

Reiner Pope:是的,一切都非常相似。

主持人:我明白了。如果你的工作負載比較無結構化,那么采用一堆微型 TPU 的設計是非常合理的。而如果你只是進行巨大的矩陣乘法,你可能想要避免擁有各自獨立寄存器和 warp 調度器的單個 SM 所帶來的開銷。為什么不直接做一個巨大的東西,把這些開銷攤薄到整個芯片上呢?

Reiner Pope:這體現在你能把事物做到多大上。我們已經看到了這個主題,特別是在脈動陣列上,一個更大的脈動陣列能更好地攤薄寄存器文件的成本。這種設計允許你擁有更大的脈動陣列,而 GPU 的設計則限制你只能擁有各種東西的微小單元。

然而,這也有權衡。由于這種粗粒度的組件分離,你需要將大量數據從向量單元移動到矩陣單元,僅僅通過這里的兩條周界線。如果你看看 GPU 中的對應情況,你到處都有向量單元,你可以通過許多不同的線路移動數據。在 GPU 中,你能在一臺向量單元和一臺矩陣單元之間移動的數據量實際上比 TPU 高得多。你不需要僅僅通過兩條線來移動所有數據,而是在 GPU 中通過 16 條布線來移動它。

主持人:對。但也可能你跨越的面積更小。

Reiner Pope:這也是一種能量節省。所以如果你能完全在一個 SM 內部操作,數據移動就會小得多。但一旦你想要跨 SM 操作,它就會變得更復雜、更昂貴。

主持人:你可以不予置評,但人們可能會預期,MatX 可能會嘗試做的一件事是,獲得類似 GPU 那種被 SRAM 包圍的較小脈動陣列結構,但同時又剝離掉 SM 中為了支持 CUDA 架構而占用大量空間的東西。

Reiner Pope:我們曾公開談論過我們稱之為“可拆分脈動陣列”(splittable systolic array)的東西,在某種意義上你可以把它想成可以化身為小型脈動陣列的大型脈動陣列。

主持人:酷。好的,我想這是一個很好的收尾。Reiner,非常感謝你。


免費領取 100 小時 AI 算力|CSDN 讀者福利

加入 AI 開發者計劃獲取:

? AI 算力資源

? 官方技術社群

? Workshop 與 AI Academy

? 開發者專屬福利

立即掃碼,前 50 名額外領取「瑞幸咖啡」

咖啡領取鏈接: https://s.csdn.cn/4nPsOp

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
世界杯還沒開始,伊朗隊就創造了一項前無古人的紀錄

世界杯還沒開始,伊朗隊就創造了一項前無古人的紀錄

張斌說
2026-06-13 23:02:09
卡塔爾VS瑞士,比賽精準分析,一場開賽以來最沒懸念的比賽?

卡塔爾VS瑞士,比賽精準分析,一場開賽以來最沒懸念的比賽?

云隱南山
2026-06-13 13:09:04
高校后勤女子出軌校外男:身材超好!雙方私密聊天不堪入目

高校后勤女子出軌校外男:身材超好!雙方私密聊天不堪入目

老貓觀點
2026-06-13 07:25:10
尷尬!技師給顧客把褲子拉上去,用毛巾蓋好,上海一足療店被差評

尷尬!技師給顧客把褲子拉上去,用毛巾蓋好,上海一足療店被差評

火山詩話
2026-06-13 06:24:48
澳網法網雙決賽不入,辛納成三十余年來球王第三人!

澳網法網雙決賽不入,辛納成三十余年來球王第三人!

網球之家
2026-06-13 22:27:10
范德比爾特曬出新車,東契奇評論:可以把車借我開嗎求求了

范德比爾特曬出新車,東契奇評論:可以把車借我開嗎求求了

懂球帝
2026-06-13 22:23:08
世界杯又見手撕球衣名場面!該球衣品牌曾被吐槽“但愿他們不產安全套”

世界杯又見手撕球衣名場面!該球衣品牌曾被吐槽“但愿他們不產安全套”

南方都市報
2026-06-13 13:32:55
全線轉跌,超12萬人爆倉

全線轉跌,超12萬人爆倉

每日經濟新聞
2026-06-12 00:18:19
阿媒:阿根廷9人將佩戴世界杯首秀徽章出戰

阿媒:阿根廷9人將佩戴世界杯首秀徽章出戰

懂球帝
2026-06-13 10:41:16
中方通告全球,菲律賓的回應來了,菲反對黨:拆除所有中方建筑

中方通告全球,菲律賓的回應來了,菲反對黨:拆除所有中方建筑

楠楠自語
2026-06-14 00:12:30
突發 | 山東一化工企業工廠突發火災,周邊居民聽到爆炸聲

突發 | 山東一化工企業工廠突發火災,周邊居民聽到爆炸聲

天津廣播
2026-06-13 23:43:59
醫生發現:吃一個西紅柿,就等于喝了一大口碳酸飲料,真的假的?

醫生發現:吃一個西紅柿,就等于喝了一大口碳酸飲料,真的假的?

路醫生健康科普
2026-06-13 15:45:43
世界杯太慘了!邀約4000人到場0人,央視疑似虧錢,評論區太現實

世界杯太慘了!邀約4000人到場0人,央視疑似虧錢,評論區太現實

譚談社會
2026-06-12 23:51:18
丹丹的餐廳在“四不”抵制下門可羅雀,印度丈夫要把全家帶到中國

丹丹的餐廳在“四不”抵制下門可羅雀,印度丈夫要把全家帶到中國

魔都姐姐雜談
2026-06-13 15:58:31
美國4-1巴拉圭!可怕的不是贏球,是美國主帥賽后這番話,很實在

美國4-1巴拉圭!可怕的不是贏球,是美國主帥賽后這番話,很實在

小青年淥淥
2026-06-13 15:03:53
太慘了!利物浦被挖空!剛免簽羅伯遜,熱刺又砸 6000 萬撿漏王牌

太慘了!利物浦被挖空!剛免簽羅伯遜,熱刺又砸 6000 萬撿漏王牌

奶蓋熊本熊
2026-06-14 04:40:08
1夜7大轉會!皇馬成功截胡B席,槍手兩筆清洗,拉什福德被退貨!

1夜7大轉會!皇馬成功截胡B席,槍手兩筆清洗,拉什福德被退貨!

田先生籃球
2026-06-13 06:53:45
英格蘭隊隊長凱恩只穿內褲照片被曝光,球迷調侃:被偷得只剩褲衩;該隊世界杯訓練裝備大部分已追回

英格蘭隊隊長凱恩只穿內褲照片被曝光,球迷調侃:被偷得只剩褲衩;該隊世界杯訓練裝備大部分已追回

極目新聞
2026-06-14 00:20:46
為什么家里不要隨便裝監控?很多人都不知道內情,看完漲知識了

為什么家里不要隨便裝監控?很多人都不知道內情,看完漲知識了

小俊分享
2026-06-02 12:07:15
成本13億,首日票房僅400多萬,世界第一導演新片被謝苗打懵了

成本13億,首日票房僅400多萬,世界第一導演新片被謝苗打懵了

影視高原說
2026-06-12 17:28:16
2026-06-14 05:12:50
CSDN incentive-icons
CSDN
成就一億技術人
26647文章數 242291關注度
往期回顧 全部

科技要聞

SpaceX上市首日破2萬億美元,馬斯克再封神

頭條要聞

特朗普:美伊協議計劃周日簽署 霍爾木茲海峽立即開放

頭條要聞

特朗普:美伊協議計劃周日簽署 霍爾木茲海峽立即開放

體育要聞

美國4比1巴拉圭:這統治力真是美國隊?!

娛樂要聞

鄧超曬孫儷親手織的帽子,笑瘋全網!

財經要聞

梁文鋒向左,楊植麟向右

汽車要聞

深藍S07華為乾崑激光版增程車型上市 限時15.49萬元起

態度原創

健康
旅游
手機
公開課
軍事航空

老人、小孩、孕婦,吃粽子有啥風險

旅游要聞

夏天就該這樣過!大別山的夏天,從霍山大峽谷漂流的第一聲尖叫開始。

手機要聞

比華為三折疊還稀缺!iPhone Ultra國行備貨量不足:博主直言搶到賺到

公開課

李玫瑾:為什么性格比能力更重要?

軍事要聞

伊外長披露伊美諒解備忘錄草案部分內容

無障礙瀏覽 進入關懷版