編註:本文原文發表於 Howard Oakley 博士的個人博客,文章的翻譯、注釋以及發布均已得到作者同意。為了補充一些細節以及便於普通讀者理解,本文對原文有一定程度的修改。
1984 年 1 月,Apple 開始設計、開發和銷售個人電腦系列產品 Macintosh。在這近 40 年時間裡,Apple 濃墨重彩地書寫了許多科技史上的里程碑,其中就包括了三個非常重要的時間點——1994 年從摩托羅拉 68000 架構遷移至 PowerPC 平台、 2005 年從 PowerPC 平台遷移至英特爾 x86 平台、2020 年從英特爾 x86 平台遷移至 Apple Silicon。
2020 年 11 月 11 日 Apple 在加州 Cupertino 正式發布了 M1 芯片,不僅是 Apple 自己首款基於 ARM 架構的用於個人電腦的自研處理器,而且其強大的性能也讓當時苦「牙膏廠」久已的 Geeker 們也感到異常亢奮。
不過,看得見的風光總是與看不到的努力分不開的。作為專為 Mac 設計、優化的芯片,系統到底是怎麼將程序調度在 M 系列處理器上的。
Howard Oakley博士目前是一名 Mac 軟件的開發者,同時也是網站 Eclectic Light Company 的創始人。他與 Mac 的緣分始於他對 Macintosh SE 和 Macintosh Programmer's Workshop 的一見鍾情,從此他沉溺於其中、不可自拔直至今日。
在以前的 Intel 處理器款的 Mac 中,Intel 處理器所有的核心都是相同的,因此這種處理器是對稱多處理(Symmetric multiprocessing,縮寫為 SMP)構架。系統要做的事情其實很簡單,保持每一個核心的負載大體相近即可。
在 Intel 處理器款的 Mac 上打開「活動監視器」的 CPU 歷史窗口,我們可以注意到圖表分為了兩列,左半部分奇數核是真實的物理核心,右半部分則是 Intel 超線程技術虛擬出來的核心。可以看到,在高負荷的情況下,系統將負載均勻地分散到了所有的核心上,而負載較輕時系統則將負載主要放在了真實的物理核心上。
橫坐標軸為時間,縱坐標軸則為負載,時間從左到右逐漸靠近當時的情況
但 Apple Silicon 上的 CPU 則完全不同,它的處理器部分都是由兩種不同的 CPU 核心組成,一種是叫做 Firestorm高性能核心(有時也被縮寫成 P 核),而另一種則叫做 Icestorm高能效核心(有時也被縮寫成 E 核),這種不對稱的處理器被稱為非對稱多處理(Asymmetric Multiprocessing,縮寫為AMP、ASMP)器,或是異構計算(Heterogeneous Computing)處理器。
從 2020 年開始到今天, M1 系列共計發布了四款芯片,分別是:
M1 Ultra(2022 年)
E 核心有 5 個頻率可以選擇,P 核心有 15 個頻率可以選擇
通過 powermetrics 我們可以知道 E 核心的頻率最高為 2064Mhz,P 核心的情況則分為兩種情況,M1 芯片的 P 核心最高頻率為 3204Mhz,M1 Pro/Max/Ultra 的 P 核心最高頻率可達 3228 MHz。如果系統還是和以前一樣將保持所有的核心負載相近,不僅會浪費 P 核心更多的中間檔位,也會讓跑在 E 核心上的程序明顯更慢。
此外,M1 和 M1 Pro/Max/Ultra 有完全不同的 E 核心和 P 核心組合,每個處理器還可以選擇不同的 CPU 數量,比如最基礎款的 14 inch MacBook Pro 上的 M1 Pro CPU 部分只有 6 個性能核和 2 個能效核,所以開發者如果需要手動適配「保持所有的核心負載相近」這個邏輯從直覺上來說異常繁瑣。
為了簡化核心管理,macOS 會將核心根據功能劃分為 2~4 個相同類型的集群,集群可以理解成組。然而,系統層面上的內核編號和 powermetrics 中顯示的內核編號相同,但和活動監視器中所顯示的內核編號卻並不一樣;因此為了行文統一,文中將採用活動監視器的內核編號規則,但根據系統集群進行編號。在 macOS Monterey 12.3.1 下, M1 系列的三組芯片的功能集群情況如下:
M1 分別由一個 E 集群(包含 4 個 E 核心)和一個 P 集群(包含 4 個 P 核心),並命名為 E 和 P0;
M1 Pro/Max 則由一個 E 集群(包含 2 個 E 核心)和兩個 P 集群(分別包含 4 個 P 核心),並命名為 E、P0 以及 P1;
M1 Ultra 則由一個 E 集群(包含 4 個 E 核心)和四個 P 集群(分別包含 4 個 P 核心),並命名為 E、P0、P1、P2 以及 P3。