天天看點

超線程_Hyper Thread超線程的種種

說起HT技術,這早就是15年以前的技術了,當下主流的X86 CPU大多數都支援HT技術。簡而言之,HT技術就是一個把實體CPU core虛拟成多個邏輯CPU并允許并行執行指令的功能。之是以寫這篇文章主要是回答幾個常見的問題:

  • 為什麼有HT技術,為什麼HT隻有單核心雙線程?
  • HT和真實的core到底有什麼差別?

首先第一個問題:X86到底屬于複雜指令集CPU CISC(Complex Instruction Set Computer)還是精簡指令集CPU RISC(Reduced Instruction Set Computer)?

這個問題還是有點“意識形态”的味道。RISC的指令集簡單精練,比較容易提升CPU頻率進而提升性能。這是一把雙刃劍,一方面過于簡單的指令意味着更高的開發、調優成本,沒有足夠經驗豐富工程師支援的CPU平台注定吸引力不足。反觀CISC這邊,一切都是相反的——難以快速地提升硬體性能,卻有大(lian)量(jia)的足夠經驗的工程師。

于是當今的X86搞定了一個相對騎牆的做法:使用者層面依然保留着CISC那冗長且強大的指令集,增加了一個Front-end,将CISC翻譯成RISC跑在底層電路上。這種方法一方面降低了軟體工程師的門檻,另一方面也同時保持住了x86沿用至今40多年的向下相容指令集或者說曆史包袱。使用者層的代碼通過編譯器譬如C/C++得到的CISC指令集代碼稱為機器碼,而内部的RISC指令集則稱為微碼。這裡要指出的是,“更新微碼”事實上隻是更新了從機器碼到微碼的編譯器,并不是直接字面意義上修改什麼指令。

一句題外話,跟X86作為CISC的扛把子一樣,ARM作為RISC界的扛把子也在RISC之上實作了部分的CISC的指令集,殊途同歸。——可笑的是這兩家還是市場上的冤家,隻是因為現在實在找不出其他家的産品可以達到這個市場占有量了。

說了半天,貌似這些指令集的事情跟HT一點關系也沒有,其實不然。

CISC的指令比RISC重很多,借鑒了工業化流水線的思路,一條CISC可以被翻譯成若幹RISC指令。于是CPU内部處于加速指CISC速度的原因采用了多種技術:

  • 內建了多個處理單元執行不同的RISC,達到了并行化RISC的目的。
  • RISC微碼經過解耦之後,支援亂序執行,執行時間規劃,分支預測等時間統籌方法。
超線程_Hyper Thread超線程的種種

上圖是某代X86平台執行引擎的示意圖。 scheduler是負責時間規劃的排程器,相當于企業的銷售部門。有0-7總共8個端口并發執行微碼,端口在這裡可以了解為工廠的工廠中的房間。如果留意到端口之後的處理單元的話,你會發現不同的處理單元的數量是不一樣的。不同配置的處理單元可以了解為各個工廠中的房間職責的不同。比如INT ALU整數加減單元就大于INT MUL整數乘單元,這是綜合了實作複雜度、處理時間、指令統計占比等多重考慮的結果。同時,理論上多條指令隻要沒有依賴性,存在空閑的執行子產品就可以并行操作。這就好比一個流水線上生産的某一個通用螺絲,它本身并不在意會被用在産品A還是産品B上。

在OS層面上,線程的實作本身就是軟體上降低依賴性,提升并發度的方法。而“假裝自己是兩個處理器”是最簡單的硬體解耦,于是HT技術就這麼産生了。首先解碼邏輯核心1的機器碼,送入執行單元,等待結果的同時解碼邏輯核心2的機器碼,如果出現的空閑的執行單元恰好是邏輯核心2的微碼需要的,就直接送入執行單元不必一定要等待邏輯核心1的代碼完全執行完畢。這一來一去,兩個邏輯核心變得相對獨立了。

回答另一個問題,決定一個實體核心的HT數量有幾個限制條件:

執行單元的限制,從上面的介紹你應該有這個概念。假設一個實體核心上的兩個邏輯核心都搶占某個處理單元,那邏輯上的“并發”就無從談起。

執行時間的長短,即便是等價于RISC指令的微碼,每個微碼的執行時間也是長短不一的,比如ALU加減法和MUL乘法的門電路實作就比DIV除法的門電路實作簡單的多,一條除法運算的時間足夠做幾條加法計算的。并發在這個時候就是有意義的,如果所有微碼的執行時間都是一緻的,“共線生産”的方式就變得低效率,執行時間規劃和分支預測就意義不大了。

還有就是,目前2HT的設定還考慮到了Front-end的解碼能力和CPU的占空比,這是相對宏觀的設定。即便在當下的L1緩存下,CPU訪存照樣還有3個cycles左右的時延,這個過程中完全可以執行多條其他邏輯核心的指令。

以上可知,HT的初衷是“不讓RISC執行單元空閑下來”,而諷刺的是為了提升HT性能,近幾年備援的RISC執行單元卻越來越多。這似乎成了x86平台曆來的詛咒。從ALU的數量上以及目前指令中front-end耗時占比來看(推薦我的另一篇文章),HTx4 似乎也不具備實作上的難度,1 phy-core = 2 logical-core 更多的像是一個妥協下的産物。

牛頓:我能看的更遠,是因為我站在巨人的肩膀上! X86 CPU架構師:我看的不遠,是因為巨人站在我肩膀上……

--原文2019/02/22 釋出于開源小站

Hyper Thread超線程的種種​www.litrin.net

超線程_Hyper Thread超線程的種種

---

20190312 update:

補充農企這邊的架構,與牙膏不同的是dispatch是包含在front-end裡的,而且劃分為整數單元和浮點數單元兩個大部分。萬變不離其宗,CISC轉RISC以及,不讓RISC執行單元閑置的哲學是一緻的。

超線程_Hyper Thread超線程的種種