0
在 AI 崛起的這幾年來,大家經(jīng)常會(huì)看到“TPU、IPU、NPU”之類的名字,這些“XPU”有什么分別?是真的有那么多不同的架構(gòu)?還是廠商的概念營銷?
為了解答這個(gè)問題,外媒SemiEngineering搜集了大量業(yè)內(nèi)人的看法并匯總成文,我們進(jìn)行精簡和編譯,原文鏈接:https://semiengineering.com/what-is-an-xpu
圖源aita
從 CPU 及其發(fā)展方式的角度來看,這些“XPU”中的大部分都不是真正的處理器。機(jī)器學(xué)習(xí)加速器是一類處理器,但它們用來加速的處理部分卻多種多樣。它們更像是 GPU,是用于執(zhí)行特殊工作負(fù)載的加速器,而且它們本身就有很多類型。
處理器的本質(zhì)可以歸結(jié)為三件事,最后還是回到指令集架構(gòu) (ISA):首先定義要做的事,然后是 I/O 和內(nèi)存(支持 ISA 和它試圖完成的任務(wù))。而未來我們將看到比過去兩、三年更多的創(chuàng)新和變化。
許多新架構(gòu)都不是單一處理器,它們是不同類型的處理器或可編程引擎的組合,它們存在于同一個(gè) SoC 或同一個(gè)系統(tǒng)中,將軟件任務(wù)分派到不同的硬件或可靈活變動(dòng)的可編程引擎上。所有這些處理器可能共享一個(gè)公共 API,但執(zhí)行域有所不同。在這個(gè)層面,確實(shí)是有各種類型的不同架構(gòu)。
但現(xiàn)實(shí)情況是,大部分“XPU”的命名都是營銷,而且這些命名和縮寫,同時(shí)指代兩種東西:一種是用于解釋處理器的架構(gòu),例如 SIMD(單指令多數(shù)據(jù)),而另一種定義了它正在尋址的應(yīng)用程序段。所以它既可以用來定義處理器架構(gòu),也可以用作如“張量處理單元(TPU)”這樣的品牌名,畢竟廠商們不是在為單個(gè)處理器命名,而是在為他們的架構(gòu)命名。
在40 年前,命名的問題要簡單很多。首先是中央處理器(CPU),雖然它有很多演變版本,但它們基本上都是馮諾依曼架構(gòu),是圖靈完備的處理器。每個(gè)都有不同的指令集來提升處理效率,當(dāng)年還針對(duì)復(fù)雜指令集 (CISC) 與精簡指令集 (RISC) 優(yōu)缺點(diǎn),有過非常廣泛的討論。
后來的 RISC-V 的出現(xiàn)給 ISA 帶來了很多關(guān)注。 ISA 定義了處理器針對(duì)已定義任務(wù)的優(yōu)化程度,人們可以查看 ISA 并開始計(jì)算周期。例如,如果一個(gè) ISA 具有本機(jī)指令并以 1GHz 運(yùn)行,那我們就能將它與另一個(gè) ISA 處理器進(jìn)行比較,后者要完成相同的功能可能需要兩條指令,但頻率是 1.5GHz,孰強(qiáng)孰弱就很明顯了。
CPU 有多種封裝方式,有時(shí)將 I/O 或內(nèi)存放在同一個(gè)封裝中,而后兩者被稱為微控制器單元 (MCU)。在調(diào)制解調(diào)器大行其道的時(shí)候,數(shù)字信號(hào)處理器(DSP) 出現(xiàn)了,它們的不同之處在于它們使用了哈佛架構(gòu),將指令總線與數(shù)據(jù)總線分開了,其中一些還用了 SIMD 架構(gòu)來提升數(shù)據(jù)處理效率。
指令和數(shù)據(jù)的分離是為了提高吞吐率(雖然它確實(shí)限制了自編程之類的邊緣編程)。通常,這里的邊界條件不是計(jì)算,而是 I/O 或內(nèi)存。業(yè)內(nèi)的重點(diǎn)已經(jīng)從提升計(jì)算能力,轉(zhuǎn)變成確保有足夠的數(shù)據(jù)來讓計(jì)算進(jìn)行下去并保持性能。
當(dāng)單個(gè)處理器的性能無法再繼續(xù)提升,那就把多個(gè)處理器連在一起。通常它們還會(huì)使用共享內(nèi)存,讓每個(gè)處理器和整個(gè)處理器集群都保持圖靈完備。程序的任何部分在哪個(gè)核心上執(zhí)行都無關(guān)緊要,反正結(jié)果是一樣的。
而下一個(gè)重大發(fā)展,是圖形處理單元(GPU)的出現(xiàn)。GPU打破了常規(guī),因?yàn)槊總€(gè)處理單元或管線都有自己的內(nèi)存,無法在處理單元外部尋址。因?yàn)閮?nèi)存大小有限,只能執(zhí)行那些能放入內(nèi)存的任務(wù),所以對(duì)任務(wù)本身有限制。
對(duì)于某些類型任務(wù),GPU 是非常強(qiáng)大,但它們的管線非常長,導(dǎo)致了延遲和不確定性。這些管線讓 GPU 單元不斷處理數(shù)據(jù),但如果要刷新管線,效率就會(huì)大打折扣。
GPU 和后來的通用 GPU (GPGPU) 定義了一種編程范式和軟件棧,使它們比以前的加速器更容易上手。多年來,某些工作一直是專業(yè)化的,有用于運(yùn)行連續(xù)程序的 CPU,有專注于圖像顯示,并將我們帶入高度并行世界的圖形處理器,后者使用很多小的處理單元來執(zhí)行任務(wù)(包括現(xiàn)在的機(jī)器學(xué)習(xí)任務(wù))。
那有什么架構(gòu)規(guī)則可以用來解釋所有的新架構(gòu)嗎?有的,或許片上網(wǎng)絡(luò) (NoC)是個(gè)合適的定義 。過去,處理器陣列通常用內(nèi)存或固定網(wǎng)絡(luò)拓?fù)溥B接(網(wǎng)狀或環(huán)形),而 NoC 讓分布式異構(gòu)處理器能以更靈活的方式進(jìn)行通信。而將來,它們還可以在不使用內(nèi)存的情況下進(jìn)行通信。
現(xiàn)在的 NoC 是針對(duì)數(shù)據(jù)的,而未來的 NoC 也能發(fā)命令和通知等數(shù)據(jù),可以擴(kuò)展到那些加速器間不只是交互數(shù)據(jù)的領(lǐng)域。加速器陣列或集群的通信需求可能與 CPU 或標(biāo)準(zhǔn) SoC 的通信需求不同,但 NoC 并不會(huì)將設(shè)計(jì)者限制在一個(gè)子集里,他們能通過滿足不同加速器的特殊通信需求來優(yōu)化和提高性能。
另一種區(qū)分處理器的方式,是看它們對(duì)特定運(yùn)行環(huán)境進(jìn)行的優(yōu)化。例如,云端和微型物聯(lián)網(wǎng)設(shè)備上可能可以跑相同的軟件,但在不同環(huán)境中使用的架構(gòu)是完全不同的,它們對(duì)性能、功耗、成本、極端條件下的運(yùn)行能力等要求都是不同的。
這可能是因?yàn)閷?duì)低延遲的需求,或者是因?yàn)楣牡脑颍恍┰瓉磲槍?duì)云計(jì)算的軟件,現(xiàn)在被逐漸放到設(shè)備端側(cè)運(yùn)行。雖然是不同的硬件架構(gòu),但大家自然希望擁有完全相同的軟件棧,以便軟件能夠在兩種場合跑起來。云端需要提供靈活性,因?yàn)樗鼤?huì)跑不同類型的應(yīng)用程序,而且用戶眾多。這要求服務(wù)器硬件又要有針對(duì)應(yīng)用的優(yōu)化,又要能提供不同的規(guī)模。
而機(jī)器學(xué)習(xí)任務(wù)也有自己的要求,在使用神經(jīng)網(wǎng)絡(luò)和機(jī)器學(xué)習(xí)構(gòu)建系統(tǒng)時(shí),你需要使用軟件框架和通用軟件棧,讓網(wǎng)絡(luò)編程并映射到硬件,然后你可以從 PPA 的角度讓軟件適配不同的硬件。這推動(dòng)了“讓不同類型的處理和處理器適應(yīng)各種硬件”的需求。
這些需求是由應(yīng)用定義的。舉個(gè)例子,就像一家公司設(shè)計(jì)了一個(gè)用于圖形操作的處理器,他們優(yōu)化和加速圖形跟蹤,并執(zhí)行諸如圖形重新排之類的操作,還有其他像矩陣乘法之類的加速機(jī)器學(xué)習(xí)的蠻力部分。
而內(nèi)存訪問對(duì)于每個(gè)架構(gòu)來說都是一個(gè)特殊的問題,因?yàn)楫?dāng)你構(gòu)建加速器時(shí),最重要的目標(biāo)是讓它盡量長時(shí)間保持滿載,你必須將盡可能多的數(shù)據(jù)傳送到 ALU,讓它盡可能多地吞吐數(shù)據(jù)。
它們有許多共同之處,它們都有本地內(nèi)存,有片上網(wǎng)絡(luò)來進(jìn)行通信,每個(gè)執(zhí)行算法的處理器都在處理一小塊數(shù)據(jù),這些操作都由運(yùn)行在 CPU 上的操作系統(tǒng)調(diào)度。
對(duì)于硬件設(shè)計(jì)人員,棘手之處在于任務(wù)預(yù)測(cè)。盡管在某些層面上會(huì)有類似的操作類型,但人們正在研究不同層面上差異。為了處理神經(jīng)網(wǎng)絡(luò),需要幾種類型的處理能力。這意味著你需要對(duì)神經(jīng)網(wǎng)絡(luò)的一部分進(jìn)行某種方式的處理,然后在另一層又可能需要另一種處理操作,而且數(shù)據(jù)移動(dòng)和數(shù)據(jù)量也是逐層變化的。
你需要為處理管線構(gòu)建一整套不同的加速器,而理解和分析算法并定義優(yōu)化過程,是涉及到完整體系結(jié)構(gòu)的任務(wù)。就像對(duì)于基因組測(cè)序,你可能需要進(jìn)行某些處理,但你不能用單一類型的加速器來加速所有東西。CPU負(fù)責(zé)管理執(zhí)行流水線,對(duì)其進(jìn)行設(shè)置、執(zhí)行 DMA、進(jìn)行決策。
當(dāng)中可能涉及到分區(qū)執(zhí)行的問題。沒有任何一種處理器可以針對(duì)每種任務(wù)進(jìn)行優(yōu)化——FPGA、CPU、GPU、DSP都做不到。芯片設(shè)計(jì)商可以創(chuàng)建一系列包含所有這些處理器的芯片,但客戶應(yīng)用端的難點(diǎn)在于,他們要自己確定系統(tǒng)的各個(gè)部分要在哪些處理器上運(yùn)行,是在 CPU 上?在 FPGA 上?還是在 GPU 上?
但無論如何,里面總是需要有 CPU 的,CPU 要負(fù)責(zé)執(zhí)行程序的不規(guī)則部分,CPU 的通用性有自己的優(yōu)勢(shì)。但反過來,如果是專門的數(shù)據(jù)結(jié)構(gòu)或數(shù)學(xué)運(yùn)算,CPU就不行了。畢竟 CPU 是通用處理器,它沒有針對(duì)任何東西進(jìn)行優(yōu)化,沒有特別擅長的項(xiàng)目。
以前,硬件/軟件邊界由 ISA 定義,并且該內(nèi)存是連續(xù)可尋址的。而涉及到多處理器時(shí),一般內(nèi)存定義也是也是一致的。但是可以想象,在數(shù)據(jù)流引擎中,一致性并不那么重要,因?yàn)閿?shù)據(jù)會(huì)從一個(gè)加速器直接傳到另一個(gè)加速器。
如果你對(duì)數(shù)據(jù)集進(jìn)行分區(qū),那一致性會(huì)成為障礙,你需要對(duì)照和更新數(shù)據(jù),并會(huì)占用額外的運(yùn)算周期。所以我們需要,也必須考慮不同的內(nèi)存結(jié)構(gòu),畢竟可用的內(nèi)存就那么點(diǎn)。或許可以訪問相鄰的內(nèi)存,但也會(huì)很快耗盡,然后無法及時(shí)訪問。所以必須在設(shè)計(jì)中加以理解,而且是要在理解架構(gòu)的情況下去設(shè)計(jì)它。
我們還需要更高級(jí)別的抽象層。有些框架可以將已知網(wǎng)絡(luò)映射或編譯到目標(biāo)硬件上,例如在一組低級(jí)內(nèi)核或 API,它們將在軟件堆棧中使用,并最終由神經(jīng)網(wǎng)絡(luò)的映射器使用。在底層,你可能在用不同類型的硬件,這由你想要實(shí)現(xiàn)的目標(biāo)來決定。反正就是用不同的硬件,不同的 PPA ,實(shí)現(xiàn)了相同的功能。
而這會(huì)給編譯器帶來很大的壓力。主要的問題是你未來要如何對(duì)加速器進(jìn)行編程?你是否搞了個(gè)像初代 GPU 那樣串在一起的硬連線引擎?或者你是否構(gòu)建了具有自己指令集的小型可編程引擎?現(xiàn)在你必須單獨(dú)對(duì)這些東西進(jìn)行編程,并將這些引擎中的每一個(gè)都與數(shù)據(jù)流連接起來,然后執(zhí)行任務(wù)。
一個(gè)處理器擁有整個(gè)指令集的某個(gè)子集,另一個(gè)處理器擁有一個(gè)不同的子集,它們都將共享控制流的某些重疊部分,編譯器得了解它的庫并進(jìn)行映射。
其實(shí)處理器的架構(gòu)并沒有改變,它們?nèi)匀蛔袷剡^去 40 年來一直遵循的規(guī)則。變的是芯片的構(gòu)造方式,它們現(xiàn)在包含大量異構(gòu)處理器,這些芯片根據(jù)各自的任務(wù),對(duì)內(nèi)存和通信進(jìn)行優(yōu)化。每個(gè)芯片都對(duì)處理器性能、優(yōu)化目標(biāo)、所需的數(shù)據(jù)吞吐量以及數(shù)據(jù)流做出了不同的選擇。
每個(gè)硬件供應(yīng)商都希望將自己的芯片與其他芯片區(qū)分開來,品牌推廣比談?wù)搩?nèi)部技術(shù)細(xì)節(jié)要容易得多。廠商給自己的芯片起了“XPU”的名字,并將它與特定類型的應(yīng)用聯(lián)系起來,但“XPU”并不是關(guān)于某個(gè)特定硬件架構(gòu)的名字。
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。