[技術] 蘋果 M1 的技術突破和優缺點


v站上看到有人貼了知乎這篇文章

覺得了解到滿多的

用自己的翻譯器翻成繁體紀錄一下


https://syuanme.blogspot.com/
翻譯有針對一些專有名詞翻成台灣習慣的用語
https://syuanme.blogspot.com/
原文連結
如何评价苹果最新发布的 M1 芯片?有哪些新的技术突破,在应用层会有哪些不一样?


1、CPU的靈活性和絕對性能之間的矛盾

在評價M1之前,我們先回顧一下傳統的PC架構到了今天存在的幾個問題,然後再看看M1是如何解決這些問題的。

今天的CPU支援數百條指令,單條指令功能涵蓋數據計算、訪存、分支跳轉以及各種特殊功能,很多指令處理的數據非常簡單,可能僅僅只處理一個暫存器的數據——今天的主流CPU基本都是64位,不少指令甚至只處理64位暫存器中的若干位甚至1位。

然而以今天CPU的架構,執行這些很簡單的指令都需要完整的經歷一遍整個流水線:指令抓取、數據抓取、譯碼、分支預測、指令重排(亂序執行)、調度、發射、執行、數據回寫等,即便是流水線較短的ARM CPU,也需要經歷十級以上的流水階段,在流水線較長的x86上,需要經歷近二十級流水。這樣帶來的問題是,對於批量數據的處理,每條指令的處理都需要大量的晶體管參與工作,消耗的功耗太高,結果就是有限的功耗不得不分配到大量與計算無關的各級流水線階段上[1]。

最常見的整數運算,執行單元只消耗了6%功耗。 不算快取,也只佔用了11%不到。

現代CPU為了解決這個問題,目前採用的方案是兩個:指令組合和SIMD指令(Single Instruction Multi Data,單指令多數據,一條指令處理多個數據)。指令組合就是把一些常見的計算直接用硬體電路固化下來,假設某個演算法,原來需要執行50條指令,固化下來後只需要執行一條指令,除了執行以外的其它流水線階段,消耗的功耗只有原來的1/50。例如最早的x86 CPU是沒有浮點運算單元的,用整數單元實現浮點運算需要很多條指令組合運行,對於一些浮點計算頻率很高的應用,可以用額外的FPU(Floating Point Unit,浮點處理器,也就是x87)來大幅提高浮點運算性能。從486開始,部分型號直接集成FPU單元,從奔騰開始,FPU作為CPU的一個執行單元,浮點運算指令和其它傳統x86指令一起經過流水線處理。至於SIMD,原來一條指令處理只能處理一組數據(1-3個操作數),現在用一條指令處理多組數據,同樣可以節省流水線其它階段的功耗。從最早的64bit MMX,到今天512bit的AVX512,SIMD指令的絕對性能提升幅度是非常大的,而且可以有效的把CPU功耗分配給計算單元,能效比大幅提升。

重浮點應用,執行單元佔用了75%功耗。

然而CPU上即便是512bit的SIMD指令,和GPU常見的32bit×32執行緒=1024bit的SIMD相比還是太窄了。解碼、分支預測、亂序機制的存在,使得CPU的流水線遠比GPU複雜;為了高頻率不得不採用更多級別的流水線也比GPU長得多,因此,CPU的能效比遠低於GPU。至於通用性比GPU更差的各種專用單元,例如DSP、NPU、影片編碼/解碼、加密解密等等,能效比就更高了。

低能效比帶來的結果,就是在功耗相同的前提下,CPU的絕對性能遠低於GPU以及各種專用晶片。這是CPU保證靈活性所不得不付出的代價。


2、記憶體性能的限制

記憶體性能可以簡單分為延遲時間和頻寬兩個方面。延遲時間就不詳細說了,即便延遲比較低的Intel CPU搭配高頻率低延遲記憶體,訪問記憶體延遲也要超過40ns。對於4 GHz的CPU來說,一次快取命中失敗需要訪問記憶體的話,40ns就是160個時鐘周期。要是獨立IO Die的Zen2 Matisse,最高延遲可能超過90ns,360個時鐘周期。

頻寬方面,即便能效比不高,今天CPU的理論性能還是非常強悍的。超流水線+兩個執行單元,256bit SIMD指令,支援FMA指令(Fused Multiply-Add,加乘融合,例如A=A+B×C),四個物理核心的CPU,工作頻率2 GHz時,全速吞吐時每秒鐘可以執行256÷32×2×2×4×2=256 GFLOPS的單精度浮點運算。FMA是三操作數指令,不算指令本身,數據頻寬需要256×3×2×4×2=12,288 Gbit/s=1536 GB/s。而作為對比,主流桌面的雙通道DDR4 3200記憶體,能提供的頻寬只有64×3200×2=409,600 Mbit=51.2 GB/s,只能滿足3.33%的數據頻寬要求。這還是4核,2 GHz的低端CPU而已,現在主流桌面CPU的最高規格是16核,基本頻率3.4 GHz的AMD R9-5950X,但也同樣只支援雙通道DDR4記憶體,如果還是DDR4 3200的話,只能滿足0.5%不到的頻寬需求。

PS:對於CPU來說,幾乎不可能出現一直全速吞吐FMA指令的場景,除了一些特殊的測試程式外,對數據不僅僅是進行一步加乘運算那麼簡單,一個正常的程式或多或少需要混入其它指令,處理越複雜,數據重複使用率越高,對記憶體頻寬要求就越低。此外,高級語言中往往隱含有大量的函數調用、系統調用,編譯後都會產生數量非常多的傳統指令——例如用C語言寫一個最簡單的Hello word程式,即便採用靜態編譯,也會產生上萬條指令;如果用默認的動態鏈接編譯,可能會產生超過十萬條指令。這些指令更多的是各種記憶體操作、分支跳轉等,對頻寬需求低很多。加上因為各種跳轉導致的分支預測失敗、快取命中失敗,實際應用中往往是記憶體的延遲時間比頻寬更重要一點,只有一些重計算的高性能計算和科學計算會經常碰到記憶體頻寬瓶頸。

換成絕對性能更高,使用情景更偏向於大批量數據處理的GPU,對顯示記憶體頻寬的渴求則是更高。以nVIDIA上一代甜點級的2060非Super為例,1920個FP32單元,支援FMA運算,基本頻率960 MHz,單精度浮點性能1920×2×0.96=3686.4 GFLOPS;頻寬需求32×3×1920×0.96=176,947.2 Gbps=22,118.4 GB/s。而2060的顯示記憶體規格是192bit GDDR6 14 Gbps,頻寬336 GB/s,六倍於CPU的51.2 GB/s,但因為性能的提升幅度更大,只能滿足1.52%的理論頻寬需求。

為了緩解記憶體頻寬限制,降低記憶體訪問延遲,現代CPU往往使用大容量快取。例如在我的筆記型電腦上,AIDA64的測試程式跑出來是這麼個結果,三級快取和記憶體相比,大概是8倍的頻寬,1/5的延遲。


只是這也是要付出代價的——大容量快取本身,以及CPU各核心與快取聯通的內部互聯匯流排會消耗大量的電晶體,加上CPU的其它模塊如記憶體控制器、PCIe控制器、多路CPU互聯的QPI/UPI控制器等,統稱為非處理器核心部分(Uncore),會消耗掉大量的電晶體。這個隨便看一張CPU的Die Shot就能理解了,例如十核心的i9-10900K,就算去掉內顯,整個Die上除了CPU內核佔用的面積外還有相當多的Die面積用於實現L3、Ringbus和SA。而每個內核裡面,其實也有相當部分的面積用於實現L2和L1。



3、匯流排介面的限制

現代PC上,除了部分CPU本身自帶內顯,還有相當部分的CPU是不含內顯,或者即使CPU有內顯也因為性能不足需要另外配置獨立顯示卡的。CPU、記憶體控制器通過PCIe匯流排和獨立顯示卡連接,頻寬和記憶體相比差很多。現在最新的PCIe 4.0 x16介面,單通道速率16 GT/s,128b/130b編碼,x16理論頻寬是16×128÷130×16=252 Gbps=31.5 GB/s,只有雙通道DDR4 3200頻寬51.2 GB/s的61.5%。而前面提到,GPU對顯示記憶體頻寬是非常渴求的,2060的顯示記憶體頻寬就需要336 GB/s,PCIe 4.0 x16的頻寬只有顯示記憶體頻寬的10%不到。如果是性能更強的3080/3090這樣的顯示卡,需要的顯示記憶體頻寬就更高了。

因此,獨立顯示卡往往都需要配置高速的GDDR顯示記憶體使用,代價有兩個方面:一方面是成本增加,除了顯示記憶體晶片本身以外,GPU需要另外實現顯示記憶體控制器,顯示卡需要相應的供電部分給顯示記憶體供電;另一方面則是不得不在系統記憶體和顯示記憶體之間複製、傳輸大量數據,拖慢了系統的整體性能。

PC的問題說完了,接下來,看看Apple Silicon的M1是怎麼處理這些問題的:


多種相對獨立的專用處理單元

在M1上,除了大家耳熟能詳的CPU核心、GPU、NE,以及其它現代CPU常見的記憶體控制器、IO控制器等模組外,還有大量其它Apple認為會經常用到的專用單元,如影像處理、影片編解碼、音頻處理、加密解密等。這些專用單元的共同點都是經常需要批量處理大量的數據,使用專用電路處理而不經過CPU流水線,可以最大化能耗比。CPU只需要根據指令調用對應的處理單元,對指定記憶體範圍中的數據進行計算就可以了。

M1上的多種專用處理單元


統一的片上封裝記憶體

Apple介紹M1的時候,展示了這兩張圖來說明M1的統一記憶體架構:

同一基板上封裝的兩顆記憶體顆粒

統一記憶體架構示意圖。

可以看到,M1的基板上封裝有兩顆DRAM顆粒,CPU、GPU、NE以及其它未列出的單元通過統一的Fabric匯流排,和兩顆DRAM顆粒、Cache連接。

M1的記憶體具體什麼情況還不清楚,是高頻率的LPDDR4X,還是高頻寬的HBM2?發布會似乎沒有提及,只能等基於M1的三款Mac上市後的進一步確切消息了。不過從圖上看,雙顆粒應該是雙通道的。另外,基板封裝比傳統的插槽安裝或者PCB焊接,距離短很多,從而可以大幅降低傳輸數據消耗的功耗低。Intel介紹Foveros/EMIB技術的時候展示過這麼張圖,中間的同基板封裝比左邊的PCB焊接,數據傳輸功耗從20 pJ/bit降低到 < 1 bit。

同基板封裝傳輸功耗只有板載1/20不到

即便M1還是採用雙通道LPDDR4X,但既然已經是基板封裝了,將來的後續型號換用類似EMIB技術的HBM2記憶體完全是可能的。單顆四層堆疊的HBM2記憶體顆粒,可以提供1024bit位寬,2 GT/s傳輸頻率下可以提供2 Tbps=256 GB/s頻寬,是單通道DDR4 3200的10倍,即便將來採用更高規格的GPU,更多核心的CPU,更多或者性能更強的其它專用單元,也可以有效緩解記憶體頻寬需求。另一方面,統一的Cache,也可以一定程度上節約記憶體頻寬、降低訪存延遲。

此外,統一的記憶體和快取,可以讓CPU、GPU、NE以及其它單元共享記憶體頻寬和數據,無需再單獨為GPU配備獨立的顯示記憶體。不過這個基本所有的SoC都是如此,但蘋果的優勢在於:


自主的作業系統對統一記憶體架構的優化

按照蘋果的說法,macOS big Sur對各種單元使用到的數據採用統一格式,例如GPU、影片解碼、顯示單元等。因此各種不同的專用單元完全可以直接使用其它單元產生的數據,無需進行拷貝或者轉換。這對於其它SoC廠家,往往需要運行多種作業系統,或者某個作業系統的多個版本,甚至盡全力去兼容更多的其它作業系統是不一樣的。

此外,蘋果一向以來強大得讓眾多開發者吐槽不已的生態統治能力,可以保證mac上的應用幾乎都只能用蘋果自己提供的編譯器來開發,使用蘋果統一提供的各種API和框架,有助於應用程式更好的發揮統一記憶體架構的這個優勢。

而PC上,作業系統、開發工具要兼顧市場上的保有硬體,硬體廠商想兼容更多系統,很難去推動類似的變化。如果還是傳統的CPU、GPU各管一套,即便是SoC也是統一記憶體,數據該拷貝還得拷貝,該轉換還得轉換,SoC的優勢完全發揮不出來,還會因為不同單元各用一套數據不得不爭搶記憶體頻寬反而拖慢性能。不管是Intel的Tiger Lake,還是AMD的Renoir,GPU性能其實都還算不錯,因為記憶體瓶頸影響性能的情況很常見,實際表現往往不如有專用顯示記憶體的同級別獨立顯示卡。


最後,說一下M1 SoC的缺點

專用單元性能強能耗比高,但不靈活。固化的演算法無法再改動,如果業界對某種處理使用了新的演算法,要麼換支援新演算法的CPU,要麼還是用CPU核心處理——性能低能耗高,不過以M1的超寬架構帶來的強悍IPC,大概率也不會比別家差就是了。

統一記憶體架構。片上封裝的記憶體無法擴展,對於某些需要使用大容量記憶體的用戶是個噩夢。從目前蘋果官網公開的三款使用了M1的Mac的技術參數來看,都是8G統一記憶體,最高可以擴展到16G。我不知道這個16G是另一個SKU的M1(我猜大概率如此),還是可以板載另外的記憶體顆粒來擴展容量(這樣做的話M1的記憶體控制器功耗會明顯提升)。但不管哪種方案,最大16G記憶體,對相當一部分用戶來說是捉襟見肘的。

https://syuanme.blogspot.com/
參考
1. [PDF]Race to Exascale: Opportunities and Challenges
https://www.microarch.org/micro44/files/Micro%20Keynote%20Final%20-%20Avinash%20Sodani.pdf

https://syuanme.blogspot.com/

留言

張貼留言

熱門文章