ARM_big.LITTLE

**ARM big.LITTLE** 或 **big.LITTLE** 是由安謀國際科技公司（ARM）提出的異構運算架構。在該架構中，比較耗電但運算能力強的處理器核心組成的「big 叢集」與低耗電、運算能力弱的處理器核心組成的「LITTLE 叢集」結合，這些處理器核心共享記憶體區段，並能夠在不同的 CPU 叢集之間線上實時分派、切換負載。這個架構運用在行動計算上，意圖是做出計算高效能而平均耗電低的多核心處理器。ARM 的行銷材料稱，在某些運算操作中該架構與只使用與「big 叢集」的相同 CPU 核心數量的處理器相比，可節省多達 75% 的功耗。通常，ARM big.LITTLE 架構用於建立多處理器 SoC（MPSoC）。

本組態組態式在 2011 年 10 月 ARM 發表 Cortex-A7 時首次對外公布，Cortex-A15 也能夠與這個架構相容。2012 年 10 月，ARM 公司宣布 Cortex-A53 與 Cortex-A57（ARMv8）也能與這個架構相容。2014 年 2 月 ARM 發表 Cortex-A17，同一年在 Computex 2013 上 ARM 又發表了 Cortex-A12，這兩種 CPU 核心也可用於 big.LITTLE 組態式中的「big 叢集」上（「LITTLE 叢集」由 Cortex-A7 擔當）。

2017 年 5 月，ARM 發表 DynamIQ 取代 big.LITTLE。與 big.LITTLE 相比，DynamIQ 允許更為靈活的 CPU 核心組態和更大規模的叢集設計（每個 CPU 叢集可以有八顆 CPU 核心）、叢集數量更多（一塊 CPU 上最大可擴充至 32 個叢集）、更精確的電源控制（每個核心內有更多的時鐘門控和電壓控制）以及更快速的 L2 快取存取操作。然而 DynamIQ 僅適用於 Cortex-A75、Cortex-A55 及往後推出的 ARM CPU 核心。

## 運行狀態遷移切換方式

big.LITTLE 中，節電的「LITTLE 叢集」和高效能的「big 叢集」之間有三種切換方式，均要求線上實時操作，除了電路設計以外還需要作業系統的配合得當（一些方式需要依賴作業系統的工作流排程實作）

### 叢集切換

最早也是最簡單的 big.LITTLE 組態實作是這種大小核心叢集的切換，高效能 CPU 核心亦即大核心組成「big 叢集」，而低功耗 CPU 核心亦即小核心，則是組成「LITTLE 叢集」。作業系統的排程器在某一時間點上只能見到一組 CPU 叢集，整個處理器的負載高低變化時，系統會在不同叢集間轉移負載。當負載從一個 CPU 叢集轉移至另一 CPU 叢集時，相關的資料、執行狀態等被儲存在這些叢集共享的二級快取（L2 Cache）當中，先前運作的 CPU 叢集斷電關閉然後加電壓開啟另一個叢集。叢集的資料轉移還需要使用快取一致性互聯（CCI）。這種 big.LITTLE 的第一個實作是三星 Exynos 5410 Octa。這種方式的一大缺點是 CPU 叢集間的切換延時較高，並且 CPU 核心的利用率較低。

### 核心內建切換器（CPU 遷移）

這種切換方式自叢集切換方式演變，主要區別在於每一個叢集對作業系統排程器來說都是可見的。在此種方式中，任務在 CPU 核心之間切換使用核心內建切換器（in-kernel switcher，IKS），晶片設計上是一個高效能 CPU 核心和一個低功耗 CPU 核心組成一個復合叢集，這一個叢集作為一個「虛擬的」核心來供作業系統操作，同一時間點上這一對 CPU 核心只有一顆在運作，高效能 CPU 核心僅在有高效能運算需求時才開啟，運算效能需求低時則是只開啟低功耗核心。當虛擬核心內負載在高低之間變化時，先開啟將要切換到的 CPU 核心，轉移執行狀態，轉移完成後關閉先前運行的 CPU 核心，由該 CPU 核心繼續執行先前的處理進程。切換工作需要通過 cpufreq 框架完成。Linux 3.11 核心開始提供了 big.LITTLE IKS 完整實作所需核心元件模組。

蘋果公司的 A10 Fusion 以及 A10X Fusion 即採用此種 big.LITTLE 組態。不過，更複雜多樣的「大小核心」CPU 核心分組，也是有可能的，一隻採用 IKS 方式的處理器上容許一個虛擬核心內有一顆以上的高效能 CPU 核心或低功耗 CPU 核心，或者是相同的 CPU 核心而分成主副 CPU 核心。輝達的 Tegra 3 SoC 也採用類似 IKS 切換方式，但 Tegra 3 上採用的是相同的 CPU 核心，多個主 CPU 核心與一個副 CPU 核心的設計。

### 異構多處理機（全域任務排程）

異構多處理（heterogeneous multi-processing，HMP）是 big.LITTLE 組態中最靈活也是效能最強勁的使用模式，在這種組態中，同一時間點上所有的物理 CPU 核心都是可用的並且可以同時全部開啟使用，也可以將高效能 CPU 核心全數關閉而只使用低功耗 CPU 核心。高優先級或者對運算速度吃重的執行緒可以被分派至高效能 CPU 核心上，而低優先級或對運算速度要求不高的執行緒（如背景任務），則是由低功耗 CPU 核心負責完成

最早的實作是三星電子的 Exynos Octa 5420/5422/5430。而現時大部分實現 big.LITTLE 組態的 ARM 架構相容處理器，多採用這種切換方式。迫於行動裝置對 CPU 核心規模的控制，蘋果公司的 Apple A11 也採用此種排程方式。

全域任務排程的優勢：

* 對各個 CPU 核心有更細粒度的工作量控制。因為作業系統排程器直接對各個 CPU 核心分配及搬移任務、降低作業系統核心態的額外開銷而令節電效果和效能相應地獲得提升
* 相比核心內建切換器（IKS）依賴 cpufreq 框架來實現，直接使用任務排程器來實現 CPU 核心的切換來得快，而且更容易實現
* 更靈活的 CPU 叢集組合（像是兩個 Cortex-A15 和四個 Cortex A7 組成的 SoC CPU 部分）
* 相比固定只能使用虛擬核心數量的 CPU 核心數，如有需要，可以實現 SoC 內所有的 CPU 核心一同運作以最大限度發揮 SoC 的運算效能

## 任務排程

對於大小 CPU 核心（叢集）成對組態的，它們之間的切換過程對作業系統來說是透明的，作業系統使用現成的動態電壓與時鐘訊號調整（DVFS）功能來實現。作業系統核心現成的 DVFS 支援（像是 Linux 核心的 `cpufreq`）將根據負載輕重，從預先設定的一個時鐘訊號 - 核心電壓參數組態表中以合適的參數設定 CPU 的電壓與時脈，和此前僅需調整核心電壓、時脈的 CPU 一樣，然而，較低的參數設定則會開啟節電（小）CPU 核心，而較高的參數設定則是開啟高效能（大）CPU 核心。

另一種相對的，則是所有的 CPU 核心都呈現給作業系統核心排程器，排程器將依據請求決定由哪個核心執行哪個行程或執行緒。這種排程方式需要非成對組態的 CPU 核心（叢集），不過成對組態的 CPU 核心（叢集）也可能允許使用。不過這種排程方式更考驗作業系統核心排程器的調校功力（多核心處理器的效能最佳化），至少當前大多數的硬體中，多核心處理器的結構使用的是對稱多處理器系統，big.LITTLE 組態其實也不例外。

## 參見

* ARMv7 處理器核心列表
* ARMv8 處理器核心列表
* Nicolas Pitre. Linux support for ARM big.LITTLE. LWN.net. 2012-02-15 [2012-10-18]. （原始內容存檔於 2012-10-17）.
* Paul McKenney. A big.LITTLE scheduler update. LWN.net. 2012-06-12 [2012-10-18]. （原始內容存檔於 2012-10-22）.
* Jake Edge. KS2012: ARM: A big.LITTLE update. LWN.net. 2012-09-05 [2012-10-18]. （原始內容存檔於 2012-11-02）.
* Jon Stokes. ARM's new Cortex A7 is tailor-made for Android superphones. Ars Technica. 2011-10-20 [2012-10-31]. （原始內容存檔於 2012-12-03）.
* Andrew Cunningham. ARM goes 64-bit with new Cortex-A53 and Cortex-A57 designs. Ars Technica. 2012-10-30 [2012-10-31]. （原始內容存檔於 2012-11-01）.

## 參考資料

## 外部連結

* big.LITTLE Processing
* Big.LITTLE Processing with ARM CortexTM-A15 & Cortex-A7 (PDF)