2016.11.07 10:00

一窺 Intel Skylake 微架構,探究現代 CPU 的「內在美」

ADVERTISEMENT

CPU,一個現代人天天在用的元件。舉凡手機、筆電裡皆有其存在。然而,每當有新的 CPU 發表,我們關注於表象但華麗的數字,像是 Cache 的大小、CPU 的執行時脈以及採用幾奈米製程等。這一次,讓我們撇除以上這些外在事物,一探現代 CPU 的微架構這個「內在美」吧。

從 2007 年開始,Intel 所採取的 Tick-Tock 策略,不斷地提升個人電腦的計算速度。其中,Tick 為奈米製程上的演進,每次新產品發表,便是華麗的數字以及技術的炫耀。然而,在 Tock 時,卻沒有多少人關注微架構的改善。何不從現在起,一同認識 Intel 的 Skylake 微架構。

在先前介紹 CPU 時(),便說明 CPU 可以分成 3 個部分,分別為「控制單元」、「算數邏輯運算單元」與「暫存器」。控制元件會依據程式的指令,控制所要執行的功能。算術邏輯運算單元則負責進行各類運算。暫存器則分成兩類,分別儲存運算的資料,以及要接續執行的指令。

ADVERTISEMENT

現代的 CPU 也沒有脫離這一類的規範。當將 Skylake 的元件分類,如下圖,也區分成 3 大類。

控制元件是 Front End,算術邏輯運算單元是 OOO (Out Of Order)Execution Engine,快取記憶體則有儲存資料的 L1 DCache、接續執行指令的 L1 ICache 以及共用的 L2 Cache。那麼,各個元件的有什麼功能呢?就讓我們看下去。

ADVERTISEMENT

 

各元件功能為何?

首先,就從名字很有趣的 OOO Execution Engine 開始介紹。OOO(Out Of Order)是指在這一個運算單元裡面,指令的運行順序不會按照順序,盡可能地讓指令可以偷跑,讓 CPU 處於滿載狀態。為了可以更明確的知道 OOO 的優點,就從簡單的小數計算例子來看吧。

ADVERTISEMENT

在 in order 的 CPU 中,每一次皆只能執行一個指令。假設 CPU 在浮點數計算需要 5 個 CPU 循環,而且一次只能執行一個指令。進行這 4 個計算需要 20 個循環才能完成。那採用 OOO 技術的 CPU 呢?因為在 OOO 的 CPU 裡面,它有多個計算核心,可以預先執行沒有相依性的資料。

在這個情況下,4 個計算僅需 15 個循環便得以完成,大幅的提升效能。那麼在 Skylake 內部,OOO Execution engine 究竟長什麼樣子呢?它一共有 8 個執行小單元、4 個資料存取單元,以及 4 個計算單元。

ADVERTISEMENT

其中,每一個執行單元,皆有其可執行的指令,詳細的功能圖置於最後。

 

假的資料相依性,斷開連結的方法

在前個例子中,可以發現第 4 個指令其實和第 2 個指令的 x 不相干。第 4 個 x 實際上是運算新的資料。然而,在前一個例子裡,他卻需要等待第 4 個指令結束時,如果,可以將變數改名,將可以獲得更進一步的平行。

因此,在 Front End 裡面,有 Renamer 此一元件,負責將假的相依性剔除,以此獲得更多效能改善。然而,在 Skylake 內部,實際上只有 2 個浮點數計算單元。因此,這 4 個指令總共需要 12 個循環才能結束。和最一開始的 20 個循環相比,執行時間大幅的減少。

或許會有人說,這一類的功能一般的編譯器就得以完成了,何必需要新增這一類的硬體增添麻煩呢?原因在於,目前的編譯器為了讓編譯完成的程式,得以在多種 CPU 上執行,因此,他只會用到基本的暫存器,然而,在現代的 Intel CPU 中,有更多的暫存器可以使用,為了避免對軟體進行過多的更動,最後選擇於硬體端完成這一類的工作。

 

指令集的解碼器,切開硬體和指令集的關聯

在 Front End 裡面,除了 Renamer 這一元件外,還有一個指令集的解碼器。在指令集架構發展初期,曾經有過 RISC 和 CISC 的爭論。也就是指令集架構是越複雜越好,還是簡單就行。X86 架構,做為 CISC 的領頭羊以及 CPU 界的巨星,不斷地證明 CISC 的優異之處。

然而,在現今的 X86 架構中,CPU 底層硬體運行的指令,卻已經採用了 RISC 的概念。CISC 的最大擁護者的易位,便代表著 RISC 在指令集的爭論中勝出。那麼,究竟是如何將原本的 X86 指令轉換成硬體指令呢?溝通的橋樑,便是接下來要介紹的解碼器。

在 X86 架構內,有多種複雜的指令集會將數種功能結合在一起。以 Intel 所發表中的「 ADD  RAX, [ RBP+RSI ]  」為例子,它是將兩件工作結合再一起的指令。可以將其解讀成 RAX = RAX + LD[ RBP+RSI ]。也就是將資料從 RBP+RSI 中取出,並和 RAX 中的數值相加。

可想而知,此一解碼器可以將這兩個不同的工作拆開,分成取資料的指令以及數值相加的指令。解碼後的結果,就和 RISC 的想法接近,斷開複雜指令的鎖鏈!此外,簡單的 x86 指令也會被拆開來,重新組成硬體的底層指令。解析完的硬體指令,則有 micro-op 的別稱。接下來,便會有一個 micro-op 的序列,儲存解析後的指令。實際的 Front End 簡圖如下。

其中,有一個 Micro-op Cache 這個需要特別注意的元件。此元件是從 Intel Sandy Bridge 才加入。如其名,他是將過去曾經解碼過的指令存起來的暫存記憶體。在 Sandy Bridge 中,此一元件最多可以儲存 256 個 x86 指令,以及其對應的 micro-op。藉由 Micro-op Cache,可以減少使用頻繁之指令的解碼,大大提升計算的效能。

至此,對於 Intel Skylake 的「內在美」已經做了充足的介紹。最後,附上完整版的 Skylake 微架構圖。

(Source:)

(首圖來源:Intel

ADVERTISEMENT