第1頁:什么是應用處理器?
對不起,你被標題欺騙了,實際上對許多讀者來說要讀懂本文并不是那么輕松:p
隨著半導體工藝的日趨先進,智能手機(Smartphone 或者 Superphone)、平板電腦(Tablet 或者 Pad)已經成為許多網友最常使用、最多關注、更新最快的電子消費產品,高度便攜性是這類產品的最關鍵成功原因。
所謂便攜性自然是指產品必須足夠輕便而且需要有足夠的續航能力,因此這就要求產品的原件必須足夠省電,只有這樣才能減少散熱和電池體積這兩個最占體積和重量的問題。
要達到這個目標,肯定要做功能和性能上的妥協,至少相對個頭更大的筆記本電腦、臺式機而言,像降低吞吐率或者增加時延,從實測性能而言,目前智能手機或者平板電腦的 CPU、圖形處理器性能基本上相當于 6 到 10 年前臺式電腦的水準。
舉個簡單的例子,在俄羅斯網站 ixbt 的討論區上,有這樣的一條帖子,一位名為 ssvb 的網友采用 origenboard.org 的一片 Samsung Exynos 4210 開發板(配有 Exynos 4210 處理器具備兩個 ARM Cortex-A9 處理器內核)跑出來的 High Performance Linpack (HPL)性能是 1.307 GFLOPS,同貼中還有 Intel Atom N450(Pineview 架構,45nm,單核) 1.66GHz 的測試結果——0.944 GFLOPS 以及 Cortex-A15 1.7GHz 雙核 HPL 為 4.3 GFLOPS。
NVIDIA 官網上的一份 SC011 文件也表明 Tegra 2(ARM Cortex-A9 雙核 1GHz,理論雙精度浮點性能 2GFLOPS)的 HPL 性能為 1.15GFLOPS( 57% 效率,200MFLOPS/瓦) 。
這都是一個什么概念?我曾經在 06 年的時候用 Pentium D 820 2.8GHz 跑出來的 HPL 性能為 10.12 GFLOPS,Athlon64X2 2.6GHz 為 9.158 GFLOPS。
那么現在臺式機的 HPL 性能狀況如何?
在去年我用 Core i7 2600K 3.4GHz 配合未支持 AVX 指令的 GotoBLAS(數學庫)上得到的 HPL 性能為 51.18 GFLOPS 左右,后來又用支持 AVX 的 OpenBLAS(原 GotoBLAS 開發者停止更新后的其中一個后續開源社區版)得出的 HPL 性能為 99.38 GFLOPS,到 2013 年支持 AVX2 指令集的 Haswell 架構出來后,這個測試結果應該還能接近再翻番,達到 200 GFLOPS 級別。
也許你會說手機、平板要雙精度干啥呢?請不要忘記在 30 年前的 x86 處理器根本沒有集成任何硬件浮點單元,現在的情況又如何?曾經做出號稱最強 x87 協處理器的 Cyrix 后來一頭扎進整數為王的產品策略后現在影都沒了。
“干啥”這個問題往往是硬件具備并達到一定性能條件后就會有答案的,臺式機上的性能測試軟件和方案會隨著手機、平板性能日益強大而變得在這類設備上運行也理所應當,除了上面說的 HPL 外,各類 PC 上流行的測試工具例如 SPEC CPU20xx、3DMark 等也會是如此。
傳統的 CPU 性能測試的確不能完全適用于手機、平板的 SoC 芯片(人們把可以在移動操作系統上跑應用軟件的 SOC 稱作應用處理器,簡稱 AP),但是請注意我說這句話是因為 SoC 并不僅僅有 CPU,還有 GPU、音視頻編解碼器、存儲控制器、非易失性存儲單元、數模/模數轉換器以及各種輸入輸出周邊等,這使得我們要單純評價一款 SoC 是否最佳的時候可能會感到頗為傷神。
話雖如此,不過總的來說,SoC 中和性能最密切相關的依然是 CPU、GPU,因為智能設備里幾乎所有程序的運行都必須依仗兩者來執行,與用戶的使用感受有直接關系(請注意,我們這里說的只是指 SoC 芯片中,而非手機或者平板電腦整體)。因此,縱然手機、平板處理器型號各異并且內中千頭萬緒,我們還是應該從大家最關心的 CPU、GPU 著手來了解。
現在情況簡單多了,按照 ISA(指令集架構)劃分,因為目前的手機、平板 CPU 無非是 ARM、Intel/AMD 兩大陣營,潛在的還有 MIPS,不過目前 MIPS 似乎在這個領域還成不了氣候,更像是一個備胎。
如果你對計算機科學還不是很了解的話,對 ISA 這個詞可能也不會很了解,雖然它經常出現在一些時髦的技術文章中。
電腦顯然并不能直接明白 C、Java、Basic 這樣的高級語言(雖然有人嘗試過開發高級語言處理器,但是無不失敗告終),搭建在高級語言和 CPU 本機代碼之間的就是 ISA。
ISA 的全稱是 instruction set architecture,中文就是指令集架構,有時候直接稱呼為架構(architecture),是指程序員實際“可見”的指令集,包含了程序員編寫一個能正確運行的二進制機器語言程序的所有信息,涉及到指令、 I/O 設備等。例如 Intel 的 IA-32、Intel 64(曾經名為 IA32e、EM64T 等);ARM 的 ARMv7、ARMv8 等等。
這里的 IA32、Intel 64 或者 ARMv7、ARMv8 其實是指各自指令集架構的不同版本,有時候我們嫌啰嗦,所以把前兩者統稱 x86,后兩者統稱 ARM。
將 ISA 變成真正可以使用的實物需要經過“實現”,它包括兩個層面:組成和硬件。
組成是從計算機設計的高階層面而言,例如:存儲系統、存儲互連接、CPU(包括算術、邏輯分支、數據傳輸的實現)設計,有時候“組成”又被稱作微架構(microarchitecture),英特爾 Nehalem、NVIDIA Kepler、ARM Cotrex-A57 都可以屬于各自某系列芯片的微架構,其中 Kepler 的 ISA 是 CUDA PTX 和 Cortex-A57 的 ISA 屬于 ARMv8。
硬件通常是指電腦的規格,包括具體的邏輯設計、封裝技術,同一系列的產品可能有相同的 ISA、近乎一樣的微架構,但是存在某些具體規格的差別,例如 NVIDIA Tegra 3,有 AP30、AP33、T30、T33、T30S、T33S、T30SL 等具體的型號,它們都屬于 Tegra 3 微架構,但是頻率規格、內存規格等地方都有差別。
而 GPU 方面則復雜一些,有 PowerVR、高通、NVIDIA、ARM、Intel 等等,其中使用最廣泛的就是 PowerVR,這得益于 PowerVR 10年前就決定全面切換到移動設備上,鋪橋搭路的功夫很扎實,而 NVIDIA 和 Intel 的商業模型都是只用于自家產品(當然 NVIDIA 也曾經在游戲機領域做過 RSX 這樣的 IP core 授權)的,所以目前未能在其他 SoC 上看到。
下面的表格給出了這兩年來比較熱門的手機或者平板電腦 ARM 處理器,它們基本上都被應用于各公司的旗艦級產品中。
2011/2013 SoC 對比表 |
SoC |
制程 |
CPU |
GPU |
內存總線 |
發布時間 |
Apple A5 |
45nm/32nm |
2 x ARM Cortex A9 w/ MPE @ 1GHz |
PowerVR SGX 543MP2 |
2 x 32-bit LPDDR2 |
2011-10-4 |
Apple A5X |
45nm |
2 x ARM Cortex A9 w/ MPE @ 1GHz |
PowerVR SGX 543MP4 |
4 x 32-bit LPDDR2 |
2012-3-16 |
Apple A6 |
32nm |
2 x Apple Swift @ 1.3GHz |
PowerVR SGX 543MP3 |
2 x 32-bit LPDDR2 |
2012-9-12 |
Apple A6X |
32nm |
2 x Apple Swift @ 1.4GHz |
PowerVR SGX 554MP4 |
4 x 32-bit LPDDR2 |
2012-10-23 |
NVIDIA Tegra 2 |
40nm |
2 x ARM Cortex A9 @ 1GHz |
ULV GeForce T2 |
1 x 32-bit LPDDR2 |
2010-1-8 |
NVIDIA Tegra 3/Kal-El |
40nm |
4 x ARM Cortex A9 w/ MPE @ ~1.3GHz |
ULV GeForce T3 |
1 x 32-bit LPDDR2 |
2011-11-8 |
NVIDIA Tegra 4/Wayne |
28nm |
4 x ARM Cortex A15MPCore w/MPE |
ULV GeForce T4 |
2 x 32-bit LPDDR2 |
2012-1 |
Samsung Exynos 4210 |
45nm |
2 x ARM Cortex A9 w/ MPE @ 1.2GHz |
ARM Mali-400 MP4 |
2 x 32-bit LPDDR2 |
2011-2-10 |
Samsung Exynos 4212 |
32nm |
2 x ARM Cortex A9 w/ MPE @ 1.5GHz |
ARM Mali-400 MP4 |
2 x 32-bit LPDDR2 |
2011-10-1 |
Samsung Exynos 5250 |
32nm |
2 x ARM Cortex A15MPcore w/ MPE @ 1.7GHz |
ARM Mali-604 |
2 x 32-bit LPDDR2 |
2011-11-30 |
Qualcomm MSM8060/8260/8660 |
45nm |
2 x Scorpion @ 1.5GHz |
Adreno 220 |
1 x 32-bit LPDDR2* |
2011-2-10 |
Qualcomm MSM8960 |
28nm |
2 x Krait @ 1.5GHz |
Adreno 225 |
2 x 32-bit LPDDR2 |
2011-2-14 |
Qualcomm MSM8960T |
28nm |
2 x Krait @ 1.7GHz |
Adreno 320 |
2 x 32-bit LPDDR2 |
2012-2-27 |
Qualcomm APQ8064 |
28nm |
4 x Krait @ 1.7GHz |
Adreno 320 |
2 x 32-bit LPDDR2 |
2011-2-14 |
它們都屬于 ARMv7 架構,架構寄存器數量為 16 個,其中 Tegra 2/3、Exynos、A5/A5X 的 CPU 核心是 Cortex A9 或者 Coretx A15,都是來自于 ARM 的 IP core 授權,而 A6/A6X 的 Swift 和高通的 Scorpion/Krait 則分別是蘋果和高通獲得 ARM 架構授權后而各自自行開發的。
眾所周知,IP core 的全稱是 Intellectual Proerty core,意即知識產權內核,是目前各種嵌入式應用、個人智能消費類設備中最為常見技術類型,數十億計的產品都采用了來自 ARM、MIPS 的 IP core。IP core 被設計成可以和芯片中其他邏輯單元(例如視頻編解碼器、I/O 界面、內存界面)協同運作形成一枚可以支持特定應用的處理器。
IP core 分為兩類:硬核(hard core......不要會錯意了)和軟核(soft core)。硬核是針對特定半導體廠商而優化的,對外人來說是一個提供了外部界面、不修改的“黑盒子”,獲得授權的廠商通常只能對核外的邏輯參數進行修改,例如 L2 cache 大小,但是 IP core 本身不可修改。而軟核的設計代碼則是可以針對不同半導體廠商做編譯和修改,當然這要求設計廠商具備強大的研發實力和經驗,因為現在的 IP core 相當復雜。
簡而言之而言,硬核的性能更高、占用管芯面積更小,而軟核則可以讓不同廠商作進一步的修改。
第2頁:長話短說“微架構”——流水線
ISA 的“實現”需要借助各種微架構,現在的處理器微架構基本上涉及以下部分:
流水線化
多核、多線程
SIMD 向量
存儲系統分層結構
早期一些采用非常簡單的指令集(注意,我們說的不是 RISC)的電腦是采用單周期設計的,取指、解碼、執行、寫回都是放在同一個拍(周期)內順序完成,此時的 CPI(每指令周期數)基本上是 1,但是這樣設計的效率很低:當取指的時候,其余工位都只能瞎瞪眼等開飯,這樣的設計也被稱作非流水線化執行。

上:非流水線化(順序化)執行
下:流水線化執行
流水線化則是實現各個工位不間斷執行各自的任務,例如同樣的四工位設計,指令拾取無需等待下一工位完成就進行下一條指令的拾取,其余工位亦然。
世界上第一臺采用流水線化指令執行的電腦為 1961 年的 IBM Stretch 或者說 IBM 7030,具備四級流水線工位,它同時也是 IBM 第一臺晶體管化電腦。
這樣原本四工位非流水線的一個周期是 800 個皮秒的話,在流水線設計的處理器上,雖然同樣的指令完成時間依然是 800 皮秒,但是第二條指令則可能只需要在第一條指令完成時間加 200 皮秒即第 1000 皮秒就能完成,而非流水線設計則需要第 1600 皮秒才能完成。

常見的五周期(FDEMW)流水線形式,對同步處理器來說 Latch 之間為一拍(周期)
對 Pentium 4 這類異步處理器來說,個別工位(simple ALU)頻率為雙倍即 1/2 拍
RISC 指令集具備指令編碼格式統一、等長的特點,在流水線設計設計上有得天獨厚的優勢,這樣可以使得流水線工位設計相對于指令編碼格式不統一、非等長的 CISC(例如 x86 的指令長度為 1 個字節到 17 個字節不等)來說顯得更容易。
x86 可能需要將一些工位拆開(這意味著流水線工位更多或者流水線長度更深),例如英特爾的第一款流水線化處理器——486 的指令解碼就是拆成兩個工位。
流水線設計可以讓指令完成時間更短(理論上受限于流水線執行時間最長的工位),因此將一些工位再拆開的話,雖然依然是每個周期完成一條指令,但是“周期”更短意味著指令吞吐時間進一步縮短,每秒能跑出來的指令數更多,這就是超級流水線的初衷。
微架構
(Microarchitecture) |
流水線工位數
(Pipeline stages) |
Sony Cell PPU |
23 |
IBM PowerPC 7 |
17 |
IBM Xenon |
19 |
AMD Athlon |
10 |
AMD Athlon XP |
11 |
AMD Athlon64 |
12 |
AMD Phenom |
12 |
AMD Opteron |
15 |
ARM7TDMI(-S) |
3 |
ARM7EJ-S |
5 |
ARM810 |
5 |
ARM9TDMI |
5 |
ARM1020E |
6 |
XScale PXA210/PXA250 |
7 |
ARM1136J(F)-S |
8 |
ARM1156T2(F)-S |
9 |
ARM Cortex-A5 |
8 |
ARM Cortex-A8 |
13 |
AVR32 AP7 |
7 |
AVR32 UC3 |
3 |
DLX |
5 |
Intel P5 (Pentium) |
5 |
Intel P6 (Pentium Pro) |
14 |
Intel P6 (Pentium III) |
10 |
Intel NetBurst (Willamette) |
20 |
Intel NetBurst (Northwood) |
20 |
Intel NetBurst (Prescott) |
31 |
Intel NetBurst (Cedar Mill) |
31 |
Intel Core |
14 |
Intel Atom |
16 |
LatticeMico32 |
6 |
R4000 |
8 |
StrongARM SA-110 |
5 |
SuperH SH2 |
5 |
SuperH SH2A |
5 |
SuperH SH4 |
5 |
SuperH SH4A |
7 |
UltraSPARC |
9 |
UltraSPARC T1 |
6 |
UltraSPARC T2 |
8 |
WinChip |
4 |
LC2200 32 bit |
5 |
例如 Cortex-A15、Sandy Bridge 都分別具備 15 級、14 級流水線,而 Intel NetBurst(Pentium 4)、AMD Bulldozer 都是 20 級流水線,它們的工位數都遠超出基本的四(或者五)工位流水線設計。更長的流水線雖然能提高頻率,但是代價是耗電更高而且可能會有各種性能懲罰。
第3頁:長話短說“微架構”——超標量
既然流水線設計可以實現不間斷取指、解碼、執行、寫回,那為何不干脆同時做幾條流水線一起取指、解碼、執行、寫回呢?這就引出了超標量設計。

上圖就是一個三路超標量四工位流水線的指令/周期執行示意圖,可以看到 CPI 從 1 變成 0.33,即每周期執行 3.33 條指令,這樣的改進幅度是令人著迷的,因此在初期的時候超標量甚至被人們贊美為標量程序的向量式處理。
不過在現實中不可能都這樣,因為現在的處理器執行不同指令時候的“執行”段工位并不完全一樣,例如整數可能短一些,浮點或者向量和 Load/Store 指令需要長一些,加上一些別的因素,實際大部分程序的實際 CPI 都是 1.x 甚至更高啊。
例如:
a = b * c
d = a + 1
這里的第二條指令需要使用到第一條指令的計算結果,因此必須等待第一條指令完成后才能跑第二條指令,更重要的是,在不少處理器上乘法指令并非一個周期而是需要多個周期才能完成。在遇到這樣的情況時,就不能實現多指令發射而且會出現流水線停頓。
第4頁:長話短說“微架構”——分支(轉移)預測
當然,還有更復雜的情況:
if (a > 5)
b = c;
else
b = d;
將其按照匯編語言編寫出來:
cmp a, 5 ; a > 5 ble L1 mov c, b ; b = c br L2 L1: mov d, b ; b = d L2: ...
這里的第二條指令是一個條件分支指令(ble 是小于或等于轉移指令,ble L1 表示如果寄存器 a 小于等于 5 就轉移到 L1 這行執行 mov d,b 這條指令)。
這條指令抵達“執行單元”的時候,位于流水線前段的取指單元和解碼單元肯定已經拾取和解碼了若干條指令,但是哪一條指令才應該接下來被執行呢?應該是第三、四條還是第五條呢?
在第二行的條件分支指令完成之前,處理器只能等待。處理器平均六條指令就會遇到一條分支指令,因此流水線設計帶來的大部分性能提升優勢此時會被喪失掉。
為此處理器必須進行“猜測”,按照猜測結果進行取指并推測哪些指令能開始執行,不過這些指令的執行結果并不會被遞交(寫回)直到分支指令的執行結果完成。
如果猜錯的話,這部分指令的結果就會被扔掉,這也意味著這些指令對應的時間或者周期數會被浪費掉。當然如果猜中的話,處理器就能全速運行了。
那么如何去做“猜測”呢?
一個辦法是所謂的靜態分支預測,例如在指令編碼格式里留出一個位元作為預測信息,編譯器編譯的時候,對這個位元進行標記,告訴處理器該跑那條分支,不過這對于已經采用了不具備這類條件執行指令的舊式 ISA 二進制程序來說這樣顯然是不可能的。
另一個辦法就是“運行過程中”進行猜測即動態分支預測,通常是采用類似被稱作“片上分支預測表”的單元來記錄最近分支的地址以及用一個位元指示出哪一條分支是最近是否被采用的。
不過現在大多數處理器實際上是用兩個位元來作標記的,因此單次的分支“不跳轉”并不會馬上導致一般的“跳轉”預測出現反轉(這對于循環邊界來說是很重要的)。不過兩位元分支預測并有考慮到分支相關性,所以人們后來有采用兩級分支預測來解決這個問題,使得預測精度大大提高。
動態分支表需要占用相當可觀的芯片面積,但是另一方面來說分支預測對流水線化處理器是相當重要的,所以是物有所值的。
不過就算是最好的分支預測技術也可能會猜錯,對于超級流水線或者說深流水線來說就會有很多指令的結果會被扔掉,這樣的情況被稱作 mispredict penalty(誤預測性能懲罰)。
像 Pentium III 這類具備非常先進分支預測技術的處理器,在遇到分支預測失敗的時候,也會出現 10~15 個周期的性能損失,因此即使正確命中了 90% 的分支,也會因為分支誤預測導致 30% 的性能損失,所以 Pentium III 其實很多時候會出現 30% 的時間在走冤枉路。
人們在 ISA 中引入條件執行指令(predicated instruction),希望籍此盡量減少分支,例如上面的例子,引入名為 cmovle 的判定指令后,可以寫成這樣
cmp a, 5 ; a > 5 mov c, b ; b = c cmovle d, b ; if le, then b = d
cmovle 的作用是“當小于或者等于的時候就進行賦值”,只有在條件為“真”的時候才會遞交執行,因此被稱作條件執行指令。
采用了判定指令后,原來的 5 條指令變成 3 條,避免了兩條分支指令,cmp 和 mov 可以并行執行實現 50% 的性能提升,消除了分支預測錯誤導致的大量誤預測懲罰。
ARM 從一開始具備完整的判定指令集,而 MIPS 和 x86 后了也都添加了條件賦值指令,IA64(EPIC)中幾乎每條指令都具備條件執行功能。
第5頁:長話短說“微架構”——動態調度
為了充分利用由于分支以及長時延指令導致的流水線“氣泡(停擺)”而浪費的資源,人們引入了亂序執行(OoOE)技術。當出現需要等待某條指令的時候,程序中的指令會被“重排序(Re-Ordered)”,使得其他指令可以被執行。
對于像 x86 這樣的 ISA 來說,32 位模式下的寄存器只有 8 個(ARMv7 是 16 個),如果程序里的變量較多,就會導致多個變量使用同一個寄存器的情況發生,這里有可能出現先讀后寫的偽相關現象。
微架構里解決寄存器先讀后寫(WAR)偽相關的辦法就是寄存器重命名。在微架構的寄存器堆里塞進比 ISA 寄存器更多的物理寄存器,透過索引式寄存器堆或者保留站方式,將 ISA 寄存器映射到物理寄存器,從而實現亂序執行。
ARM Cortex-A8、Intel Pentium、Intel Atom(Bonnell 內核)、IBM Cell PPU 都屬于順序執行,它們選擇順序執行的原因主要是為了省電,因為 OoOE 需要大量的晶體管來實現。隨著制程的改進,OoOE 的開銷會逐漸淡化變得在某些場合里可行,因此像 ARM 從 Cortex-A9、Intel 從 Pentium Pro/Atom(Silvermont 內核)都開始采用 OoOE。
第6頁:長話短說“微架構”——線程級并行化
假設我們有這樣的一段 C 代碼:
int x,y ;
int z ;
x = 100 ;
y = x + 1 ;
z = 5 ;
由于 z 的初始化和賦值都是相對對立的,這里也許可以拆成兩條 thread(線程):
thread #1:
int x,y ;
x = 100 ;
y = x + 1 ;
和 thread #2:
int z ;
z = 5 ;
如果處理器的微架構具備兩種架構狀態讓操作系統認為有兩個處理器的話,上面的兩條 thread 就能同時執行了,這就是多線程。
多線程有三種類型,即 SMT、FGMT 和 CGMT,其中最早實現 SMT 的處理器是 Intel 的 Pentium 4,而 FGMT 大都在 in-order(相對于 OoOE)處理器上采用例如 Cell PPU 和所有的 GPU 上。
隨著半導體工藝提升以及功率墻壁壘橫亙在前面導致超級流水線提升頻率和各種指令并行度措施不再靈光后(這些限制其實在 20 多年前就被處理器廠商和科研界預見到,例如 1993 年 DEC 西部研究院 David W.Wall)的論文《LIMITS OF INSTRUCTION-LEVEL PARALLELISM》,1993 年英特爾在路線圖中明確提出在 P8(當時還是 P5 或者說 Pentium)時代引入多核處理器)廠商開始在片上實現多個內核,這也就出現了多核處理器。
多核處理器能讓支持多線程的程序、操作系統跑得更快,但是目前大部分的應用通常更偏好于單線程性能出色的處理器,因此你會看到單線程性能較強的雙核處理器比單線程性能較弱的多核處理器更快的情況發生。
到目前為止我們介紹了指令并行、線程并行的微架構實現,不過除了這兩種并行技術外,還有另一種非常常見的并行技術:數據級并行化,通常以 SIMD 向量方式實現。
第7頁:長話短說“微架構”——數據級并行(SIMD)
SIMD 就是單指令多數據的縮寫,理解起來并不困難,例如執行一條 SIMD 加法指令就能在一個周期里完成 64 條數據流發來的 64 個數字的加法運算。
SIMD 的初衷是為了攤薄大量執行單元上的控制單元成本,順帶減少程序的尺寸,因為SIMD 只需要復制一份代碼就能開跑,而多核處理器(或者說 MIMD)需要每個內核都復制一份代碼和在 cache 上共享多個程序拷貝。
SIMD 最好是用來跑結構相同的一堆數據,因此它是數據級并行的重要實現方式之一,而這類應用主要是多媒體為主,所以很多 ISA 都提供了專門的 SIMD 擴展來執行多媒體應用,ARM 有 NEON、Intel 有 MMX/SSE/AVX 等。
第8頁:長話短說“微架構”——存儲系統分層結構
無論是馮·諾依曼還是哈佛結構的處理器,最理想的情況下當然是有無限大的存儲空間和 0 時延的存儲系統了,不過這顯然是無法做到的,因此人們就提出了分層式的存儲系統結構,從寄存器開始每往下一層容量就更大,但是速度也更慢:

例如對于 ARM Cortex-A9(四核 Tegra 3 的批發報價一般為 15~21 美元)來說:
物理寄存器堆大小是 56*32-bit = 224 字節
L1 cache 是 32-KiB(時延 4 周期)
L2 Cache 是 1-MiB,不同大小區段的時延是:
- 64 KiB - 128KiB = L1C + L2C = 4 + 19 = 23 周期
- 256 KiB - 512 KiB = L1_C + L2_C + TLB_L1 = 4 + 19 + 7 = 30 周期
- 1 MiB = L1_C + L2_C + TLB_L1 + TLB_L2 = 4 + 19 + 7 +7 = 37 周期
不同型號的產品,搭配的內存容量不盡相同,以 華為 Ascend P1 XL 為例,搭配的內存大小為 1GiB,時延大概是 L2 + 110ns,帶寬一般都有 1000MiB/s 以上。
基本上所有的手機都是采用 NAND 型閃存或者閃存卡作為 DASD(直接存取存儲設備)來存放程序和數據,大小一般在 4 GiB 以上,如果搭配 Class 4 的 8 GiB microSD 卡的話讀寫帶寬一般只有 1.x MiB/ss~3.x MiB/s(傳輸數據塊大小為 4KiB 時)和 0.005 MiB/s~1.x MiB/s,價格一般為 20 元人民幣左右 。
這里說的時延是從數據載入指令發出到數據抵達處理單元所需的時間,這通常并不難理解。
那么這里的 TLB 時延(TLB_L1/TLB_L2)又是怎么回事呢?這是因為虛擬內存的存在。
虛擬內存(virtual memory)的作用一般有兩個:確保多個程序之間可以有效、安全地實現內存共享;讓程序以為有大一塊連續的內存空間(例如虛擬內存空間地址有 64-bit,但是我們的物理內存實際上只有 16GiB 或者說系統中的物理地址空間只有 34-bit,又或者是虛擬內存空間是 32-bit,而物理定址空間是 40-bit)。
對于用戶程序在虛擬內存空間里操作的處理器,是需要把虛擬內存空間地址轉換為物理內存空間地址,這就需要進行地址轉換了。負責這個功能的單元一般被稱作內存管理單元(MMU),有時候它又被稱作分頁內存管理單元,當然 MMU 的功能不僅僅是地址轉換(否則就不會被蓋這么大的名頭了)。
內存的基本管理單位被稱作 page(頁面,或者說頁塊),不同處理器支持的頁面大小不一樣,一般都是 4KiB(在 ARMv7a 里還有 64 KiB、1MiB、16 MiB 等),性能導向型的處理器頁面正變得越來越大,而嵌入式處理器似乎有 1KiB 大小的。
記錄物理內存和虛擬內存關系里的數據列表被稱作分頁表,這些分頁表也都是放在主內存(物理內存)中的,但是如果每次讀寫內存都要訪問兩次主內存的話效率太低了,所以人們引入了名為 TLB(Translate Look-aside Buffer,轉換后緩存)的 cache 來改善這個問題。
不同的處理器 TLB 大小都不一樣,以我們這里舉例的 Cortex-A9 為例,本身就存在多種 TLB 配置形式,它的 L1 D-TLB 是 32 個條目(或者說分頁地址映射),而 L1 I-TLB 可以配置為 32 或者 64 條目。
總之,早期的單周期式架構效率很差,因此人們引入了流水線設計,可以充分使用各級工位,各工位執行時間越短自然 CPU 的頻率可以更快;然后人們又引入了超標量設計,讓 CPU 上可以同時跑幾條指令,隨之而來的相依性等問題讓架構師們想出了分支預測、亂序執行、寄存器重命名等等技術來保證處理器的指令執行效率。
除了提高指令并行度來改善處理器性能外,還有數據并行、線程化并行等方法,但是后兩者都需要程序員和編譯器協助,并非免費。
影響處理器性能還有內存的帶寬和時延問題,因為取指和數據讀寫都必須透過內存訪問來完成,層階式設計是目前成本最為合理的方式。
第9頁:ARM 指令集架構的由來
在介紹一些稍微復雜的技術概念之后,我們不妨想看看 ARM 的由來。
ARM ISA 屬于 RISC(精簡指令集計算機,最關鍵特征是指令編碼格式統一),ARM 本身就是 Advanced RISC Machines 的縮寫,不過在早期它的全稱是 Acorn RISC Machine(1983 年 10 月開始設計,1985 年實現第一枚硅片),因為公司當時的名字叫 Acorn。
Acorn 是一家 1978 年在英國劍橋成立的公司,這家公司生產過若干款在英國頗為流行的電腦,例如在當地教學市場占主導的 BBC Micro。
BBC Micro 取得了很大的成功,但是處理器是 8 位 的 6502,Acorn 希望切換到 16 位系統上來,但是英特爾拒絕了 Acorn 的 80286 樣片申請。不過經過 Acorn 的多番實地考察和研究后,覺得在(當時)設計一個處理器的研發成本并不是很高,于是決定開始做 Acorn RISC Machine 這個項目。
基于 Acorn RISC Machine 的 ARM2aS 處理器獲得了蘋果公司名為 Mobius 的類 Apple 2 風格原型驗證機接洽,這個項目后來因為蘋果擔心和大賣的麥金塔電腦產生沖突而腰斬,但是這次接觸對 ARM 處理器的發展產生了一定的推動作用,因為 Mobios 團隊對 ARM 寄存器做了一些小修改使得原型機的基準性能有不同幅度的顯著改善。
后來蘋果開始著手開發名為 Newton 的個人掌上電腦,他們發現似乎只有 Acorn RISC Machine 能滿足要求耗電要求,但是當時 Acorn RISC Machine 處理器的內存管理單元并非 Acorn 自家,而是由 MEMC 公司提供芯片實現的,Acorn 沒錢開發這個功能。于是雙方就有了合作的想法,到了 1996 年 Acorn 和蘋果合資組建了 ARM 公司,不過 Acorn 公司依然獨立存在著直到 2000 年才基本煙消云散。
和一般的 RISC 不同的是,ARM ISA 除了指令長度固定為 32-bit(ARMv8 的 AArch 提供了 64-bit)的“經典 ARM” ISA 外,還有長度為 32-bit 或 16-bit 名為 Thumb(拇指)的 ISA 擴展。
Thumb 的目的是在低端或者說入門市場應用中改善 ARM 的指令密度(官方說法是減少大約 25%~35% 代碼空間,按照 Linaro Dave Martin 的 Linux Kernel 編譯結果,代碼空間少了大概 20%),提高指令密度可以讓 cache 塞進更多的指令減少命中缺失,更高密度的指令編碼也有利于多線程因為可用寄存器資源更多了等。大部分的 Thumb 指令編碼都能(經過位于指令解碼器前的一個轉譯器實現簡單轉換)對應到經典 ARM 指令編碼格式上。
Thumb 是 ARM 在嵌入式市場得以攻城拔寨的關鍵利器,在很長一段時間里都鮮有對手,Cortex 家族中用于單片機為主應用的 Cortex-M 甚至只支持 Thumb-2 指令(ARMv7 M),同樣以授權方式運營的 MIPS 直到 2010 年才推出類似的 microMIPS 指令。
VFP(Vector Floating Point,向量浮點)是 ARM 架構的浮點單元協處理器擴展,提供了完全遵循 IEEE 754-1985 的低成本單精度和雙精度浮點支持。雖然 VFP 打著向量的名頭,不過這些“向量”指令的各個向量是串列方式執行(或者需要單精度搭配雙精度才能實現并行執行)的,并不能提供真正的 SIMD 向量并行,因此這個向量模式被拿掉了。
Advanced SIMD(NEON)擴展在微架構實現中被稱作 MPE(媒體處理引擎),是一個 64-bit 和 128-bit SIMD 指令集擴展,支持 8/16/32/64 位整數和 32-bit 單精度浮點數,共享使用 VFP 的寄存器。從 ARMv8 開始,NEON 在 AArch 64-bit 模式下提供完全遵循 IEEE 754 和雙精度支持并且透過 VFPv4 具備 32 個 128-bit 寄存器。
第10頁:ARM Cortex-A9 內核微架構特點
Cortex-A9 的代號為 Falcon,是在 ARM 公司在 2007 年 10 月 3 日發布的 IP core,距今大約有五個年頭。
Cortex-Ax 這個名字中后綴 A 表示屬于 Application(應用處理器),Cortex 另有 M 系列(即單片機或者微控制器)、R 系列(實時應用),這里顯然是 A 系列的規格最高,具備 MMU(內存管理單元)。
基于 Cortex-A9 的芯片實現有前面提到的 NVIDIA Tegra 2/Tegra3、Apple A5/A5X 以及 TI OMAP4430/4440、ST-愛立信 NovaThor U8500/U9500/LT9540、STM SPEAr1310、三星 Orion/Exynos 4210、華為 K3V2、ZiiLabs ZMS-20/ZMS-40、Sony CXD5315GG(PSV)、聯發科 MT6577、華為海思 K3V2 等等,是目前 Google Android 操作系統高端手機、智能平板陣營中最主流的 CPU 內核。
 |
 |
Cortex-A8 微架構 |
Cortex-A9 微架構 |
Cortex-A9 的前身是 Cortex-A8,它們同屬于 ARMv7 ISA 的實現,和 Cortex-A8 相比,Cortex-A9 除了流水線更短、增加了專門的多核方案等大家熟知的變化外,還具備多項改進。
1、Cortex-A9 擁有眾多 RISC CPU 的先進特性,例如推測數據存取、動態分支預測、多指令發射、硬件 Cache 一致性、亂序執行、寄存器重命名,號稱史上第一枚亂序執行移動處理器。
除了雙指令發射和分支預測外,Cortex-A8 都并不具備,因此在 Cortex-A9 上匯編碼優化、NEON SIMD 的重要性相對來說要低很多(經過調優的匯編碼在 A8 上可以做到 10-30 倍性能,而 A9 一般只會有 2-5 倍,如果是 A9 使用 NEON C Intrinsics 的話性能基本上和匯編一樣)。
2、Cortex-A9 的每條 L1 Cache Line 是 32 字節,Corte-A8 是 64 字節。Cache Line 又稱作 data block(數據塊)或者 Cache Block,Cache 每次更新都以固定大小的 Cache Line 為單位。
Cache Line 的大小主要影響命中率、內存存取效率、發生 Cache 命中缺失時候的性能懲罰時間。
3、Cortex-A9 的 L2 Cache 位于“核外”( ARM 對應的方案是 PL310 或者更新一點的 L2C-310),而 Cortex-A8 則是速度更快的核內 L2 Cache。
從對 Cortex-A8 1GHz(三星 Samsung Hummingbird,即 Exynos 3110)和 CortexA-A9 1.2GHz(三星 Exynos 4210)實測來看,A8/A9 的 L1 cache 延遲分別為 3 周期和 4 周期,L2 Cache 延遲(含 L1 Cache 延遲但是不含 L1/L2 TLB 命中缺失懲罰的情況下)分別為 13 周期和 23 周期。
4、Cortex-A9MPCore 的各內核 L1 Cache 采用了數據、代碼分離式設計,L1 數據 Cache 具備硬件 Cache 一致性。各個內核共享外部 L2 Cache。
5、Cortex-A9 具備完整的 VFPv3 FPU,而 Cortex-A8 則只有縮水版的 VFPlite,主要區別是 Cortex-A9 的大多數浮點操作都只需要 1 個周期,而 Cortex-A8 需要 10 個周期,因此 Cortex-A8 的浮點性能相當爛。
6、Cortex-A9 支持半精度(fp16),而 Cortex-A8 只支持 32-bit 單精度(FP32)和雙精度(FP64),不過半精度在 CPU 級別的應用并不是很多見。
7、Cortex-A9 不能同時發射兩條 NEON 指令,而 Cortex-A8 卻能夠實現 1 條 NEON L/S 指令搭配一條非 L/S NEON 指令。
8、Cortex-A8 的 NEON 單元位于 ARM 單元下游,所以 NEON 單元訪問寄存器和內存更快,而且數據可以很快從 ARM 寄存器搬到 NEON/VFP 單元寄存器,但是將 NEON/VFP 寄存器數據搬到 ARM 寄存器的話就非常慢,會導致 Cortex-A8 的流水線停擺 20 個周期。
9、Cortex-A8 的 NEON 和 ARM 各有一個分離的 L/S 單元,如果一起對同一塊 Cache Line 進行 Load 或者 Store 操作的話,會導致額外的 20 個周期延遲。
10、Cortex-A9 對多線程化同步采用 LDREX/STREX,不會杜塞所有的內核,而 Cortex-A8 對互斥使用簡單的斷禁制。
11、所有的 Cortex-A8 都集成了 NEON SIMD 單元,但是 Cortex-A9 則未必,例如 NVIDIA Tegra 2 就沒有集成 NEON,不過 Tegra 3 則具備 NEON。
如果使用 7-zip(不包含任何浮點)實測來看,Cortex-A8 1GHz 的壓縮(受內存時延、數據 Cache 大小和速度以及 TLB 影響較大)/解壓縮(受 CPU 整數性能影響較大)性能相當于 Core i7 920 2.67GHz 的 3.5% 和 5.5%;而 Cortex-A9 雙核則是 Core i7 920 的 8.8% 和 12.7%。
第11頁:ARM Cortex-A15 內核微架構特點
代號 Eagle 的 Cortex-A15 是在 2012 年 9 月發布的 ARMv7 架構實現,是 ARM 首次引入三路指令解碼的微架構 IP core,目前三星的 Exynos 5 5250(雙核,32nm HKMG,1.7GHz)是市場上能看到的第一波 Cortex-A15 產品,Chromebook、Nexus 10(均在 2012 年 10 月發布)都采用了這枚芯片。

和 Cortex-A9 相比,Cortex-A15 有非常明顯的變化:
1、整數流水線最短工位數達到 15 級,管芯面積占用比 Cortex-A9 高一倍。
2、采用三路超標量微架構,可以每個周期取指四條指令,解碼器每個周期可以為發送單元提供 3 條指令,而指令發射單元可以亂序提供最高 8 個微操作供執行單元運行。
相比之下,A9 的解碼器只能每周期跑兩條指令,派發單元每周期派發 4 個微操作給執行單元。
3、Cortex-A15 的動態分支預測技術和 Cortex-A8/A9 差不多,但是 A15 引入了一個 64 條目的 microBTB,而此前的 A8/A9 并不具備這樣的分層結構。動態分支預測能力是影響現代風格處理器的關鍵因素之一,像 Pentium 4 的 BTB 是 4K 條目,SandyBridge 據說達到 8K~16K。
雖然 A15 的兩級 BTB 條目總數較 A8/A9 少,但是 A15 的 Return Stack 條目數從 8 條增加到了 18 條,取指帶寬從之前的 64-bit 提升到 128-bit,而且完全支持邊界非對齊地址的拾取。
4、Cortex-A15 支持 VFPv4,具備硬件 FMA 指令執行,可以在同頻下提供兩倍的峰值浮點性能。此外,A15 還具備硬件除法指令,在 A9 上這需要接近 50 個周期來執行。
5、A15 的周邊總線為 AMBA4,128-bit master 界面,A9 的 AMBA3 的 master 界面是 64-bit。
6、雖然 ARMv7 是 32-bit ISA,但是現在 Cortex-A15 支持 40-bit 物理定址(類似于當年的 Pentium Pro 和 Atlhon),而且 L1/L2 Cache 具備 ECC,因此理論上適用于服務器級應用。
7、A15 和 A9 都有一個類似的 small loop 緩存,用于存放小循環,讓執行單元無需訪問指令 cache 就能抓到指令。在 A9 上它可以存放大小為 64 字節的指令。
而在 A15 上則是 32 條目,可以存放兩條前轉分支和一條后轉分支,而且 A15 的 small loop 緩存存放的是已經解碼的微操作,這意味著連解碼步驟也能節省掉。
這類似于 Intel 的做法:先在 Conroe 上引入 loop buffer,然后在 Nehalem 引入 uop loop buffer(28 條目),到了 SandyBridge 則徹底改成了 uop cache(1500 個 uop),逐步改進。
Cortex A15 的整數性能為 3.5~4.01 DMIPS/MHz,相比起 A9 的 2.5 DMIPS/MHz 和 A8 的 2.0 DMIPS/MHz 有明顯的改進,不過因為三路超標量而帶來的各種資源增加,A15 需要更先進的制程(32 納米或更先進)才能在手機、平板上變得比較適用。
第12頁:高通 Krait 內核微架構特點

上圖是高通 2012 年 11 月于分析者日會議上公布的 AP 產品路線圖
雖然 2012 年年初的時候 NVIDIA Tegra 3 大放異彩,但是到了臨近年末的時候,高通的 Snapdragon 4 Pro APQ8064 卻已經是成為了幾乎所有性能導向新 Android 手機的主角,其中一個重要原因就是它采用的 Krait 微架構能提供對手不具備的特性。
Krait 微架構是高通第四代 Snapdragon(驍龍)處理器所搭配的 CPU 內核微架構,是 ARMv7 架構的實現,屬于高通的 ARM 架構級授權、自行研發的處理器內核微架構。
Krait 的前身是 Scorpion,在產品布局上它和 Scorpion 有些類似,例如 Scorpion 定位于 Cortex-A8 和 Cortex-A9,而 Krait 的定位也是類似,即 Cortex-A9 和 Cortex-A15 之間,具備一些 Cortex-A15 的特征。
例如 L0 cache(Cortex-A15 上有類似作用的 loop buffer,相當于 L0 I-cache,指令調度器無需經過解碼器就能抓到小循環的微操作指令)、三路超標量、VFP4 浮點單元、128-bit SIMD 處理能力(高通稱 SIMD 單元為 VeNum,ARM 自己則稱之為 NEON)以及基于 A15 同級的半導體制程節點。至于有人說 Krait 是 A9 的改進版,這樣的觀點我很難認同,它和 Scorpion 都類似于當年 DEC 獲得 ARMv4 ISA 授權而自行研發的微架構。
不過另一方面,Krait 的亂序執行要遜色于 Cortex-A15,后者具備八個指令發射端口和八個執行端口,每一個執行端口都對應一個(準)保留站(有些類似于 AMD K7-K10),而 Krait 只有四個指令發射端口和七個執行端口,并且采用的是類似 Cortex-A9 或者說 Pentitum Pro 方式的單個大規模指令發射隊列單元。
微架構對比
ARM vs 高通 |
|
ARM11 |
ARM Cortex A8 |
ARM Cortex A9 |
ARM Cortex A15 |
Qualcomm Scorpion |
Qualcomm Krait |
解碼能力 |
單路 |
雙路 |
雙路 |
三路 |
雙路 |
三路 |
整數流水線 |
8 級 |
13 級 |
8 級 |
15 級 |
10 級 |
11 級 |
亂序執行 |
否 |
否 |
是 |
是 |
部分 |
是 |
浮點單元 |
VFP11
(流水線式) |
VFPv3
(非流水線式) |
可選 VFPv3
(流水線式) |
VFPv4
(流水線式) |
VFPv3
(流水線式) |
VFPv4
(流水線式) |
SIMD(NEON) |
不具備 |
具備
(64-bit) |
可選 MPE
(64-bit) |
具備
(128-bit) |
具備
(128-bit) |
具備
(128-bit) |
半導體制程 |
90nm |
65nm/45nm |
40nm |
32nm |
40nm |
28nm |
典型頻率 |
412MHz |
600MHz/1GHz |
1.2GHz |
2GHz |
1GHz |
1.5GHz |
在現實測試中,Krait 的表現和它的微架構一樣,提供了比 Cortex-A9 更強的性能,在對單線程性能較高的應用中,即使是雙核版的 Karit 都可以比四核 Cortex-A9 更快。
第13頁:蘋果 Swift 內核微架構特點
正如我們前面提過的,蘋果公司在上世紀九零年代就已經和 ARM 合作并且提供了一些微架構設計上的修改方案,因此蘋果對 ARM 一點都不陌生甚至有非常豐富的經驗。
從 iPad、iPhone 4/iTouch 4、Apple TV 2 開始,蘋果開始真正介入 ARM 芯片設計,推出了名為 A4 的自行設計 ARM 處理器。A4 采用了 ARM 授權的 Cortex-A8 IP Core,但是蘋果找來了 Intrinsity 公司(已經被蘋果收購)和三星公司合作進行了一些調優,可以讓 A4 的頻率跑得比基于上一代制程的 Cortex-A8 更快。曾經有說法認為 A4 的 L2 cache 大小是 640KiB,但是后來確認修正為 512KiB(這是 ARM Cortex-A8 內核的可選配置方式之一)。
A5 系列依然是采用 ARM IP core,從 Cortex-A8 升級為 Cortex-A9 雙核,不過整個 A5 系列出現了三個版本,即 APL0498、APL2498、APL5498(A5X),三個版本的芯片面積各不一樣,其中 A5X 的 GPU 是四核 PowerVR 5 并且擁有 4 通道內存總線,定制化設計在這里體現得非常明顯。
真正的定制化設計是從 A6 開始,蘋果公司給 A6 搭配的 CPU 內核是完全有自己團隊開發的 Swift,不僅這樣,蘋果還提出了一個新的名字:ARMv7s。傳統上,ARMv7 是屬于 ISA 版本名稱,不過 ARMv7s 至今都并未出現在 ARM 官網的公開資料里,因此 ARMv7s 可能并非 ARM 的產物,而是蘋果自己在 ARMv7 基礎上做的一個架構優化定義,讓編譯器可以為 Swift 微架構匹配對應的調優,本質上 ISA 還是 ARMv7A。
CPU |
iPhone |
iPad |
iPod Touch |
Apple TV |
ISA |
內核 |
芯片名稱 |
"ARMv7s" |
Apple Swift |
Apple A6X |
|
4 |
|
|
Apple A6 |
5 |
|
|
|
ARMv7A |
ARM Cortex-A9 |
Apple A5X |
|
3 |
|
|
Apple A5 |
|
mini |
|
|
4S |
2 |
5 |
3 |
ARM Cortex-A8 |
Apple A4 |
4 |
1 |
4 |
2 |
三星 S5PC100 |
3GS |
|
3(32/64GB) |
|
ARMv6 |
ARM 1176JZ(F)-S |
|
|
|
3(8GB) |
|
3 |
|
2 |
|
1 |
|
1 |
|
那么 Swift 和以往的 Cortex-A9 相比有哪些改進呢?蘋果公司并未詳細說明,傳統上這家公司就是這樣,千方百計捂著,不過 Anandtech 利用一些自己編寫的微型基準測試程序進行了一些探測,以程序員的角度大致估量出了 Swift 的微架構是長得如何了。
在前端部分,Swift 具備三個指令解碼器,可以每個周期完成三條指令的解碼,而在指令分發器上,具備五個發射端口,浮點單元、整數單元各占兩個,還有一個專供 Load/Store 單元使用,具備亂序執行能力、整數流水線深度為 12 級,cache 子系統的時延比 Cortex-A9 低了差不多一半。
“ARMv7s”的設立估計就是讓編譯器獲知編譯執行對象是 Swift,這樣就能對各種指令順序進行一些預調度,確保盡可能低的 CPI。
簡而言之,A6 系列就是采用了比 A5 系列更先進制程和微架構的產物,其中的 CPU 內核則是蘋果首次真正完全執行開發的設計,未來是否會在 GPU 上也有類似的動靜將會是值得關注的。
第14頁:英特爾 Bonnell/Saltwell 內核微架構特點
Atom 是英特爾計劃實現 x86 anywhere 戰略的重要產品,為此它不惜賣掉了口碑不錯的 Xscale 系列 ARM 處理器部門給 Marvel,從 2008 年 3 月發布迄今已經有了 45nm 和 32nm 兩代制程,產品型號可以說是多如牛毛,就代號而言,有最初的 Silverthrone、Diamondville,然后經過制程改進,分別有了 Lincroft 和 Pineview,“新近”的 Cedarview 則是源自 Pineview。
不過這么多型號,到目前為止它們所基于的內核微架構都是 Bonnell。第一代的 Atom 處理器(Silverthrone)是 45 納米高性能制程制造,但是需要另外搭配一個 TDP 兩瓦的 130nm 制程芯片組,這枚 Atom 雖然有低于 1 瓦的版本,但是此時很多功能都被關閉,性能很弱,考慮到那個芯片組,根本不會有人拿這個做手機產品。
兩年后的 Lincroft 集成了 GPU、視頻單元以及內存控制器,采用專門的 45 納米 SoC 工藝制成,但是依然需要搭配一個代號 Langwell、由臺積電 65nm 制程生產的 I/O 芯片,兩者合起來的名字叫 Morrestown 平臺,這個系列中的 Z600 被嘗試用來做了一兩款手機,但是太高耗電的問題使得它們依然難以成為智能手機市場的競爭者。
到了 2012 年,名為 Medfield 的新平臺似乎讓英特爾的支持者看到了些許的曙光,因為在經過三次制程技術和三個不同的設計后,現在英特爾終于有了一個可以在耗電上達到智能手機要求的低功耗產品,這個平臺中基于 32 納米 SoC 制程的 Penwell 芯片集成了代號 Saltwell 的內核,在微架構上,Saltwell 和之前所有 Atom 處理器的內核微架構其實都是幾乎一樣的,都屬于 Bonnell 微架構,不過 Saltwell 由于采用了更精密的 32nm 制程,得以在微架構上做一些優化,因此在細節上是有一些不同的。

上圖為第一代 Bonnell 微架構(Silverthorne)
到了 Saltwell(第三代 Bonnell)BTB 為 8096,具備 uop cache
Bonnell 采用超標量流水線設計,可以每個周期執行最多兩條指令,指令需要遵循一定配對原則才能實現超標量執行(類似于 Pentium 的 U/V 設計),具備 16 級工位,支持 x86_64 指令集以及最高 SSE3 擴展,但是手機版本只支持 32-bit ISA,內存容量也被限制在 1GiB,對應平板和低端筆記本等版本則打開了 64-bit ISA 支持,內存容量放寬到 2~4GiB。
相對于當前的許多競爭對手來說,英特爾在產品技術細節公布上要大氣許多,各種數據表、涉及微架構內部關鍵特征的編程優化手冊都能在產品發布后就能公開下載到,這讓我們可以更詳細的為大家介紹這款產品。
1、Saltwell 的分支預測器是一個具備 8096 條目(兩倍于 Bonnell 4096 條目)的全局式分支預測器;
2、Lincroft 時代引入的 48 字節后段取指緩存(post-fetch instruction buffer)在 Saltwell 里升格為一個高速緩存(Cache),以便減少 Saltwell 的重復取指。該技術類似于 Conroe/Merom 的 Loop Stream Detector(循環指令流偵測器),前面我們在介紹 ARM Cortex 微架構的時候也有提到類似的技術。
3、Saltwell 的 L1 I-Cache 是 32KiB 8 路相關聯,L1 D-Cache 是單端口 24KiB 6 路相關聯。
4、Saltwell 的指令發射端口依然和 Bonnell 那樣是采用 Pentium 配對式發射風格的 U/V 流水線設計;
5、Saltwell 能實現更多的整數指令配對以及更快的 memcopy 微代碼規則。
6、加入了不間斷時間標簽計數器(TSC)和本地 APIC 計時器,主要是為了協助電力管理和減少喚起 CPU 的情況。
7、L2 Cache 維持之前的 512-KiB 8 路相關聯設計,運行于內核同頻,讀取帶寬為每周期 32 字節(256-bit),可支持 32 個待發 cache 請求。改變的地方主要是 L2 Cache 的電壓軌線與內核是分開了的。例如 Saltwell 內核的 Vmin 是 0.7 伏特,L2 Cache 則在固定的 1.05 伏特電壓軌線上跑,這樣的設計有助于減少 C6(最節電模式)電力狀態轉換時延。
8、頻率變頻粒度更精細。以 Z2460 為例,雖然 CPU 的最高持續頻率為 1.3GHz,但是頻率的變動范圍達到 1.6GHz,步進粒度為 100MHz;而之前的 Z600 系列頻率范圍是 0.2GHz ~ 0.8GHz 持續,最高 1.2 GHz。
9、Saltwell 和之前的 Bonnell 系列微架構同樣沒有專用的硬件整數乘法、除法單元,這些操作都是和浮點硬件共享。
10、在 Medfield 中還有一塊獨立分離于 512 KiB L2 Cache 外的 256KiB SRAM,位于不間斷模塊內,主要用圖像信號處理器存放圖像數據以及優化最低漏電。在 SOC 進入節電模式后,這塊 SRAM 還會被用于存放架構狀態,就好象 Saltwell 內核具備自己的 C6 SRAM 來存放 x86 狀態,這塊更大的 SRAM 則是存放整個平臺的。在進入 S0ix 狀態時,像圖形或者視頻編解碼器等單元都會被關掉,它們的狀態信息和配置信息都會保留在這塊 256 KiB SRAM 里。
第15頁:ARM Cortex-A5/Cortex-A7 微架構的特點
中低價位的智能手機勢必成為 2013 年亮點,海量的千元以下甚至 600 元以下的智能手機、平板電腦將會在這一年推出,不過因為成本限制,它們在各方面的規格必然比更高價位的產品有所削弱,其中之一當然是必定搭載的應用處理器。
中低價位市場是 ARM 所最擅長的領域,目前它的產品線中除了像當年 Apple iPhone 1 所使用的 ARM11 內核外,還有接替 ARM11 的 Cortex-A5 以及接替 Cortex-A8 的 Cortex-A7。
ARM 微架構對比 |
|
ARM11 |
Cortex A5 |
Cortex A7 |
Cortex A8 |
Cortex A9 |
Cortex A15 |
解碼能力 |
單路 |
單路 |
雙路 |
雙路 |
雙路 |
三路 |
整數流水線 |
8 級 |
8 級 |
8 級 |
13 級 |
8 級 |
15 級 |
亂序執行 |
否 |
否 |
否 |
否 |
是 |
是 |
浮點單元 |
VFP11
(流水線式) |
VFPv4
(流水線式) |
可選 VFPv4
(流水線式) |
VFPv3
(非流水線式) |
可選 VFPv3
(流水線式) |
VFPv4
(流水線式) |
SIMD(NEON) |
不具備 |
可選 MPE
(128-bit) |
可選 MPE
(64-bit) |
具備
(64-bit) |
可選 MPE
(64-bit) |
具備
(128-bit) |
半導體制程 |
90nm |
40nm |
40nm |
65nm/45nm |
40nm |
32nm |
典型頻率 |
412MHz |
0.3~0.8GHz |
0.8~1.2GHz |
0.6~1GHz |
1.2GHz |
2GHz |
1、Cortex-A5 是目前 Cortex-A 系列中最低階的內核,和 ARM11 的 1.2 DMIPS/MHz 性能相比,Cortex-A5 達到了 1.57DMIPS/MHz;
2、Cortex-A5 具備 ARM 最新的 VFPv4 浮點單元和 128-bit NEON 向量處理單元。,相比之下 ARM11 只有老式的 VFP11;
3、Cortex-A5 的制程為 40nm,面積是 90nm 制程 ARM11 的一半。
4、Cortex-A5 可以提供單核、雙核、四核等配置,像聯發科就做了一個價格非常低的 Cortex-A5 四核方案,在低價位手機市場里競爭力非常強大。
5、Cortex-A7 的 DMIPS 性能是 1.9 DMIPS/MHz,Cortex-A8 是 2.0 DMIPS/MHz。
6、Cortex-A7 具備硬件整數除法、虛擬指令、40-bit 內存定址能力,所有 Cortex-A15 的程序都能在 Cortex-A7 上執行。
7、Cortex-A7 和 Cortex-A8 類似集成了一個低時延(10 周期)的 L2 Cache。
8、Cortex-A7 的整數流水線是 8 級順序雙發射,分支預測單元比 Cortex-A8 更先進,因此在分支預測能力和分支預測失敗懲罰方面都會比 Cortex-A8 更好;
9、雖然不能像 Cortex-A8 那樣雙發射浮點或者 NEON 指令,但是 Cortex-A7 的浮點單元是流水線化設計。
10、在同樣的制造工藝節點下,Cortex-A7 的面積是 Cortex-A8 的 1/3~1/2。
11、Cortex-A7 能實現單核、雙核、四核等配置,而 Cortex-A8 只有單核配置。
12、Cortex-A7 在 ARM 的 big.LITTLE 策略中屬于伴核角色,就是給 Cortex-A15 作為低負荷工作的雜役。
從定位上看,我們相信 Cortex-A5 在低價智能手機市場上會有相當奪目的表現,而 Cortex-A7 作為非伴核的單獨產品時則更多的會在中低價平板電腦市場上攻城拔寨。
第16頁:移動圖形處理器形勢簡話
目前移動圖形 GPU 大致上有五個陣營,即 ImgTec PowerVR、ARM Mali、高通的 Adreno、NVIDIA GeForce ULP 以及 Vivante(中文名是:圖芯),由于 Intel 下一代 Atom 中將會應用自己的 GPU,因此很快就會擴展成為六個陣營。這里的 Vivante 的人是來自 NVIDIA 的,如果你仔細看 Vivante 的文檔就會發現 Vivante 的很多“市場行銷式術語”都和 NVIDIA 極其相似。
在這幾家廠商中,做移動圖形時間最長的當然是 ImgTec PowerVR 了。
不僅與此,PowerVR 對于許多九十年代中就已經接觸 PC 的游戲玩家來說也不陌生,當年的圖形加速卡概念剛剛被炒作起來,做圖形加速器(注意,不是板卡喲)的廠商多如牛毛。例如 ATi、Tseng Labs(代表作是 ET4000)、Rendtion(代表作是 Vérité 2x00)、3dfx(代表作是 Voodoo 2 三維加速芯片)、PowerVR、Bitboys、GigaPixel、Trident、S3 Graphics、3D Labs、Cirrus Logic、Alliance Semiconductor(代表作是大名鼎鼎的 ProMotion 6410,VCD 最流行的時候,6410 就是顯卡代名詞)、Matrox、Chromatic Research(代表作是 Mpact! 系列可編程多媒體芯片)、Number Nine(代表作是 Imagine 128,傳說中的神作,當時 2D 顯卡的巔峰一個是 Matrox,另一個就是 Number Nine),NVIDIA 在當時同樣也只是一家剛剛起步的公司。
這里有一張歷史樹圖:http://www.vgamuseum.info/images/stories/doc/historysm.png
PowerVR 在這眾多的圖形芯片公司中是一家很特別的廠商。首先它是以技術授權方式將設計轉讓給其他芯片公司,由其他芯片公司將設計物理化后成為真正賣給廠商的芯片,其次是 PowerVR 的渲染架構是分塊式延后渲染,理論上可以完全消除像素的無效重復渲染。
在當時,極少有圖形芯片公司是這樣的方式運作以及具備這樣的渲染技術,當然并不是說完全沒有,除了 PowerVR 外,還有一家名為 GigaPixel 的公司也是采用授權制和具備分塊式延后渲染(被稱作 Giga3D 架構,具備比當時 PowerVR 兼容性更高的分塊式延后渲染設計以及采用 eDRAM 的特點)的,不過這家公司出彩的時間沒有幾天就被 3dfx 收購,而 3dfx 的所有資產后來也被 NVIDIA 收購了,其中也包括 Giga3D。
第17頁:PowerVR SGX 54x MP4 GPU 微架構
PowerVR 的渲染模式是 tile-based deferred rendering(分塊式延后渲染)。
分塊式渲染(TBR)并不難理解,就是把畫面切成若干個 16x32 或者 16x16 的像素塊進行渲染,這樣的好處是可以在芯片上建立一個中間緩存(也可以稱作 Tiler Buffer,分塊緩存,里面用于存放當前渲染 Tiler(像素塊)的深度/蠟版幀緩存、色彩幀緩存、渲染對象等),不再需要片外的顯存來存放 Z-buffer,讓渲染過程中的讀寫盡量在片上完成,減少內存的讀寫。
由于在中間緩存渲染的時候都是很高的精度(IEEE 32-bit),減少了以 16-bit(例如 R:G:B=5-bit:6-bit:5-bit)幀緩存模式時在內存上進行透明混合等操作時的精度損失,因此 TBR 可以較低的內存讀寫和占用實現高品質的輸出。
ARM 的 Mali、當年 Bitboys 的 Glaze3D 都屬于 TBR,不過也僅此如此,它們并非 TBDR,仍然屬于 IMR(立即渲染器),只有有限的 HSR 能力(例如 Early-Z、Hi-Z 之類的技術),并不能完全消除無效渲染。
TBDR 是在上面的分塊式渲染(TBR)基礎上增加了對場景中當前屏幕畫面三角形的篩選分倉(binning)的步驟,將三角形的前后位置關系標記起來并存放于片外的顯存中,這樣就能實現將不可見面在進入著色渲染流水線之前剔除掉,實現完全消除無效渲染。
由于增加了分倉動作,貼圖和著色必須等待三角形可視性問題解決后才渲染,渲染上增加了時延,所以這種渲染方式被稱作分塊式延后渲染。
不過在 OpenGL 中缺乏專門的標記來指示一幀畫面什么時候開始和結束,所以 TBDR 對一幀畫面什么時候才接收到所有的三角形進行偵測將會有點麻煩,這會導致三角形分倉陷入迷失中。
在 Direct3D 中有 BeginScene() 和 EndScene() 這樣的標記,但是由于在幾乎所有的硬件上都沒有效果,所以開發人員都會懶得去用這些標記并且隨意地在這些界限外使用 z-buffer,這會導致 API 無法確保 z-buffer 中存放有效的數據。PowerVR 硬件本體雖然可以把 Z-buffer 存放在片外顯存中,但是代碼必須編寫正確。
TBDR 可以減少無效渲染、實現極高的低內存占用渲染輸出品質,但是它的缺點是需要做一塊容量不小的片上緩存和大量的晶體管確保 TBDR 時候的兼容性,因此 PowerVR 的芯片面積一般都比 GeForce 這類 IMR(立即模式渲染器)大不少,另一個麻煩之處在于行銷的時候,PowerVR 的紙面規格相當難看(當年 PowerVR3 就是搭配 SDR 作為顯存上市的,而此時市場上的許多顯卡都已經搭配 DDR 顯存了),當然這個可以透過一些媒體測試實證加以解決。

上圖是 PowerVR SGX54X MP4 的微架構圖,這個系列中的 PowerVR SGX 543 MP4 曾經應用于蘋果 iPad 3 中的 A5X 應用處理器中,MP4 表示它是以四內核形式組成的 GPU。
需要注意的是,PowerVR 說的內核是真正的內核而非 NVIDIA/AMD 那樣的把單個 ALU 都當成 core 的市場行銷術語,它這里的四個內核可以并行處理四個三角形渲染,NVIDIA 到了 Fermi(GTX 480)開始實現多三角形渲染,而 AMD 是在 Tahiti(7970)開始實現。
在 PowerVR 54x MP4 中,每個圖芯渲染計算單元被稱作 Multi-Threaded Co-Processor,對應 OpenCL 的術語就是 PE(Processing Element,處理部件)。每個 PE 每個周期可以完成兩個浮點操作。
每四個 PE 構成一個 Pipe(渲染流水線,因此 Pipe 本質上就是一個四路 SIMD),每個 PowerVR SGX54X 內核包括四個這樣的 Pipe,即 16 個 PE,故此 PowerVR SGX54X MP4 就有 64 個 PE。
因此如果 PowerVR SGX 54x MP4 運行于 300MHz 的話,浮點性能就是 38.4 GFLOPS。
即使是同一代的 PowerVR,不同的內核版本具體的實現細節都可能有些差別,例如 Pipe 內的 PE 數或者是每個內核內的 Pipe 數,例如 PowerVR SGX 554 MP4(Apple A6X 采用該 GPU)的每個內核有 8 條 Pipe 而非 PowerVR SGX 54x MP4 的四條。
PowerVR SGX 5 被設計成統一渲染結構,即幾何體頂點和屏幕像素計算都是由上面說的 PE 執行,這樣的好處是讓 GPU 內的計算單元可以盡量保持運作狀態,而不是像分離式架構那樣遇到非平衡負載的處理時候,VS(頂點計算單元)有時候在等 PS(像素著色計算單元)或者 PS 在等 VS。
根據 PowerVR 的資料,SGX 54X 的每個 Pipe 內有一個線程調度器(Thread Scheduler),每個線程調度器內有 16 個線程可供派發,每次可以派發其中的 4 個線程給下面的 PE 執行。
PowerVR SGX 5 系列中有明確的 API 支持規格的內核基本上都是支持 DX9.X,但是有一個特例,那就是 PowerVR SGX 545,可以實現 DX 10.1、OpenGL 3.2 支持。
如果資料沒有錯誤的話,PowerVR SGX 5 的 ALU:TEX 比例為 2:1,即每兩個 PE 就會配上一個紋理單元,因此我們這里的 PowerVR SGX 54x 單個內核具備 8 個紋理單元。
雖然說 PowerVR 微架構的資料并不是很多,但是相對于除了 Intel 的其他對手而言,已經是非常大方了。
第18頁:全文總結
在本文中,我們首先指出了當前手機、平板電腦所使用的應用處理器與平時大家接觸的電腦仍然存在巨大的性能差別,以性能來看的話,可能是 6~10 年的距離。
由于電池和散熱的限制,移動應用處理器不可能像臺式處理器那樣相對較少地考慮耗電問題,對移動應用處理器來說,所有的一切都得圍繞一個詞進行:省電。
省電不只光靠制程上的改進,還有芯片本身的設計也是極為重要的,例如英特爾的 Atom 在實驗室的時候采用了 6T(單位元六個晶體管)的 Cache 設計,速度和面積都不錯,但是為了省電,后來上市的產品轉用了 8T(單位元八個晶體管),這樣的設計會增加不少面積,但是更省電了,類似這樣犧牲芯片面積換取功率控制的措施在移動應用處理器上比比皆是。
不過差距并非完全來自于處理器本身,像 Android 這個操作系統,程序是跑在一個 Google 自己做的虛擬機上面,絕大部分 apk 的開發語言都是 Java,這使得問題變得更加嚴重。
在這個博客里,博主采用 C 和 Java 兩個版本的程序在 Android 上作對比,得出的差別是 C 版本跑了 8 秒,而 Java 是 57 秒。類似這樣的區別在 C 和 Java 的對比上其實比比皆是甚至往往會出現更加巨大的差別。
所以這邊架構師和半導體工廠絞盡腦汁做了一個性能/耗電比非常出色的產品,但是如果碰上使用 Java 來編寫性能敏感型應用的時候往往會被 Android 毫不留情地從工業時代打回石器時代,而臺式機這邊已經是太空時代,差距就這么明顯。
這就是一個整天吹噓所謂“手機看大片”的移動時代的悲哀,但愿可以快點結束。
寫了這么多東西,肯定有人不耐煩了:你說這么多屁話有啥用,直接告訴老子什么處理器最好不就得了。
就等你這句話,因為這個問題一點都不難回答。
從上面大家可以得知,軟件對性能的影響,所以從現實出發,我推薦大家都選擇 iOS 下的產品,因為這個操作系統對應的開發平臺基本上都是使用本機語言代碼編譯程序的。
這是一個技術正確的回答,但是“政治”上未必正確,因為 Android 的廠商實在太多了,相關的用戶群也是海量級,隨便一口口水就能把我給淹沒掉,所以還是需要給這個用戶群體推薦的。
如果以已經發布的產品,我傾向于像 N 記 Tegra 4 這個產品,它有一些比較特別之處。首先,它是集成了 Cortex-A15 四核處理器,這是高通 Krait 架構不可能相提并論的微架構,其次是它的 GPU 部分,雖然不太可能比得上 iPad 4 中 A6X 采用的 PowerVR SGX 554MP4,但是性能和其他同級產品的最快圖形內核相比應該也是叮當馬頭,要知道 Tegra4 的芯片面積只有 80mm^2 級別,而 A6X 已經達到 123mm^2。還有就是 N 記似乎和游戲業界比較熟絡,對于希望手機玩玩游戲的人來說更有保障。
什么?對游戲不感興趣,那就挑個聯發科的四核 Cortex-A5 手機好了,最省功夫。
由于 Ti、ST-愛立信的退出,現在移動應用處理器的廠商雖然看似熱鬧,但是已經露出了一些紅海的跡象,或者說骨頭變硬了、肉變少了,將來剩下的廠商必定是具備較強大技術儲備和充足資金支持的。
英特爾是最具這樣特征的公司,他們的下一代 Atom 腳步正越來越近,亂序執行的引入和比所有對手提前一年導入的 22 納米制程勢必引來業界對英特爾在移動應用處理器上前所未有的重視,至少對我來說就很有點當年 Pentium 升級 Pentium Pro 的期待。