“超線程(hyper-threading)”實際上是Intel的專有技術(shù),這一類通用技術(shù)名稱叫SMT(同時多線程)——顧名思義,就是在一個CPU核心上可以同時并行多個線程,就操作系統(tǒng)看來,1個物理核心等同于多個邏輯核心。相對的,傳統(tǒng)非SMT(或者叫Temporal/Interleaved Multi-threading)在同一時間內(nèi)1個核心就只能跑1個線程。
在這個時間點談SMT或超線程技術(shù),主要是因為年底即將到來的,Intel面向PC的下一代酷睿Ultra處理器Lunar Lake,不再支持超線程/SMT技術(shù)。要知道,Intel的超線程技術(shù)是從2002年的奔騰4時代就開始的,那這會兒怎么又不再支持超線程了呢?

4核心8線程
當(dāng)然,我們很難斷言未來Intel是否還會重返超線程設(shè)計,而且至少到目前為止采用P-core的至強6處理器仍然是支持超線程的;我們也無力簡單判斷SMT在現(xiàn)代CPU設(shè)計中是好或不好。借著這個機會,本文嘗試掰扯掰扯SMT的歷史,并揣測一下Intel在Lunar Lake處理器上棄用超線程的原因。
超線程的歷史,和技術(shù)實現(xiàn)
多線程CPU的提出最早可以追溯到上世紀(jì)50年代,而SMT同時多線程的設(shè)計,最初是IBM在1968年一個名為ACS-360的項目上提到的。所以這又是個很早就已經(jīng)被拿來討論的技術(shù)。
原本最早要商用的SMT處理器是當(dāng)年DEC開發(fā)的Alpha 21464,但這顆處理器因為各種商業(yè)收購相關(guān)的因素并為真正問世。所以Intel的至強和奔騰4的確就是商用產(chǎn)品中,最早支持SMT/超線程的CPU芯片了。
Intel的超線程技術(shù)具體支持到1個核心同時跑2條線程。大部分對Intel熟悉的讀者應(yīng)該知道,Intel一直在說超線程設(shè)計實現(xiàn)了30%的性能提升,且晶體管或面積代價遠(yuǎn)低于30%的投入。爾后就沿用至今了。

不過SMT技術(shù)并非只能做到1個核心同時跑2個線程。比如IBM當(dāng)年挺多處理器設(shè)計都能做到1個核心同時跑4個線程的;Intel的Xeon Phi也是所謂的4-way SMT;IBM POWER8甚至做到了每個核心同時跑8個線程。Oracle當(dāng)年的SPARC T系列也可以做到1個核心跑8個線程——不過似乎一部分是通過時域交錯所謂的fine-grained threads實現(xiàn)的。
此前我們也關(guān)注到國內(nèi)的合芯科技在做“SMT8”,12個物理核做到96個邏輯核的效果。
這里略微提兩個在單核多線程技術(shù)領(lǐng)域相對特殊的方案。其一是早年AMD的Bulldozer推土機微架構(gòu),算是一種“部分SMT”設(shè)計。因為推土機架構(gòu)的1個“核心”內(nèi)(或2個核心),有2個整數(shù)模塊和1個FPU模塊,并共享L2 cache。
這樣一個非常規(guī)的“核心”采用一種叫“Clustered Multi-threading”(CMT)多線程技術(shù),即對FPU和L2 cache而言是SMT,但是對整數(shù)模塊而言就屬于非SMT設(shè)計了。當(dāng)然當(dāng)代的AMD Zen在SMT思路上就和Intel的超線程一樣了。
另外值得一提的是,IBM的某些SMT設(shè)計更為復(fù)雜,“SMT引擎”可以動態(tài)開啟或關(guān)閉。因為對于某些類型的應(yīng)用負(fù)載而言,SMT反而會導(dǎo)致性能下降,則此時可以自動關(guān)閉SMT。2010年IBM基于POWER7發(fā)布的系統(tǒng),每個核心可以同時跑4個“同時智能線程”,還可以在1線程、雙線程、4線程間切換。
這里簡單聊聊SMT的實現(xiàn)。很多文獻(xiàn)資料都提到,SMT的實現(xiàn)并不需要過多更動基礎(chǔ)的微架構(gòu)設(shè)計——不知道當(dāng)代核心的微架構(gòu)實現(xiàn)是否還如此,起碼Arm認(rèn)為SMT在大核心上的實現(xiàn)邏輯不劃算。SMT在核心微架構(gòu)層面,具備單周期內(nèi)從多個線程獲取指令的能力,當(dāng)然還要有配套更大的寄存器堆來保存多線程的數(shù)據(jù)。
對SMT在核心微架構(gòu)層面的具體實現(xiàn)感興趣的讀者,推薦去看一些SMT的核心公開設(shè)計。比如1997年一些研究人員基于MIPS R10000做了SMT的模擬設(shè)計;近代的也可以去看一看Arm Neoverse E1處理器,這款處理器所用的Helios核心就支持SMT——對于通用、矢量和系統(tǒng)寄存器及其對應(yīng)架構(gòu)做了資源擴(kuò)展。

Arm Neoverse E1的多線程方案
總之SMT結(jié)合了寬發(fā)射超標(biāo)量和多線程處理器特性。沿襲自超標(biāo)量的,是每周期要發(fā)射多個指令;來自多線程設(shè)計的,則是需要包含針對多個線程的硬件狀態(tài)。最終,處理器能夠在每個周期,都從多個線程發(fā)射多條指令,實現(xiàn)針對某些負(fù)載更好的性能:對于相互獨立的程序而言,實現(xiàn)了整體吞吐的提升。
另外,這種設(shè)計對于1個線程獨占1個核心,也能實現(xiàn)所有資源的利用,相比非SMT的設(shè)計基本保持了相同的單線程性能。SMT的整體思路,是在確保單線程性能的基礎(chǔ)上,結(jié)合指令級并行+線程級并行。來自不同線程的指令,也可以在相同的pipeline管線階段同時執(zhí)行。
于是SMT實現(xiàn)了處理器閑置計算資源的更充分利用,提升了吞吐;從更系統(tǒng)的層面來看,SMT也就是同時跑多任務(wù)或者某些復(fù)雜任務(wù),也就提升了整體的性能。
Arm與超線程的那點淵源
沒錯!Arm其實也有SMT設(shè)計的IP,雖然當(dāng)代基于Arm CPU IP的芯片的確罕有SMT設(shè)計的。蘋果、高通、聯(lián)發(fā)科的處理器基本上都是一個核心同一時間只能執(zhí)行一個線程,一個蘿卜一個坑。就連英偉達(dá)面向AI HPC的Grace CPU也是如此。基于Arm的例子,SMT提高吞吐應(yīng)當(dāng)也更容易理解。
Arm至少有兩個處理器IP是支持SMT的:Cortex-A65和Neoverse E1。比較反直覺的是,這倆IP的定位都不是高性能、寬架構(gòu)設(shè)計。從基礎(chǔ)設(shè)施部署的負(fù)載類型角度來看,Arm似乎是有意要切分“compute”計算用例,和“throughput”吞吐負(fù)載的。后者主要是指大量數(shù)據(jù)的處理工作——也是Neoverse E1的目標(biāo)應(yīng)用場景。
Arm對此的解釋是,在大量數(shù)據(jù)處理負(fù)載中,cache miss(緩存未命中)很常見,無論是車載Cortex-A65AE處理來自大量傳感器的數(shù)據(jù),還是Neoverse E1使用過程中來自網(wǎng)絡(luò)基礎(chǔ)設(shè)施的數(shù)據(jù)。CPU也就需要處理內(nèi)存訪問延遲比較久的情況,在CPU管線中帶來stall。那么能夠處理第2條線程,也就在帶來了很好的吞吐收益,減少執(zhí)行資源的閑置和浪費。

但其實Arm沒少吐槽過SMT/超線程技術(shù)在某些場景內(nèi)的應(yīng)用。比如發(fā)布Neoverse N2/V1的時候,Arm就在發(fā)布會上提過,不用單核心的SMT而更多基于多核來提升吞吐,能夠提高可預(yù)測性(predictability)。
前不久的至強6(E-core版)發(fā)布會上,聯(lián)想作為OEM廠商代表也提到,1個核心1個線程有“確定性”,“因為每個線程就在獨立的核上跑”,“確保業(yè)務(wù)負(fù)載有確定性的線性預(yù)期。”
說大白話就是,SMT有時面臨線程間的資源爭搶。對于操作系統(tǒng)而言,邏輯核心負(fù)載過半,它會認(rèn)為仍有充足的核心資源可供利用,但此時物理核已經(jīng)被占滿。當(dāng)負(fù)載持續(xù)提升,則性能表現(xiàn)就不再呈線性——因為后續(xù)是以SMT的方式跑更多線程。甚至在負(fù)載70%以后,系統(tǒng)就面臨崩潰或出現(xiàn)性能顛簸。
當(dāng)然了,這還是和具體跑什么樣的負(fù)載類型有很大的關(guān)系。其實Arm早在2013年就發(fā)過一份技術(shù)文檔,詳述了對于追求能效、功耗敏感的移動應(yīng)用而言,多線程技術(shù)是不適用的。當(dāng)年Arm還沒有像現(xiàn)在這樣,把勢力范圍看向HPC領(lǐng)域。
或許在Arm于這個世代走向PC、數(shù)據(jù)中心等更高算力需求的新場景時,大部分情況下沒有選擇超線程, 與其發(fā)端自嵌入式和移動應(yīng)用有關(guān)。當(dāng)年Arm寫的這份文檔,即便是現(xiàn)在看來也還是頗有參考價值的。
這份文檔當(dāng)然首先還是明確了PC領(lǐng)域普及超線程技術(shù)的正確性的,“但是”——話鋒一轉(zhuǎn),這份文檔從第3頁開始,后面就基本是在談SMT技術(shù)于移動應(yīng)用的不利之處了。其實以前大家對SMT的普遍看法也都是,該技術(shù)不適用于功耗敏感型應(yīng)用。而現(xiàn)在或許有更進(jìn)一步的商榷余地,畢竟某個不大能提、基于Arm的手機芯片SoC的CPU部分就已經(jīng)開始用SMT了。

Intel與Arm的“英雄所見略同”
有關(guān)超線程的好處,20世紀(jì)末到21世紀(jì)初有太多的研究文章了,比如前文提到IEEE發(fā)表的Simutaneous MultiThreading: A Platform for Next-Generation Processors,詳細(xì)將SMT與傳統(tǒng)的超標(biāo)量、時域多線程(非同時多線程)、多處理器方案做了比較,結(jié)論是SMT比后面幾種方案明顯更優(yōu)。
以現(xiàn)在的眼光來看,這篇paper存在時代局限性。它發(fā)表于1997年,對比“多處理器方案”也給出SMT更優(yōu)的結(jié)論,是基于當(dāng)時的制造工藝和互聯(lián)技術(shù)限制。多處理器方案既不能像現(xiàn)在這樣堆料,也受制于處理器核心之間的互聯(lián)一致性問題。而且這畢竟是個模擬測試,1997年連商用的SMT處理器都還沒出現(xiàn)。
這篇paper只有兩段話提到了SMT設(shè)計存在的問題。基于該研究的模擬結(jié)果,“SMT管線相比于單純使用超標(biāo)量設(shè)計的方案,多出2個周期。所以當(dāng)僅1條線程在SMT處理器上執(zhí)行時會引入額外的延遲。”“但是SMT的單線程性能也僅比普通超標(biāo)量設(shè)計弱1%(并行負(fù)載)和1.5%(多程序設(shè)計負(fù)載)。精準(zhǔn)的分支預(yù)測硬件,和重命名寄存器共享池,讓額外的周期懲罰不會頻繁發(fā)生。”
另一個關(guān)鍵問題是,“SMT的資源爭用”。許多SMT的硬件結(jié)構(gòu),比如cache, TLB和分支預(yù)測表都在多個線程間共享。這種統(tǒng)一的組織結(jié)構(gòu),具彈性和更高利用率,因為執(zhí)行中的線程可以按照需求去使用。”...但是,“線程間(interthread)使用,導(dǎo)致共享資源競爭,可能更多發(fā)生cache miss、TLB miss和分支的錯誤預(yù)測。”
不過這篇文章總體上還是認(rèn)為,SMT設(shè)計是可以有效消除或隱藏大部分沖突的,額外的代價在SMT帶來的吞吐價值面前不值一提。

Arm的文檔也提到了SMT資源爭搶的問題,認(rèn)為SMT設(shè)計中每條線程的吞吐因此低于1條線程獨占1個核心的設(shè)計;而且SMT核心還需要加入更復(fù)雜的調(diào)度和管理結(jié)構(gòu),整體上帶來處理器效率的降低。“...處理器的管理和調(diào)度結(jié)構(gòu),對于復(fù)雜亂序處理器的能耗而言也是相當(dāng)大的組成部分”。
所以Arm認(rèn)為,如果只考慮吞吐問題,那么與其在大核心的這部分邏輯上下功夫,還不如用多個更小、更簡單、更高效的處理器核心來解決問題。所以更為有效的替代方案應(yīng)該是“使用兩顆具備較低單線程性能的處理器或核心”。顯然2013年的這份技術(shù)探討文檔,和1997年所處的半導(dǎo)體技術(shù)時代背景又極為不同了,即便這份文檔的探討場景是局限在移動應(yīng)用的。
對于需要“大核心”性能的應(yīng)用場景,Arm還做了個對比。比較其順序核Cortex-A7和亂序核Cortex-A12:對Arm的處理器IP熟悉的讀者應(yīng)該知道這分別是Arm的小核和大核設(shè)計。
Cortex-A12作為大核,有更多的硬件資源,包括寄存器重命名、執(zhí)行依賴追蹤等邏輯,實現(xiàn)了遠(yuǎn)高于Cortex-A7的單線程性能。當(dāng)然從單條指令執(zhí)行的能耗水平來看,Cortex-A12也因此更高。結(jié)合功耗和性能,Arm給出了兩種核心的相對功耗與性能柱狀圖:

一般我們說核心性能高50%(DMIPS,基于Dhrystone執(zhí)行的Million Instructions Per Second),功耗提升必然超過50%。另外更重要的是,這張圖中出現(xiàn)了2個Cortex-A7核心,以及Arm預(yù)計給Cortex-A12加上SMT設(shè)計以后,其功耗與性能變化。
“看一看給一個典型的亂序處理器核心增加多線程能力,在芯片面積、功耗方面的成本上,相對于性能吞吐紅利的情況。”Arm預(yù)計給高性能核心增加多線程能力,比如此例中的Cortex-A12,的確能夠帶來兩顆Cortex-A7核心相似的吞吐能力,但前者的功耗是后者的2倍,die面積則大10%。
我們認(rèn)為,這可能還是和當(dāng)年的核心微架構(gòu)設(shè)計思路有關(guān),另外也有Arm當(dāng)年宣傳big.LITTLE異構(gòu)核心設(shè)計的因素在。但這番說辭,其實在前不久Intel Lunar Lake技術(shù)解析會上,我們也聽到了。
Intel從酷睿12代(Alder Lake)也開始采用異構(gòu)核心設(shè)計,E-core負(fù)責(zé)高能效,P-core復(fù)雜高性能。至少在后續(xù)2-3代產(chǎn)品上,其中的P-core都仍然是支持超線程的。但在接下來要推的Lunar Lake處理器上,P-core卻不再支持超線程。
Intel的說法是,“E-core已經(jīng)證明了它是比超線程更有效的一種多線程加速手段。”“如果追求多線程性能,與其賦能超線程,還不如去做E-core。”這個說法幾乎與Arm當(dāng)年的說法如出一轍,即便2024年這個時點和當(dāng)年探討移動處理器時期的時代背景又大不相同了。而且一個是說PC處理器,一個是說手機處理器;一個的能效核規(guī)模比另一個大得多...

Intel說在這一代P-core去掉超線程以后,雖然每瓦性能只提了5%,還帶來單位面積的性能降低15%,但綜合考量單位面積單位功耗的性能(perf/power/area)則提升了15%。所以這是個挺劃得來的生意。而且Intel沒說的是,去掉超線程也簡化了操作系統(tǒng)的線程調(diào)度,以及在不同核心之間遷移的難度和復(fù)雜性。
SMT還會繼續(xù)走下去嗎?
Arm還在文檔中談到了更多SMT技術(shù)所需付出的代價。比如說前文提到的性能的“不可預(yù)測性”,或者要么增加硬件資源、芯片面積為代價;帶來節(jié)電設(shè)計的復(fù)雜化——這可能也是當(dāng)年Arm在功耗敏感型應(yīng)用上考察的重點;安全方面的風(fēng)險、邊際遞減效應(yīng)等…
比較有趣的是,其實在當(dāng)年的這份文檔里,Arm就提到了小核心反倒適合做多線程技術(shù)。原因是,對于很多存儲敏感(memory-bound)型負(fù)載而言,核心經(jīng)常要等待內(nèi)存中的數(shù)據(jù),諸如networking之類的負(fù)載明顯更適合小核心來跑。
“這樣的負(fù)載”…“能夠受惠于可以跑第二條線程,尤其是在其他線程處于stall狀態(tài)時。Stall是一種能耗浪費”…“這樣的系統(tǒng)不同于大核心的多線程”…“處理器核心中的大部分能耗是用在了關(guān)鍵任務(wù)的計算上,而不是用于管理開銷”。“相應(yīng)的,在第一條線程stall時,讓第二條線程跑起來就提高了效率”…
這不就是Neoverse E1的思路嗎?只不過是在10年以后才實踐了這一思路的。

有關(guān)SMT/超線程未來是否還會持續(xù)在PC、數(shù)據(jù)中心及網(wǎng)絡(luò)基礎(chǔ)設(shè)施中發(fā)揮作用,技術(shù)層面大概還有爭論的余地。也不能因為Lunar Lake不再支持超線程就說超線程沒有了未來。況且現(xiàn)在市面上采用SMT設(shè)計的處理器也還有不少,即便是非x86或Arm的。
不過我們認(rèn)為,一方面是以應(yīng)用為導(dǎo)向的芯片設(shè)計思路越來越明確:比如Intel這邊根據(jù)應(yīng)用場景差異,將至強6切分成不同核心版本,就是這種思路的體現(xiàn)。則SMT的未來在于更有針對性的應(yīng)用場景。
就芯片企業(yè)的動作可以再做更進(jìn)一步的觀察。比如說可以看一看Intel下一代至強處理器是否還會沿用P-core超線程設(shè)計,以及下一代面向臺式機的酷睿Ultra會不會重返超線程設(shè)計。
說到底,SMT的走向都在于它對芯片PPA權(quán)衡的價值;只不過這個命題的真?zhèn)卧诎雽?dǎo)體技術(shù)的不同發(fā)展階段可能也是不一樣的。
- 寫的太好了,非常感謝