之前看到 M1 晶片出來之後,就想說些什麼,結果光寫 x86 和 ARM 就寫了 4000 多字,考慮到文章篇幅,只得分為上下兩篇,上一篇文章發出後有很多人表示非常喜歡,讓我趕緊更新,在這裡向支持我的讀者們表示感謝 🙏。
那麼話不多說,這篇我們來聊一聊,這次的晶片到底有何不同,以至於讓那麼多人說蘋果不講武德。
在這之前我先說明,我只是一個計算機專業的學生,從來就沒有自詡自己是什麼專家學者,我寫博客也只是為了做一些簡單的科普,把自己知道的一些知識分享給大家。如果文章中有什麼錯誤的地方,還請各位讀者指正。
2. M1 晶片 ≠ CPU首先,我們要先擺脫一個認知誤區,M1 晶片不是一塊 CPU,而是一塊專為 Mac 設計的 SoC 晶片。CPU 只是 M1 晶片的一個組成部分。
所謂 SoC 晶片,指的是系統級晶片(System on Chip),也稱片上晶片,是一個將電腦或其他電子系統集成到單一晶片的集成電路。SoC 集成的主要包括處理器(CPU,GPU 等)、基帶、各種接口控制模塊、各種互聯總線等,其典型代表為手機晶片。舉個例子,CPU 公司將自己的所生產的 CPU 設計賣給其他公司,而其他公司就根據該 CPU 自己添加上所需要的各種外設控制器,這就是 SoC。
所以簡單來說:SoC 就是一塊集成了 CPU、GPU 等多種結構的晶片。因此,千萬不要簡單的認為 M1 晶片就是 CPU。
官網有一張圖,就很好地說明了 M1 晶片的組成成分。如下圖所示,蘋果稱其為統一內存架構(Unified memory architechture),即通過 Fabric 高速總線將中央處理器、圖形處理器、神經網絡引擎、緩存、DRAM 內存全部連接在一起。因此,M1 晶片的強大,絕不是靠一個強悍的 CPU 支撐的,而是眾多性能強大的部件結合蘋果優秀的設計共同努力的成果。
3. 統一內存架構(UMA)通過上一段內容,我們知道了 M1 晶片的強大光靠一顆強大的 CPU 是不夠的,畢竟蘋果也沒辦法突破物理定律,單純通過設計讓 CPU 的性能提升數倍。很明顯蘋果採用了其他的技巧來彎道超車,而「統一內存架構」就是其中之一。
我們知道,處理器在處理任務時,他要做的事情很簡單就是取東西和算東西,也就是上一篇文章中提到的「接收指令+運算數據」。
和上篇文章一樣,我們還是以打工人為例,取東西就是打工人搬磚,算東西就是打工人砌磚,你砌磚砌得再快再好,磚搬的慢,砌磚的速度也不會快。反過來也是,如果砌磚的慢,搬磚的塊,就會有磚堆積。
因此理想狀態下,搬磚的速度和砌磚的速度應該是一致的,這樣就不用等對方。對於 CPU 來說也是同樣的道理,如果雙方的速度不一致,就會造成性能浪費。
因此,為了解決上述問題,蘋果提供了一個解決方案,就是統一內存架構。
3.1 UMA 做了什麼?那麼 UMA 到底做了什麼?
我們電腦裡面有很多 PU(Processing Unit),即處理單元(處理器),我們常見的有 CPU(Central Processing Unit,即中央處理器)、GPU(Graphics Processing Unit,即圖形處理器)和 NPU(Neural network Processing Unit,神經網絡處理器)。他們都需要取東西、算東西,但是在 UMA 出現之前,他們只能通過 CPU 來分配東西,而 CPU 還要事先從內存中取數據。顯然,這種工作方式的效率很低,況且,不同的處理器對於數據的運算速度也是不同的,為了做到時序同步,一定程度上不利於硬體性能的發揮。
而且,每個處理單元作為一個獨立的個體,各自處理的數據包格式也不一樣。不同 PU 之間通信的語言都是不一樣的,統一數據格式時也需要消耗時間,如果這樣通信效率還高那才有問題。就像來自不同國家的打工人一起打工時,都說各自的語言,通過翻譯才能進行溝通,這聽起來效率就很低。
當然了,以上只是簡單的舉一些例子,真實情況肯定是比這更加複雜的,但即使是這樣,我們也能感受到有很多本來不應該存在的步驟耽誤了很多時間。所以,為了解決上述這些問題,蘋果給出了幾個解決方案。
3.1.1 PU 直接訪問內存沒有 UMA 之前,需要先將數據從內存中取出,然後由 CPU 優先處理、分配,如下圖所示 👇
有了 UMA 之後,這些處理單元可以直接訪問內存,再也不需要通過 CPU 去獲取一些數據了,如下圖所示 👇
通過這樣的設計方式,這個 PU 們不需要再和 CPU 同步語速,也不用什麼亂七八糟的事情都先去找 CPU 過問一遍,這樣就省下來一大筆時間了。
3.1.2 Apple-designed package雖然解決了取數據時的時序問題,但是各處理單元的通信問題仍然沒有得到解決,這裡就要提到蘋果所做的另一個解決方案了——Apple-designed package。
通過 Apple-designed package,各單元處理數據時的數據包格式統一了,他們之間的溝通不再需要翻譯了,哪怕都說的是「阿巴阿巴阿巴」也都能明白各自說的是什麼了,這就又省下了一部分時間。
3.1.3 高度集成無論是拆解圖還是實例圖,都說明蘋果這次的高度集成,是直接將內存放到了處理器的旁邊,這極大的縮小了內存和處理器之間的物理距離,取數據的速度自然就會更快了。
千萬別小看了這點物理距離的減少,目前的計算機都屬於馮諾依曼結構,而該結構最大的一個隱患就是:在內存容量指數級提升以後,CPU 和內存之間的數據傳輸帶寬成為了瓶頸,原因之一就在於內存和 CPU 的物理距離過大。雖然現在 CPU 和內存的速度越做越快,但是他們之間的距離卻無法改變,而傳輸數據的速率-光速也無法改變。
我們可以來做一個簡單的數學題,i9-7980XE 是一顆 18 核 36 線程的民用 CPU,這顆 CPU 最大睿頻 4.4GHz,假設該 CPU 在一個時鐘周期內執行一條運算指令,那麼該 CPU 執行一個指令需要的時間是 0.000000000227273 秒,即 0.22ns(納秒),那麼在這段時間內,光所跑的距離是 0.0681819 米,四捨五入就約等於 7 釐米。所以說如果 CPU 和內存之間的距離超過 7 釐米,CPU 豈不是要多等一會才能繼續收到指令了。這還是一次只取一條指令的情況,如果數量多了呢?
所以物理距離的縮小,自然可以讓 CPU 取數據的速度更快一些,這也是 M1 晶片性能提升的關鍵一點。
3.2 超大緩存上面說的這些也都只是讓 CPU 取數據時可以更快一些,但是 CPU 和內存之間的數據傳輸帶寬成為瓶頸不單單是因為物理距離的原因,最根本的原因還是因為 CPU 太快了,很難做到和內存同步。所以我們得把計算機經常用到的數據導入 cache,也就是緩存,避免計算機去內存要東西,更不應該讓計算機去硬碟要東西。
3.2.1 什麼是緩存緩存就是數據交換的緩衝區(稱作 Cache),是存貯數據(使用頻繁的數據)的臨時地方。其實在很多地方都用到了緩存,比如當用戶查詢數據,首先在緩存中尋找,如果找到了則直接執行。如果找不到,則去資料庫中查找。
CPU 也同樣設計了一個這樣的存在,是一個用於減少處理器訪問內存所需平均時間的部件。他的工作原理是:當處理器發出內存訪問請求時,會先查看緩存內是否有請求數據。如果存在(命中),則不經訪問內存直接返回該數據;如果不存在(失效),則要先把內存中的相應數據載入緩存,再將其返回處理器。
還是拿搬磚這個例子來加深理解,如果我正在砌磚,就算搬磚的人把磚搬過來了,我也來不及砌,光讓他在那站著等也不好,所以就讓他把磚放到腳邊(緩存),這個砌磚的每次就不用跑去搬磚的那裡拿磚了,只需要從腳邊(緩存)拿磚就好了。
所以,我們知道緩存主要是為了彌補 CPU 和內存之間的讀寫速度差異而出現的,因此理論上,在一定範圍內,緩存自然是越大越好。
3.2.2 M1 晶片的緩存設計M1 晶片同樣也是這麼設計的,只是蘋果為 M1 晶片帶了超大的緩存,這個緩存有多大呢,我們來做個簡單的比較。(以下數據摘自維基百科和 CPU - Z)
L1 表示一級緩存,L2 表示二級緩存,即一級緩存的緩存。一級緩存還分為一級數據緩存(Data Cache,D-Cache,L1d)和一級指令緩存(Instruction Cache,I-Cache,L1i),分別用於存放數據及執行數據的指令解碼,兩者可同時被 CPU 訪問,減少了 CPU 多核心、多線程爭用緩存造成的衝突,提高了處理器的效能。一般 CPU 的 L1i 和 L1d 具備相同的容量。
這個對比結果非常明顯,尤其是在二級緩存,雖然在 M1 晶片中,二級緩存是共享的,但這 16MB 的緩存還是比 i9-10900K 的二級緩存大了不少。雖然 i9-10900K 的三級緩存有 20MB,但是也只是比 M1 的二級緩存大了 4MB,並且三級緩存的速度是比二級緩存慢得多的。
而且,可別忘了,基於蘋果這次的高度集成,DRAM 內存和處理器直接通過 Fabric 高速總線連接在一起,這樣使得集成的內存可以近似看做是一個超大容量的 L3 緩存,蘋果用犧牲擴展性換取吞吐量的策略,給 M1 晶片帶來了更高的帶寬與更低的延遲。當然了,緩存也並不是越大越好,一方面是製作的難度,另一方面緩存命中率也是評價緩存性能的一個重要指標。如果緩存過大,命中率就會下降,如果這樣就會有些得不償失了。
其實 M1 晶片之所以可以塞入這麼大的緩存,和其製作工藝是有很大的關係的,相較於 10nm、14nm,M1 晶片採用臺積電最先進的 5nm 工藝製成,電晶體越小,單位面積內可塞入電晶體的數量就更多,這樣就讓蘋果可以為 M1 晶片設計更大的緩存。這一部分具體我們下一節來說。
現在再回過頭看我們一開始所說的:「所謂統一內存架構,就是通過 Fabric 高速總線將中央處理器、圖形處理器、神經網絡引擎、緩存、DRAM 內存全部連接在一起。」這不僅僅是簡單的將各單元連接在一起,而是蘋果這麼多年在移動端 SoC 優秀實踐經驗的結晶,是只屬於蘋果自己獨享的 moment。
所以說,這麼一套搞下來,哪怕 M1 晶片的 CPU 晶片的物理性能沒有得到提升,性能也不是最強大的,但 UMA 的設計架構也會給 M1 晶片帶來綜合性能的提升。
況且,誰說 M1 晶片的 CPU 就不行了呢?
4. 製程&電晶體數量Apple 官網對於 M1 晶片有如下的介紹:
M1 也是 Apple 首款採用先進 5 納米製程打造的個人電腦晶片,封裝了驚人的 160 億個電晶體,其數量為 Apple 所有晶片之最。
這裡我將兩個重要的數字加粗標註了出來,第一個數字是剛才提到的 5 納米製程,第二個數字是 160 億個電晶體。
4.1 5 納米製程指的是什麼?當我們閱讀一個和晶片有關的文章時,經常會看到諸如 5nm、7nm、14nm 這些詞,例如華為的「最後一款」麒麟晶片,麒麟 9000 就是 5nm 工藝製程,那麼這個 5nm 指的到底是什麼呢?
說實話,這一塊內容水太深了,我自己也不是從事半導體領域的,很難解釋清楚,這裡就只能簡單的說明一下。
引用知乎的一張圖,在上圖所示的電晶體結構中,電流從 Source(源極)流入 Drain(漏級),Gate(柵極)相當於閘門,主要負責控制兩端源極和漏級的通斷。電流會損耗,而柵極的寬度則決定了電流通過時的損耗,表現出來就是手機常見的發熱和功耗。寬度越窄,功耗越低。而柵極的最小寬度(柵長),就是 XX nm 工藝中的數值。
簡單來說就是,Leakage Path 越小,電流損耗越小,總體來看就是功耗越小。宏觀來看,隨著 Leakage Path 越小,電晶體之間的距離就越小,單位面積內可以塞入的電晶體數量就越多,整體的運算性能就越強。
最近,AMD 瘋狂 yes 的原因和其工藝製程的提升有很大關係,而此次 M1 晶片所採用的是目前市面上最先進的 5nm 工藝製程,性能強也是意料之中的事情了。
4.2 為什麼電晶體數量越多,運算性能越強?電晶體就可以看成一個小開關,有通斷兩種狀態。你可以理解為通是 1,斷是 0,那麼一個電晶體的一次開,或者一次關,就提供一個 2 位的數據:0 或者 1。用無數個 0 或者 1 就可以代表所有的數據。這也就是為什麼電子時代信息被稱為數位化。其實就是把所有的信息用數字來表示。而數字,可以用電腦來處理。電腦是沒法直接處理人類的信息的。這就是計算機採用二進位表示數據的的原因。
所以我們要理解,是因為電路的這個特性才讓先輩們選擇二進位作為機器的語言,而不是因為二進位簡單所以採用二進位的。這裡提兩個小問題:人為什麼要使用十進位?生活中有沒有使用其他進位計數的例子?歡迎在評論區留下你的想法。
一個電晶體一次只能表示一個 0,或者 1。那麼一大堆電晶體同時工作呢?
簡單的說就像是一個大的存放開關的工廠,每個電晶體就是一個開關,關的時候表示 0,開的時候表示 1,電晶體越多,開關也越多,在處理同一個問題的時候走的線路也就越多。這就像是你以前學初中物理時的並聯電路,支路越多流通的線路也越多。同樣,CPU 的電晶體越多,單位時間內可以流過的電流的支路也就越多,反映在宏觀上就是你在一顆 CPU 上能同時處理的數據也就越多,機器也就越快。
不過電晶體越多晶片性能越好這一點並不是絕對的,只是相對來說,電晶體多了之後,可設計的空間就更大了,剩下的就要看廠商能否利用好這部分設計空間了。
5. M1 真的完美嗎?那麼問題來了?說了這麼多 M1 晶片的優點,又是採用了 UMA 架構,又是最先進的工藝製程,他是一個完美的晶片嗎?我想未必。
5.1 擴展性相比上面的介紹讓你對 M1 晶片的統一內存架構有了一定了解,也知道這樣的架構對於性能的提升有很大的幫助。
只是將內存這樣焊死在一塊 SoC 晶片上,對於後期想要硬體擴展的用戶來說,無疑是不可能的。
而且雖然 M1 的 GPU 的性能很強,但也是相對手機上的 GPU 來說的,和桌面級的 GPU 相比還是有很大的差距的,畢竟體積擺在那了,這對外接顯示器或者玩遊戲的用戶來說也是很難熬的。同樣的,外接顯卡也是用不了的,不過應該也不會有人用 Mac 玩遊戲吧。
Mac 當然可以玩遊戲,這裡挖個坑,下次我們來窺探一下未來——雲遊戲。
5.2 兼容性從 x86 架構遷移到 ARM 架構,蘋果是下了很大決心的,也是布局已久了。為了不讓用戶擔心應用生態會出現較大的變化,蘋果給出了三種不同應用的解決方案,分別是「Universal 通用應用」、「Rosetta 2 轉譯應用」以及「原生 ARM 應用」。其中,Universal 是橫跨 ARM 和 X86 平臺的應用,目前以後部分開發者將自家軟體轉向 Universal,例如 Adobe 的 Lightroom,Photoshop 則會在明年更新。這裡不得不感慨一下蘋果的號召力,apple silicon 一出,各大廠商都在快速跟進,估計隔壁某廠要羨慕哭了。
如果新應用沒有適配 Universal,那你也可以通過 Rosetta 2 轉譯應用,那些原生的 X86 編譯應用可以通過蘋果提供的 Rosetta 工具,轉譯成可以在 ARM 平臺直接運行的應用,雖然會損失一些性能,但是可以極大提升兼容性。目前從各種兼容性測試視頻來看,Rosetta 2 的完成度非常高,並不像隔壁某廠,推出的是一個半成品。
如果說,上面兩種解決方案還是無法滿足你的需求,那麼你還可以依託蘋果建成依舊的 App Store 生態,直接運行原生 ARM 應用,它們能夠直接在 macOS、iOS 和 iPadOS 上運行,相當於蘋果打通了小屏到大屏的主要設備。
即便曾經 macOS 的軟體生態還不完善,但在 iOS 幾乎已經沒有了這個問題,也使得搭載 M1 晶片的 Mac 產品並不需要太過擔心沒有足夠的應用可以使用。
而且,從此次更新的 macOS Big Sur 也可以看出,蘋果也是有意讓這三端的風格更加統一。無論是系統界面還是圖標樣式,都在往 iPad 和 iPhone 上統一。
那麼為什麼同樣的軟體在遷移的時候會有兼容性的問題?這已經和本文要介紹的 M1 沒什麼關係了,考慮到篇幅問題,我們之後再說。
那麼到底 M1 版 MacBook 能兼容什麼軟體、不能兼容什麼軟體?
一個個軟體測試,工程量非常大,而且軟體們也處於不停的更新換代中。好在 GitHub 上出現了一個關於 M1 版 MacBook 的兼容性測試項目「DoseitARM」。在這個項目中,可以看到開發工具、影音工具、圖形圖像工具、剪輯工具等各種生產力軟體的兼容性測試。各類軟體的兼容性又被分為幾種不同的情況,分別如下:
他的地址是 👉:https://github.com/ThatGuySam/doesitarm
有興趣的讀者可以長期關注該項目。
6. 最後對於財大氣粗的蘋果來說,未來無疑將會長期進行大量的投入來對 M 系列晶片進行迭代,並且其自有生態也保證了能夠反哺 M 系列晶片的研發。希望國內的企業也可以像蘋果一樣有屬於自己的晶片,未來值得期待!
看完三件事如果你覺得本文對你有幫助,我想請你幫個忙:
轉發本文,點讚或者點個「在看」,是對我最大的認可和支持;關注公眾號「技術漫談」,訂閱更多精彩內容,獲取更多學習資料;公眾號後臺回復「加群」,加入算法和技術交流群,與更多讀者交流。