超線程
在2021年,應該已經沒有人會問出為什么我購買了一顆四核心的i3-10100,卻能在任務管理器看到八個框框這種問題了,隨著牙膏廠在初代酷睿I系列開始重新加入超線程技術,超線程已經不知不覺在消費級市場存在了十多年,并已經成為大家見怪不怪的功能。眾所周知八個框框就是比四個框框性能高(FX系列除外)。(首先,牙膏廠的超線程(HT,Hyper-Threading)其實更應該叫做同步多線程(SMT,Simultaneous Multi-Threading),至少AMD也是這么叫的,只不過大家超線程喊習慣了,包括我)


超線程技術在2002年就被牙膏廠安排進了奔騰4 HT中,據我所知這是消費級桌面平臺第一款超線程處理器。只不過由于當時的超線程技術不成熟以及缺乏軟件和操作系統的優化支持,這顆奔騰4的超線程大部分情況下是負提升,因此intel之后雪藏了這個技術,直到2008年推出全新的酷睿i系列,超線程技術重回消費級市場,并且一直沿用至今。如今的第10、11代酷睿已經下至i3上到i5全系支持超線程,在2017年奔騰G4560的推出也標志著奔騰系列正式支持超線程,似乎只剩下賽揚時至今日依然不支持超線程了(笑)。而隔壁AMD在翻身之后的初代Ryzen開始支持超線程,ZEN3則實現了全系超線程支持。
超線程最明顯的特征,就是能讓任務管理器看到雙倍于核心數量的框框(當然IBM甚至能1核當8核用,這里就不提了)比如四核心的i3-10100在任務管理器里可以看到八個核心。系統或者軟件會認為i3-10100這個處理器就是八個核心,并且也會按照最多八個核心的“事實”去調度應用程序的運行。
超線程技術的基本原理
這里不得不提到兩個概念:進程與線程。我就不帶大伙復習操作系統了,不然這可不是一個圖文就能講明白的,簡單來說,你們可以把進程看做是一個正在運行的程序,而線程是這個程序執行的最小單元。一個程序有許許多多的功能,那么這些功能可以交給多個線程分別執行,因此一個進程可以包含一個或者多個線程。
講一個常見的例子:高速公路收費站,有車道+收費站+收費站的工作人員。一輛輛汽車(指令隊列)排隊進入收費站(前端發射單元),收費站需要核驗汽車信息和收費(指令解碼),并指定汽車去前方哪一條車道(執行單元:ALU運算器、FPU運算器、Cache……)


而CPU最小的執行粒度就是線程,一般來講一個物理核心同一時刻只能執行一個線程,也就是說,這個高速公路只能同時檢查收費一輛車,并且指定一次車道,而當第二輛車進來時,需要等待第一輛車跑出這段車道,再放行第二輛車。這時候我們可以注意到,一輛車只會占用一個車道,而其他車道都是空著的,也就是說車道資源被大大浪費了。
這時候,領導一拍大腿:收費站現在只有一個,那我們在旁邊再建一個!于是收費站變成了兩個,當第一個收費站放行了車輛1到車道1之后,第二個收費站發現車輛2需要進去車道3,那么車1和車2就能在互不干擾的情況下在車道同時跑了。而這大致就是超線程技術的實現方法。


好了,你已經明白了超線程技術的基本原理,現在我們來動手設計一顆SIMD五級流水線RISC處理器吧!
通過超線程技術,處理器可以利用其他指令執行時閑置的執行單元丟入其他指令執行,盡可能的充分利用一個物理核心的全部部分。原本CPU在執行一個線程時用不到的單元是閑置的,通過超線程技術可以盡量榨干CPU的每一寸晶體管。英特爾曾經說超線程技術只需要增加約5%的核心面積,便可以增加約20%的多線程性能。視操作系統的調度和應用程序的優化,這個性能的提升幅度也不全相同,但終歸不會再出現早年奔騰4HT那樣開啟超線程負提升的情況了。并且隨著超線程技術的進步和應用程序多線程優化水平的進步,超線程無論是在游戲還是生產力中都有了很明顯的性能表現提升。
農企5600X
以農企5600X為例,這是一顆6核心12線程的處理器 我們分別在BIOS中關閉和開啟SMT Mode,并運行象棋跑分和cpu-z跑分,結果如下:


關閉超線程


打開超線程
可以看到超線程開啟帶來的性能提升約在30%左右,已經完全可以看做多出來憑空兩顆物理核心了(10600K VS 9700K)
牙膏廠10100F
至于牙膏廠這邊,我拿10100F試了一下cpu-z
,多線程提升似乎比AMD少那么一點點




當然,一個核心“虛擬”成兩個核心,也會對多核調度水平有更高的要求。分別放入同一個物理核心的兩個虛擬核心和放入兩個不同物理核心執行,其性能差距十分巨大。上面已經通過跑分證明多線程也就帶來30%左右的提升,并不是一個核心可以完全當作兩個核心用。以下是通過任務管理器限制程序處理器在一顆核心的兩個線程運行和兩個核心上運行得到的跑分,可以看到被限制在同一個物理核心上,性能只有真正的雙核運行的70%的性能。




而當通過限制程序運行在3C6T和6C6T上時,同樣會得到相似的數據,我已經拿牙膏廠U和農企U都試過,在任務管理器里同一個物理核心的兩個邏輯線程是相鄰的,比如CPU0和CPU1是第一顆物理核心的兩個邏輯線程,CPU2和CPU3是第二顆物理核心的兩個邏輯線程,以此類推。通過在任務管理器詳細信息的進程右鍵菜單設置相關性,限制進程的核心分配并進行測試,可以復現我的結論。
當然啦,以上測試只是一時興起,隨手測試,沒有嚴格控制變量,后臺還開掛個QQ,任務管理器的圖表顯示也會占用一部分處理器資源,所以,大家圖一樂就好。
簡單回答一些可能的疑問
Q1:這么牛逼的技術,為什么沒有完全普及呢?
A1:超線程技術相對更適合一些流水線冗長復雜、執行單元眾多的架構,用于提高晶體管利用率,一些比較簡單的架構就算加入超線程技術,也沒啥卵用,還不如省下來空間多做一個核心。
Q2:為什么手機處理器沒有做超線程?
A2:其實手機處理器有,以前聯想出過,搭載的Atom Z2580 2C4T處理器(但是反響似乎一般)。順帶一提ARM也有cortex-A65AE,支持超線程,過不是做給手機的。我懷疑是因為八核心聽著比四核心八線程強所以沒搞。另外相比于超線程,移動終端為了閑置續航和功耗,用的是big.LITTLE大小核解決多任務并行,多余的任務直接丟后臺讓小核跑,比一個大核心分出來倆超線程要省電。
Q3:超線程會不會損失單核性能?
A3:理論上,會的,當一個物理核心的一個線程運行時,另一個線程如果需要執行新任務,一旦發生資源占用沖突,勢必會影響速度。在高負載時這個現象尤為明顯,我試了5600X單核象棋4300分,而單核雙線程象棋6000分,相當于單線程性能降低到了3000分,當然以上只是極端情況,對比我前面的CPU-Z測試截圖,低負載下超線程開啟與關閉對于單核性能的影響有限,5600X完全可以看做測試誤差,10100F影響大一點約莫5%,但是相比超線程帶來的接近30%的性能提升,這點損失不算什么。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。