寫于2020年7月18日下午
導(dǎo)讀: 1. 高性能計(jì)算單元中央計(jì)算單元,其實(shí)就是一臺(tái)經(jīng)過特殊設(shè)計(jì)的專用計(jì)算機(jī),其中最核心的是主芯片,一般會(huì)采用一顆或多顆高性能的SOC。SOC是System on Chip的縮寫,就是在單塊芯片上集成多個(gè)微處理器、模擬IP核、數(shù)字IP核和存儲(chǔ)器等部件,比如CPU、GPU、DSP、ISP、Codec、NPU、Modem等模塊。 在傳統(tǒng)PC時(shí)代,各個(gè)核心芯片都是以獨(dú)立的方式存在,比如英特爾和AMD的CPU、NVIDIA的GPU等,到了移動(dòng)互聯(lián)網(wǎng)時(shí)代,由于體積功耗方面的要求,主芯片都會(huì)進(jìn)行高度的集成,除了大家熟知的CPU和GPU,通常還包含了音頻、多媒體、顯示、安全、通信、AI計(jì)算等子單元。 這些單元,在一套總線系統(tǒng)的連接下,構(gòu)成了一個(gè)系統(tǒng)。大家所熟知的各種手機(jī)SOC芯片,如蘋果的A系列、高通的驍龍系列、華為的麒麟系列,或者各類的AI SOC芯片,車載領(lǐng)域的各種SOC芯片,都逃不出以上范式。 雖然都是同一范式,但是由于使用的場(chǎng)景不同,各個(gè)芯片的側(cè)重點(diǎn)不太一樣:
上一篇中,為大家介紹了傳統(tǒng)ECU芯片的架構(gòu),其計(jì)算資源相對(duì)有限,結(jié)構(gòu)也比較簡(jiǎn)單,一般NVM和SRAM都集成在了芯片內(nèi)部,大小在KB級(jí)別,處理器一般采用Cortex-M內(nèi)核。高性能的SOC其計(jì)算資源和外設(shè)都更加豐富,一般會(huì)集成多個(gè)Cortex-A內(nèi)核,其存儲(chǔ)單元采用外掛的形式,大小在GB級(jí)別。 一般的應(yīng)用場(chǎng)景中,集成一個(gè)主芯片就能夠滿足計(jì)算資源的需求,但是自動(dòng)駕駛對(duì)算力有著更高的要求,有時(shí)候 于安全的考慮,也需要同時(shí)集成多個(gè)主芯片,其結(jié)構(gòu)一般如下圖所示: 多個(gè)芯片在需要在PCIe Switch的連接下共同組成一個(gè)計(jì)算單元,如果以后發(fā)展成可動(dòng)態(tài)拓展的形式(類似于刀片機(jī)),該結(jié)構(gòu)依然適用,以下是采用兩個(gè)Xavier芯片組成的一個(gè)高性能計(jì)算單元的示意圖: 2. 中央計(jì)算單元上的軟件架構(gòu)高性能計(jì)算單元上是需要運(yùn)行操作系統(tǒng)的,如果完全用裸機(jī)程序去控制,幾乎無(wú)法完成。從下到上,依次可分為以下幾個(gè)部分,硬件驅(qū)動(dòng)層,操作系統(tǒng)內(nèi)核,分布式中間件,并行計(jì)算中間件,應(yīng)用及服務(wù)。 硬件驅(qū)動(dòng)層(BSP)在嵌入式軟件開發(fā)當(dāng)中,軟件工程師經(jīng)常要直接和硬件進(jìn)行交互,但是在高性能計(jì)算單元上,由于有富操作系統(tǒng)的存在,這部分工作一般由BSP工程師完成。 BSP(Board Support Package)板級(jí)支持包,是介于硬件和操作系統(tǒng)中驅(qū)動(dòng)層程序之間的一層,一般認(rèn)為它屬于操作系統(tǒng)一部分,主要是實(shí)現(xiàn)對(duì)操作系統(tǒng)的支持,為上層的驅(qū)動(dòng)程序提供訪問硬件設(shè)備寄存器的函數(shù)包,不同的操作系統(tǒng)對(duì)應(yīng)于不同形式的BSP,盡管實(shí)現(xiàn)的功能一樣,可是寫法和接口定義是完全不同的,BSP的編程過程大多數(shù)是在某一個(gè)成型的BSP模板上進(jìn)行修改,芯片廠商一般會(huì)基于其開發(fā)板,提供一個(gè)可運(yùn)行的軟件基線,開發(fā)廠商基于該基線進(jìn)行修改。 BSP的調(diào)試工作是和硬件強(qiáng)相關(guān)的,目前普遍會(huì)選擇由硬件Tier1做掉這部分工作,由于本身的技術(shù)壁壘不高,所以有余力的玩家選擇自己做也完全不是什么問題。 操作系統(tǒng)內(nèi)核在軟件定義汽車1-3合集中,我對(duì)操作系統(tǒng)的概念做過辨析,為了避免歧義,這里我直接稱操作系統(tǒng)內(nèi)核,很多玩家所謂的做自己的操作系統(tǒng),其實(shí)都只是內(nèi)核之上的中間件。這部分不是主機(jī)廠該做的事情,用QNX、Vxworks、Linux、FreeRTOS等,或者以后的鴻蒙微內(nèi)核即可。雖然這種不直接面向C端用戶的操作系統(tǒng)對(duì)應(yīng)用生態(tài)的要求不高,但是對(duì)于開發(fā)者生態(tài)的要求還是挺高的。使用這些操作系統(tǒng)的時(shí)候,有幾個(gè)因素至關(guān)重要:
POSIX是一個(gè)操作系統(tǒng)的接口標(biāo)準(zhǔn),如果一個(gè)操作系統(tǒng)對(duì)于POSIX兼容性好,那么開源世界中的很多軟件模塊是可以復(fù)用的。舉一個(gè)例子,cocos2dx 是一個(gè)開源的游戲引擎,支持windows、Linux、Mac等系統(tǒng),不支持QNX系統(tǒng),但是由于QNX系統(tǒng)良好的兼容了POSIX,我們只花了很少的功夫就把其移植到了QNX上,雖然cocos2dx依賴了好幾十個(gè)開源的軟件庫(kù),但調(diào)用的都是標(biāo)準(zhǔn)的POSIX接口,所以也都能非常方便的進(jìn)行移植。有些網(wǎng)關(guān)開發(fā)中會(huì)使用FreeRTOS,其也有專門的拓展庫(kù)來(lái)支持POSIX調(diào)用。 舉一個(gè)反面的例子,Halide是一個(gè)專用的圖像處理引擎,其構(gòu)建是基于LLVM編譯器框架的,由于QNX官方支持的編譯器是基于GNU GCC的,我曾經(jīng)嘗試過要把Halide移植到QNX,但是由于編譯器不支持,遷移過程就碰到了很大的困難。所以系統(tǒng)所支持的編譯器框架,也決定了很多最新的開源項(xiàng)目是否能被使用。 傳統(tǒng)主機(jī)廠,不喜歡開源軟件,其中最重要的一個(gè)原因,是其技術(shù)實(shí)力太弱,出了問題自己無(wú)法解決,但是新的科技玩家,會(huì)更加的擁抱開源軟件。 主機(jī)廠自己做軟件,雖然不用去碰內(nèi)核,但是必須有幾個(gè)系統(tǒng)方面的高手,主要是應(yīng)對(duì)系統(tǒng)的穩(wěn)定性問題,這個(gè)對(duì)于安全性較高的控制器尤為重要,軟件進(jìn)度上的問題堆人力可以彌補(bǔ),但涉及到架構(gòu)、性能、穩(wěn)定性、安全等,做這部分工作就不是靠堆人力能解決的。 分布式中間件參考軟件定義汽車1-3,所謂的分布式中間件,就是在實(shí)時(shí)的RTOS內(nèi)核上,基于POSIX的API,構(gòu)建的一個(gè)跨平臺(tái)的操作系統(tǒng)中間件,為上層的應(yīng)用提供良好的計(jì)算、通信的開發(fā)框架,其作用類似于Android的Framework,只不過主要是針對(duì)實(shí)時(shí)、高可靠性應(yīng)用場(chǎng)景的。
這類中間件的平臺(tái),是一個(gè)基礎(chǔ)的工具,各家之間沒必要重復(fù)造輪子,行業(yè)是有一個(gè)adaptive autosar,但是目前還遠(yuǎn)遠(yuǎn)不夠完善,特別是在并行計(jì)算方面。不只是在車載領(lǐng)域,整個(gè)中國(guó)的軟件行業(yè)就沒有一家像樣的中間件公司,和一些投資機(jī)構(gòu)的朋友也聊到了這個(gè)問題,我認(rèn)為最大原因還是這類產(chǎn)品屬于工程產(chǎn)品,客戶都更愿意看到一個(gè)完整的解決方案,而不是給他提供一個(gè)中間件,之前快的節(jié)奏讓大家都只愿意做來(lái)錢快的事情,這些慢活兒也沒有成長(zhǎng)的土壤。 但是在目前的政治環(huán)境之下,這種情況似乎迎來(lái)了一絲改變,一些貿(mào)易沖突,也讓大家意識(shí)到了,老老實(shí)實(shí)打基礎(chǔ)還是挺重要的。中國(guó)汽車行業(yè)最大的問題在于,這些玩家都覺得自己挺牛逼的,誰(shuí)也不買誰(shuí)的單,都想自己搞一套,但是在這個(gè)事情上,真心不是哪一個(gè)能獨(dú)自搞定的。所以我還是建議,大家能夠聯(lián)合起來(lái)做點(diǎn)事情,哪怕是投點(diǎn)錢支持一些創(chuàng)業(yè)公司搞開源,也比自己搞要靠譜。就算是一家主機(jī)廠發(fā)起了一個(gè)開源項(xiàng)目,大概率其他的主機(jī)廠也不會(huì)用,必須以中立的身份來(lái)做,才能獲得大家共同的認(rèn)可。 服務(wù)及應(yīng)用層參考軟件定義汽車1-3, 在一個(gè)標(biāo)準(zhǔn)的基礎(chǔ)軟硬件平臺(tái)之上,各家主機(jī)廠可以構(gòu)建自己的服務(wù)和應(yīng)用體系,這也是各家能夠形成差異化的地方。針對(duì)不同的應(yīng)用場(chǎng)景(智駕、座艙、網(wǎng)關(guān)、車控等),以及各自差異化的硬件設(shè)備,抽象一套屬于自己的服務(wù)體系,SOA只是實(shí)現(xiàn)目的的一種方式,大家可以根據(jù)自己的理解去拆解、分層、分類,然后形成一套自己的SDK體系,以支持產(chǎn)品業(yè)務(wù)的快速迭代。 在此基礎(chǔ)上,我也期待有一天,能在各個(gè)車廠之間形成統(tǒng)一的接口定義的標(biāo)準(zhǔn),那樣一個(gè)應(yīng)用就能夠部署到所有車上,這其實(shí)是在從Tier1的角度看問題,Classic AutoSAR就是在這個(gè)愿景上產(chǎn)生的,對(duì)主機(jī)廠來(lái)說,只要自己所有車型能夠統(tǒng)一,就是一個(gè)偉大的成就了。 3. 并行計(jì)算框架隨著自動(dòng)駕駛與智能座艙的發(fā)展,大量的以視覺為主的傳感器部署到了車上,產(chǎn)生的數(shù)據(jù)需要高算力的計(jì)算單元來(lái)處理,就需要一個(gè)并行計(jì)算的框架來(lái)支撐應(yīng)用程序的開發(fā)與部署。原則上來(lái)講,該框架應(yīng)該屬于上面介紹的分布式計(jì)算框架的一部分,主要是這部分內(nèi)容與傳統(tǒng)的應(yīng)用框架不太一樣,所以拿出來(lái)單獨(dú)講。 目前有各種各樣的AI計(jì)算芯片,但總體上都是CPU+協(xié)處理器的基本構(gòu)型;CPU可以是基于ARM的IP,協(xié)處理可以是GPU、NPU、DSP、FPGA等,這些異構(gòu)的計(jì)算單元,都會(huì)有自己的指令集。CPU擅長(zhǎng)于做邏輯處理,這些并行計(jì)算單元擅長(zhǎng)于做高性能計(jì)算,汽車電子軟件公眾號(hào)之前有文章介紹這幾種計(jì)算單元的差異,有興趣的可以去了解。 大部分SOC都會(huì)采用這種主+從的方式,比如NVIDIA采用是CPU+GPU,高通采用CPU+GPU+ NPU+DSP,TI也采用CPU+GPU+ NPU+DSP,賽靈思采用CPU+FPGA等。 開發(fā)人員寫的程序,雖然都在一個(gè)工程當(dāng)中,但是在編譯階段,通過芯片廠商提供的工具鏈,代碼會(huì)被編譯成為兩個(gè)部分:運(yùn)行在CPU上的,與運(yùn)行在異構(gòu)單元上的,芯片廠商會(huì)提供一個(gè)基礎(chǔ)的通信框架,來(lái)處理這部分邏輯。 在程序運(yùn)行階段,這兩部分程序都會(huì)被加載到內(nèi)存當(dāng)中,由于SOC的總線設(shè)計(jì)當(dāng)中很容易做到內(nèi)存共享,各個(gè)計(jì)算單元會(huì)各自讀取運(yùn)行的指令與參數(shù),通過芯片廠商提供的RPC框架,主程序可以很方便與協(xié)處理器進(jìn)行邏輯通信。 需要注意的是,高性能計(jì)算的并不僅是運(yùn)行CNN網(wǎng)絡(luò),還有其他的很多計(jì)算任務(wù)需要用到并行計(jì)算,并且每種計(jì)算單元的程序開發(fā)模型都不太一樣,如果每部分都需要開發(fā)人員自己去處理,開發(fā)過程會(huì)非常復(fù)雜。 比如NVIDIA提供CUDA庫(kù)來(lái)支持GPU上的并行計(jì)算,在CUDA之上又構(gòu)建了TensorRT來(lái)運(yùn)行神經(jīng)網(wǎng)絡(luò);高通提供的SNPE框架,能夠支持任務(wù)自動(dòng)調(diào)度到CPU、GPU、NPU、DSP之上。當(dāng)前階段,這些框架都是和芯片高度綁定的,目前還沒有一個(gè)通用的框架來(lái)屏蔽所有的差異。 除了底層的運(yùn)行框架不統(tǒng)一之外,上層的應(yīng)用開發(fā)框架也沒有一個(gè)統(tǒng)一標(biāo)準(zhǔn)。比如NVIDIA提供了DRIVE AV平臺(tái),用于支持使用自家芯片進(jìn)行自動(dòng)駕駛應(yīng)用的開發(fā);很多公司基于ROS開發(fā)原型系統(tǒng);也有創(chuàng)業(yè)公司基于ROS2進(jìn)行車規(guī)化改造;還有一些使用Adaptive AutoSAR進(jìn)行開發(fā),但這部分恰好是其短板。 這部分實(shí)現(xiàn)想統(tǒng)一的確有比較大的困難,因?yàn)榕c芯片架構(gòu)強(qiáng)相關(guān),現(xiàn)階段AI芯片的種類五花八門,在硬件構(gòu)型不統(tǒng)一的的狀態(tài)下,只能先選擇芯片,再?zèng)Q定技術(shù)架構(gòu)。 4. 結(jié)語(yǔ)本篇從大的維度上介紹了高性能計(jì)算單元上軟件架構(gòu)的幾個(gè)重要部分,每個(gè)一個(gè)部分其實(shí)都值得繼續(xù)進(jìn)行深入。硬件單元的不同,也會(huì)導(dǎo)致軟件框架的設(shè)計(jì)出現(xiàn)一些特性差異,比如在一個(gè)雙冗余的計(jì)算單元中,除了硬件的fallback設(shè)計(jì),軟件上如何進(jìn)行fallback,可選方案有多種,也不是非此即彼的問題。 此類專業(yè)的問題,沒人給出最佳實(shí)踐,即使是特斯拉也是在不斷的摸索當(dāng)中,解決此類問題,模仿只是一種途徑,正向的去思考,去設(shè)計(jì),也是一種有效途徑。軟件定義汽車社區(qū),慢慢已經(jīng)積累了不少專家,后續(xù)將會(huì)開展一些技術(shù)研討會(huì),也歡迎各位提供問題與素材。 寫于2020年7月18日下午 《軟件定義汽車》專輯 作為一個(gè)技術(shù)的愛好者,搞算法,玩芯片,攢系統(tǒng),并不只是工作,也是自己所追求的很重要的部分。寫這個(gè)系列,是為了梳理這幾年的所學(xué)、所思、所想,從而形成一個(gè)完整的知識(shí)體系,也供大家參考。 作者:leo_huang_ |
|