CPU微架構與CPU架構的區別?
微機原理
通常說X86架構、ARM架構、MIPS架構、Alpha架構、PPC架構等,這恐怕就是你說的CPU架構,其實也就是ISA架構,各家CPU公司所採用的指令集不同。
同樣指令集可以用不同的微架構來實現,例如酷睿系列處理器就有Sandy Bridge、Haswell等不同的微架構來實現,參見Intel Tick-Tock。當然,ARM也會有自己的微架構,其他CPU也會有自己的微架構。
默認題主知道CPU的指令集是怎麼用微代碼實現的哈。。。長話短說「微架構」——流水線
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 PPU23IBM PowerPC 717IBM Xenon19AMD Athlon10AMD Athlon XP11AMD Athlon6412AMD Phenom12AMD Opteron15ARM7TDMI(-S) 3ARM7EJ-S 5ARM810 5ARM9TDMI 5ARM1020E 6XScale PXA210/PXA250 7ARM1136J(F)-S 8ARM1156T2(F)-S 9ARM Cortex-A5 8ARM Cortex-A813AVR32 AP7 7AVR32 UC3 3DLX 5Intel P5 (Pentium) 5Intel P6 (Pentium Pro) 14Intel P6 (Pentium III) 10Intel NetBurst (Willamette)20Intel NetBurst (Northwood)20Intel NetBurst (Prescott)31Intel NetBurst (Cedar Mill)31Intel Core14Intel Atom16LatticeMico32 6R4000 8StrongARM SA-110 5SuperH SH2 5SuperH SH2A 5SuperH SH4 5SuperH SH4A 7UltraSPARC 9UltraSPARC T1 6UltraSPARC T2 8WinChip 4LC2200 32 bit 5
例如 Cortex-A15、Sandy Bridge 都分別具備 15 級、14 級流水線,而 Intel NetBurst(Pentium 4)、AMD Bulldozer 都是 20 級流水線,它們的工位數都遠超出基本的四(或者五)工位流水線設計。更長的流水線雖然能提高頻率,但是代價是耗電更高而且可能會有各種性能懲罰。
長話短說「微架構」——超標量既然流水線設計可以實現不間斷取指、解碼、執行、寫回,那為何不幹脆同時做幾條流水線一起取指、解碼、執行、寫回呢?這就引出了超標量設計。
上圖就是一個三路超標量四工位流水線的指令/周期執行示意圖,可以看到 CPI 從 1 變成 0.33,即每周期執行 3.33 條指令,這樣的改進幅度是令人著迷的,因此在初期的時候超標量甚至被人們讚美為標量程序的向量式處理。
不過在現實中不可能都這樣,因為現在的處理器執行不同指令時候的「執行」段工位並不完全一樣,例如整數可能短一些,浮點或者向量和 Load/Store 指令需要長一些,加上一些別的因素,實際大部分程序的實際 CPI 都是 1.x 甚至更高啊。
例如:
a = b * c
d = a + 1這裡的第二條指令需要使用到第一條指令的計算結果,因此必須等待第一條指令完成後才能跑第二條指令,更重要的是,在不少處理器上乘法指令並非一個周期而是需要多個周期才能完成。在遇到這樣的情況時,就不能實現多指令發射而且會出現流水線停頓。
當然,還有更複雜的情況:
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)中幾乎每條指令都具備條件執行功能。
長話短說「微架構」——動態調度為了充分利用由於分支以及長時延指令導致的流水線「氣泡(停擺)」而浪費的資源,人們引入了亂序執行(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。
假設我們有這樣的一段 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 向量方式實現。
長話短說「微架構」——數據級並行(SIMD)SIMD 就是單指令多數據的縮寫,理解起來並不困難,例如執行一條 SIMD 加法指令就能在一個周期里完成 64 條數據流發來的 64 個數字的加法運算。
SIMD 的初衷是為了攤薄大量執行單元上的控制單元成本,順帶減少程序的尺寸,因為SIMD 只需要複製一份代碼就能開跑,而多核處理器(或者說 MIMD)需要每個內核都複製一份代碼和在 cache 上共享多個程序拷貝。
SIMD 最好是用來跑結構相同的一堆數據,因此它是數據級並行的重要實現方式之一,而這類應用主要是多媒體為主,所以很多 ISA 都提供了專門的 SIMD 擴展來執行多媒體應用,ARM 有 NEON、Intel 有 MMX/SSE/AVX 等。
長話短說「微架構」——存儲系統分層結構無論是馮·諾依曼還是哈佛結構的處理器,最理想的情況下當然是有無限大的存儲空間和 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 上可以同時跑幾條指令,隨之而來的相依性等問題讓架構師們想出了分支預測、亂序執行、寄存器重命名等等技術來保證處理器的指令執行效率。
除了提高指令並行度來改善處理器性能外,還有數據並行、線程化並行等方法,但是後兩者都需要程序員和編譯器協助,並非免費。
影響處理器性能還有內存的帶寬和時延問題,因為取指和數據讀寫都必須透過內存訪問來完成,層階式設計是目前成本最為合理的方式。
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 寄存器。
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%。
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 納米或更先進)才能在手機、平板上變得比較適用。
高通 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 高通ARM11ARM Cortex A8ARM Cortex A9ARM Cortex A15Qualcomm ScorpionQualcomm 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)半導體製程90nm65nm/45nm40nm32nm40nm28nm典型頻率412MHz600MHz/1GHz1.2GHz2GHz1GHz1.5GHz在現實測試中,Krait 的表現和它的微架構一樣,提供了比 Cortex-A9 更強的性能,在對單線程性能較高的應用中,即使是雙核版的 Karit 都可以比四核 Cortex-A9 更快。
蘋果 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。
CPUiPhoneiPadiPod TouchApple TVISA內核晶元名稱"ARMv7s"Apple SwiftApple A6X 4 Apple A65 ARMv7AARM Cortex-A9Apple A5X 3 Apple A5 mini 4S253ARM Cortex-A8Apple A44142三星 S5PC1003GS 3(32/64GB) ARMv6ARM 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 上也有類似的動靜將會是值得關注的。
英特爾 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 cacheBonnell 採用超標量流水線設計,可以每個周期執行最多兩條指令,指令需要遵循一定配對原則才能實現超標量執行(類似於 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 里。
長話短說:Whether it"s exposed in the ISA manual.Credit to Prof. Christopher Batten.
不邀自答,歡迎指正:CPU架構就是指令集架構,是給寫彙編軟體(編譯器)的同事看的,我理解為可以被計算機識別並執行的一套規則。微架構就是這套規則的具體實現形式,對應於具體的CPU電路結構。對於同一個規則,為了提高、優化性能或其他不同的考慮等可以有很多不同的實現形式。所以往往一個公司的CPU指令集架構(軟體規則)兼容,而具體的微架構(硬體實現方式)不同。
隨便扯扯。。 計算機體系結構 指令集體系結構 和計算機微結構. 只是講講自己所了解的大致概念,想靠譜還是查資料看教材orz
先是最直觀的指令集體系結構,就是處理器的指令集設計。 指令集設計根據處理器功能的需要與機器的優化,從功能和實現複雜度之間的取捨 譬如以x86指令集舉例 x86指令集是一個典型的複雜指令集架構(CISC),包含大量的冗餘指令和複雜的定址方式。雖然x86在功能上設計得頗為全面但指令設計的過度複雜導致後期性能提升困難,不得不將指令在機器內部轉換成微指令執行(易於流水線分段,這一點後面提到)
計算機體系結構在以前主要就是說處理器的指令集設計,根本上講就是處理器的設計。 但實際上以前的人們低估了硬體實現對於計算機設計的重要性,計算機體系結構要考慮的遠不僅是指令集這麼簡單,應當包含三個方面:上面說的指令集結構,計算機微結構和硬體實現。
計算機的微架構在我看來包括硬體需要支持指令集所需要的最基本組成,實現所必須的性能優化,以及魯棒性 功耗和邏輯、物理實現. 這裡不能講得太籠統但太細節和偏題的方面就不講或略過了。
舉個例子,我想要設計一個基本的有加減與或非運算指令、訪存指令、跳轉指令和基本輸入輸出指令的小處理器(別的不考慮),那麼為了實現這個指令集,我需要一個ALU完成所有需要處理的數據的運算,一個BIU作為數據與外界交流的介面(包括存儲器讀取訪問和訪問外設),一個指令解碼器根據指令對不同模塊發出控制信號,以及各種存儲計算機內指令、數據、機器狀態的寄存器暫存器,以上就是這個計算機基本的組成結構。
接下來,我發現處理器在執行一個指令的時候,不少部件都在空閑。就像一群糕點師接到任務做一個蛋糕,每個人分工有序但是要麼工作沒輪到自己閑著要麼自己幹完了活閑著還有做蛋糕並不需要自己分到的工作而閑著. 於是糕點師們為了賺更多錢,便接了更多的單,細化分工 每個人都不讓自己閑著,除非自己的崗位幫不上忙或者前面的工序還沒完成。計算機也是如此,每指令的執行都可以分為幾個步驟:取指令,對指令解碼,執行和寫回,那麼設計計算機就可以根據這些步驟像工廠一樣給流水線分配流水段。再講下去講到並行設計和細節就偏題了,不講了大致概括一下性能的這一優化叫做並行開發,意思是讓機器的不同組件同時工作,而微架構的這種性能優化叫做指令級並行(ILP)的開發,相比之下還有基於處理不存在相關的數據的數據級並行(DLP),同時處理不同指令流的線程級並行(TLP)的開發和以機群開發的請求級、數據級並行,意在挖掘更多可以同時處理的數據。
最後一個物理和邏輯層面的實現就是硬體組成的底層實現,也就是數電模電。很顯然處理器硬體的基本實現也是遵循數字邏輯設計的,譬如沒有指令解碼這一環節,處理器如何知曉不同編碼的指令代表了對模塊的怎樣一系列操作呢? 繼續舉這個例子說明。現在機器讀取了一條Sub指令,存儲到指令寄存器後指令解碼器對Sub指令進行解碼,這個指令集有十條指令,代表二進位是四位也就是這個指令解碼器也是四位輸入十六位輸出(六條未定義指令). 假如Sub指令的操作碼排Add後面是0001,那麼便滿足輸出S1邏輯表達式的輸出條件S1=A"B"C"D於是S1輸出,在滿足了執行Sub指令的其他輸入條件諸如標誌信號時鐘信號後如同臨門一腳令與門發出一系列控制信號從而完成執行Sub指令的一系列操作…底層的優化包括物理層面的電路設計,邏輯層面的化簡電路邏輯表達式以及確保電路的穩定性也就是耐操性好。
扯得有點遠了,跟自己的知識量傾向也有關係。。計算機指令集架構 體系結構 微結構和底層實現之間的設計聯繫都是息息相關的,微架構和體系結構的設計也要考慮到對功耗成本的影響,總的來說 一個計算機的設計實現也就是其體系結構,包含了指令功能、實現指令功能的組件以及實現組件的硬體設計
重申一遍只是大致說說,還是以教科書為準一些不清楚或講錯的地方請一定指出來,因為是課餘興趣所致自學 跟科班難免有差距 歡迎探討指點_(:з」∠)_推薦閱讀:
※CPU GPU一個時鐘內最大會有多少比例的晶體管同時翻轉?
※當前的頂級手機cpu(比如高通820)和電腦cpu(i5,i7)相比,性能如何?
※如何看待英特爾將與AMD合作,在8代酷睿移動版中使用VEGA構架核顯?
※怎麼看 AMD 公司新發布的 zen 處理器?
※CPU為什麼沒有3核、5核、7核……?