目錄
芯片的概念結構
芯片的派系劃分
通用芯片(CPU,MPU,GPU,DSP)
定制芯片(FPGA,ASIC)
芯片之上的集成(MCU,SOC,ECU)
軟硬件的匹配設計
芯片的概念結構
打個比方,假如芯片是一個“銀行”,這個銀行很小就兩個人。
一個負責撥算盤(計算),其他它都不管。
一個負責記錄文檔(存儲),把“算什么?”(數據)和“咋么算?”(程序)都完整的用文檔記錄下來,方便和撥算盤的人溝通。
他們之間定義了一個溝通方式(一組總線),內容包括了“文檔從哪里取?放回哪里?”(尋址總線)和“文檔具體內容是什么?”(數據總線)兩大部分,換句話說,一組總線包括一個地址總線和一個數據總線。特別注意這里的總線上的“數據”對應著一份文檔,不要和文檔里 “算什么?”的這個數據概念混淆了。
當下芯片結構是復雜的,但簡單劃分就三種概念結構。馮.諾依曼結構,哈弗結構和改進哈弗結構。
馮.諾依曼結構: 客戶把原始的需求文檔(包含輸入數據和程序)交給負責記錄的人后,根據定義的溝通方式,和負責實際計算的人一起反復來回的傳遞文檔(拿程序指令,拿數據,返結果),最后把最終的計算結果通過記錄的人反饋給客戶。上面這種分工思路就是馮.諾依曼結構的核心,關鍵的特點就是客戶只用和一個記錄人員溝通就行,再復雜的需求都可以一股腦的給一個人,剩下的都是他們之間的事。整個過程非常靈活,這也是馮.諾依曼結構的最大優勢。這種結構下程序指令存儲地址和數據存儲地址指向同一存儲器的不同物理位置,因此程序指令和數據的寬度相同。但這種方式效率不高,因為記錄的人每個時刻只能干一件事,要么告訴撥算盤的人咋么算,要么告訴它算什么。
哈弗結構:因此出現了哈佛結構,將程序指令和數據分開存儲,指令和數據可以有不同的數據寬度。采用了獨立的一組程序總線和一組數據總線。這就相當于原來2個人,現在三個人,記錄員分了個工,一個就負責記錄傳遞計算方法(程序),一個人就負責記錄傳遞計算內容(數據)。兩個人和撥算盤的人點對點溝通,但相互之間老死不往來。這種并行化自然提高了效率,原來要至少兩個周期做完的事,一個周期就搞定了。可這種方法讓客戶要同時對應2個毫無聯系的記錄員這非常不友好。且如果需求側重點不同,兩個人的工作量常常不均衡導致浪費,如果由一個人擔當(馮.諾依曼結構),這些問題都不存在。
改進哈弗結構:為了解決這個平衡問題出現了改進哈弗結構。它只有一組總線供程序存儲器和數據存儲器分時共用。原來的哈佛結構需要4條(2組)總線,改進后需要兩條(1組)總線,且保留了兩個獨立并行的存儲器。也就是說,記錄員還是為了效率做了分工,但溝通方式升級,走上了“敏捷之路”。不再是兩兩溝通的老國企做派,把客戶和撥算盤的人也加入進來做了個四方溝通會(分時公用),歸口統一保證了靈活性,同時分時也對并行化影響不大。
芯片的派系劃分
接著我們聊下芯片的分類,梳理分類首先要區分芯片的兩個大類:
通用芯片(CPU, GPU, DSP等)和定制芯片(FPGA, ASIC等),這個大類劃分很重要,兩者有本質上的不同。同樣用銀行做比喻,通用芯片就是“銀行柜員”而定制芯片就是“ATM機”。
通用芯片
通用芯片關鍵是“通用”二字,這意味著其必須具備處理各式各樣千奇百怪的指令要求,并且經常同時存在多個外部設備的請求,它必須擁有隨時中止目前的運算轉而進行其他運算,完成后再從中斷點繼續當前運算的能力。就好比銀行柜員,客戶要辦的業務千奇百怪,時常還來個缺德的插隊罵娘或者站著位置不走撩你兩下的人存在。柜員都要應對。而為了做到這一點通用芯片有復雜的控制取指譯碼流程,Cache內存分級機制(緩和高速CPU與低速內存的臨時指令存儲器),真正的計算單元ALU只占了通用芯片不大的一部分,更多設計是為了靈活性存在的,在計算效率和通用性上的權衡上犧牲前者選擇后者。
當我們在討論芯片結構的時候更多的是在討論通用芯片的結構,是在討論說滿足客戶變化需求的時候,哪種“人員組織形式和溝通方式”是最高效的。
定制芯片
而定制芯片就是完全的另一個概念,雖然它也有結構思想在里面,但是就像你不會去討論一個程序的“人員組織架構”一樣,在這種芯片里根本就沒有時序中斷,取指譯碼這些為了靈活性而設計的概念。相比通用芯片,定制芯片是沒有“人性”的,就是一個ATM機,其給客戶定義了清晰的操作流程,省去了中斷等大量靈活性設計,撩小姐姐的一套對機器人是不成立。
打個比方,比如一個比大小的邏輯用馮諾依曼結構的CPU至少需要幾條指令完成,但用FPGA就根本不用考慮時序周期,只要串聯幾個邏輯單元,在一個周期就搞定了。但如果再增加幾個邏輯,CPU還是在相同邏輯資源下用幾個指令完成,但是FPGA 就需要額外占用另一部分邏輯資源完成計算。再比如FPGA和GPU(GPU是通用芯片)在并行化上有類似的思想,但兩者實際沒有多少可比性,你不會把三個柜員的辦理通道和ATM機理存在在三個恰好并行的流程做比較一樣。還有人在信號處理效率上把DSP和FPGA拿出來對比,我覺得這些零零種種的比較都沒有太大意義。為靈活性存在的“人”(通用芯片),和為效率存在的“機器”(定制芯片)是兩個維度的事情,不要從性能上去強行比較。
從這里我們可以大致看出來,兩者的幾個重要差異。定制芯片是對已經固化的業務進行降本增效,就像銀行用ATM機,代替成本更高的柜員處理一些常規銀行業務。而通用芯片是為了對一些無法或者暫時沒有固化的業務作出的靈活設計。兩者沒有優劣之分。
通用芯片(CPU,MPU,GPU,DSP)
CPU和MPU可以簡單理解為一個概念,只是理解范疇上的區別。
CPU和GPU之間的區別更多的是核的數量。
CPU雖然有多核,但基本不超過兩位數,每個核都有足夠大的緩存和足夠多的數字和邏輯運算單元,并有更復雜的邏輯判斷硬件,就像銀行里常備的3-4個柜臺的柜員,擅長處理客戶很復雜的業務。
而GPU的核數遠超CPU,每個核擁有的緩存大小相對小,數字邏輯運算單元也少而簡單,更像是500多個電話客服柜員,處理一些相對簡單但數量眾多的客戶業務。
DSP(數字信號處理芯片)是一類特殊的CPU,采用了上面說的哈佛結構,且存在專用的硬件算法電路和專門的尋址模式。它具有通用芯片設計的靈活性,但在實時運算過程中很少變化,因此特化了業務流程的性能(記錄和計算過程)。就像是某個辦理“外匯存取”的專業柜臺會部署一些特化的柜員和流程。DSP對于專用信號(視頻編解碼,通訊信號)的處理能力遠遠的優于一般CPU。當然普通柜臺也可以處理展業柜臺的業務,但性價比就很差了,如果需求很多開設專門的柜臺就變得有意義,這些還是和客戶需求有關。用DSP處理專門的信號流常具有執行時間可控,芯片性價比高等優點。
定制芯片(FPGA,ASIC)
講完了通用芯片,定制芯片也有兩個主要方向,FPGA和ASIC。兩者核心的區別就是固化程度。FPGA仍然具有一定的靈活性(但遠遜于通用芯片),而ASIC則是完成固化的設計(也存在和FPGA類似的部分編輯的產品存在)。類似可以編程的ATM機和完全固化的ATM機,兩者區別最大的維度還是成本和功耗。
FPGA最早是從專用集成電路發展而來的半定制化的可編程電路,是高端的CPLD (Complex Programmable Logic Device復雜可編程邏輯器件)。FPGA可以實現一個DSP, GPU甚至是CPU的功能,就像之前說的把柜員業務固化為ATM機操作流程一樣。但不是說FPGA可以代替CPU,這是設計目的上的大方向差異,反復強調。
FPGA是一堆邏輯門,通過硬件描述語言HDL把它轉成電路連接,從最基本的邏輯門層面上連接成電路。雖然看起來像一塊CPU,其實是完全硬件實現的。根據一個固定的模式來處理輸入的數據然后輸出。FPGA片上大部分都是計算單元,沒有控制單元并不代表FPGA不會執行指令,事實上FPGA里控制單元的角色由單元和單元之間可編程邏輯連接線來完成的,通過HDL編程更改每個單元的運算邏輯和單元之間的連接方式,從而使其達到和一般的運行程序差不多的效果。由于省去了CPU的取指和譯碼兩個步驟,FPGA重復運行相同代碼的效率得到了極大的提高,也因此,其無法應對沒有被編程過的指令。
ASIC就是專用IC,沒有明確的定義。可以理解為除了單片機、DSP、FPGA之類的能叫出名的IC,剩下的都是ASIC。ASIC原本就是專門為某一項功能開發的專用集成芯片。后來ASIC發展了一些,稱為半定制專用集成電路,相對來說更接近FPGA,甚至在某些地方,ASIC是個大概念,FPGA屬于ASIC的一部分,也常常被作為ASIC開發的預研。其代表了在需求一定的情況下,對性價比的極致追求。
芯片之上的集成(MCU,SOC,ECU)
在上面我偷偷遺漏了一個概念MCU,原因是其本身不是一種芯片類型而是一種集成方式,SOC芯片也是同樣的道理,兩者的區別是程度上的不同。
在自動駕駛汽車領域MCU更多的是集成了更多的輸入和輸出設備在芯片當中,方便更好的控制,因此叫做微控制器而不是微處理器。而SOC是在更高的層面上將不同的芯片做了進一步的集成,維度更高。如果MCU是一種人員組織最終形成一個公司對外服務,那SOC更像是公司級別的組織形成了一個行業對外服務。
單片機是MCU的通俗說法,經典的51系列就是一堆IO口,后來慢慢的把常用的PWM, AD之類的功能加入了單片機之中。其構成等價于一個帶了更多外設CPU,但側重點是討論其外設的部分。
在PWM,AD等之上繼續發展其外設也就形成了汽車行業熟悉的ECU即電子控制單元,同時泛指汽車上所有電子控制系統,可以是轉向ECU,空調ECU等。
ECU一般由MCU,擴展內存,擴展輸入和輸出(CAN/LIN,AD,PWM等),電源電路和其他一些電子元器件組成,特定功能的ECU還帶有諸如紅外線收發器、脈沖發生器,強弱電隔離等元器件。整塊電路板設計安裝與一個鋁質盒內,通過卡扣或者螺釘方便安裝于車身鈑金上。
在輸入處理電路中,ECU的輸入信號主要有三種形式,模擬信號、數字信號(包括開關信號)、脈沖信號。模擬信號通過A/D轉換為數字信號提供給微處理器。
在輸出電路中,微處理器輸出的信號往往用作控制電磁閥、指示燈、步進電機等執行件。微處理器輸出信號功率小,使用+5v的電壓,汽車上執行機構的電源大多數是蓄電池,需要將微處理器的控制信號通過輸出處理電路處理后(D/A,放大等)再驅動執行機構。
電源電路中,傳統車的ECU一般帶有電池和內置電源電路,以保證微處理器及其接口電路工作在+5v的電壓下。即使蓄電池電壓有較大波動時,也能提供穩定電壓保證系統的正常工作。
一般搭載8位MCU的ECU主要應用于風扇控制、空調控制、雨刷、天窗、門控等較低階的控制功能。
16位MCU主要應用如引擎控制、齒輪與離合器控制等。
32位MCU應用于多媒體信息系統,實時性的安全動力系統以及復雜的X-by-wire等傳動功能。
更復雜的功能就不在MCU或者ECU的討論范圍內了。
隨著自動駕駛的發展,ECU的概念進一步升級,更為流行的說法是域控制器,其無外乎就是把MCU變成了SoC(片上系統),同時集成了更多的外圍設備而已。目前域控制器搭載的主流通用芯片(GPP)多采用SoC的芯片設計方法,通過HDL語言在SoC內由電路集成各種功能芯片。在SoC中各種組件(IP核)采用類似搭積木的方法組合在一起。IP核(諸如典型的ARM內核設計技術)被授權給數百家半導體廠商,做成不同的SoC芯片。還可能集成GPU、編解碼器(DSP)、GPS、WiFi藍牙基帶等一系列功能。
如果看一下高通或者TI的芯片,基本是:
一個ARM核控制整體運算.
一個DSP處理語音編解碼
一個GPU負責圖像運算
一個基帶和天線處理模塊負責通信
以及GPS,安全加密等林林總總的特殊芯片。
過去極端情況下自動駕駛的原型處理器功耗可以高達5000W,不僅昂貴且需要搭載額外的散熱裝置。SoC和ASIC的發展給我們帶來很多啟示,回到我經常提及的貫穿整個自動駕駛系統的靈活性。在新的SoC世界里,你不會從不同的供應商那里組裝物理元件。相反,你從不同的供應商那里組裝IP從而獲得更好的集成度,也因此更容易降低功耗和成本。
軟硬件的匹配設計
大部分自動駕駛算法公司都想定制或自制ASIC/SOC計算平臺,原因還有另一個層面來源于軟硬件的匹配問題。算法的性能與硬件設計往往脫離不開。追求模塊化就要犧牲利用率。要提高利用率就需要軟硬件一體設計。你的算法是用GPU合適還是CPU合適,網絡模型一次用多少內存又同時使用多少MAC,由此來設計芯片。或者說反過來給定一個芯片,我的算法要如何兼容,是否要減少內存訪問次數提高利用率,還是要遷移部分CPU基于規則的算法,改為用GPU基于深度學習來實現。軟硬件一起考慮往往才能充分利用好系統性能。
不同的芯片,不同的算法和需求,往往有最優的組合方式。比如一個經典底層而常用的算法應用,需求是大量的且競爭是激烈的時候,ASIC就是很好的選擇。為了一個簡單功能(比如編解碼)支付一個ARM的授權是愚蠢的。
如果算法非常經典且底層,但仍然有改進的空間和需要適配的不同場景,信號流的處理(手機語音處理)可以直接使用DSP,而更復雜的輸入輸出邏輯算法(比如圖像SIFT特征處理),就可以交給FPGA來做,性能相對于CPU都可以由30-100倍的提升,且成本和耗能更小。
在復雜算法領域相對于CPU,GPU的眾核架構把同樣的指令流并行發送到眾核上,采用不同的輸入數據執行。所以GPU比CPU更適合并行算法,而串行的復雜規則邏輯則更適合CPU處理。更具體的說,如果標量視為零階張量,矢量視為一階張量,矩陣視為二階張量。
CPU對應標量計算,主要是路徑規劃和決策類算法,常用的傳感器融合如卡爾曼濾波算法也多是標量運算。用CPU編寫程序時,更適合通過精益化邏輯來提升性能。
GPU則對應矢量或者說向量計算,包括點云,地圖,深度學習,核心是矩陣運算。用GPU編寫程序時,則更合適利用算法并發處理來提升性能。