CPU架構
要談超線程和多核,就不得不談CPU的架構和邏輯。無關的技術細節太多,這里略去。我們重點談一下CPU中兩個相關的模塊:
1)Processing Unit(運算處理單元),簡稱PU
2)Architectual State(架構狀態單元),簡稱AS
PU一般就是執行運算,比如算數運算加減乘除。AS執行一些邏輯和調度方面的操作,比如控制內存訪問等。
單核CPU(先從簡單的談起)
一般一塊傳統意義的CPU上會有一個PU、一個AS。
比喻:一個小飯館(單核CPU),夫妻老婆店,老板兼大廚廚房炒菜,老板娘兼服務員點單。這不,來了一個客人,首先,走到老板娘的收銀台前,看菜單准備點單。差不多5分鍾后,客人點完了一份蓋澆飯。老板娘抄好了單,遞給了在后廚的老公。老公開始炒菜。在這個例子中,老板娘可以理解成AS,老板/大廚可以理解稱PU(干實事的)。
多核CPU
這里說的多核,是多個物理核,比如i3的雙核,i5的4核。這中架構下,每一個物理核都有一個PU和一個AS。所以。對於i3來說,就有總共兩個PU,兩個AS。對於i5來說,就有總過4個PU,4個AS。
比喻:上面小飯館的列子,對於5、6個客人可能還能忙的過來。但設想一下子來他個16個客人,這隊估計要排到街上了。如果再告訴你,每10分種就有16個新客人過來點單。。。完了。生意估計是做不下去了 - 老板、老板娘忙到死。
這時,我們就需要一個更大的單位食堂(多核CPU
)。有4個服務生、4個大廚。4個服務生同時點單,4個大廚同時開炒(1號服務生專給一號大廚下單,二號服務神生專給二號大廚下單。。。以此類推)。這樣相比小飯館一個老板娘、一個客人隊列,這里成了4個隊列,效率頓時比小飯館提高4倍。16個客人,平均分配成4個隊列,每個隊列就只有4個客人了,情況是不是好了很多?
這個應該還是比較容易理解的。
超線程技術(HT)
超線程一般指的是硬件架構方面的:通過增加邏輯處理器5%的裸晶面積,模擬出兩個AS ,以此換來cpu15%~30%的性能提升。
簡單的說吧,在原來一個core包含一個AS和PU的基礎上多模擬出一個AS
比喻:剛剛那個單位食堂,4個服務生,4個大廚,4個隊列。會不會效率問題?
有!
設想每個客人都有看單選單的時候,你能保證每個客人都看兩眼就下單?有的客人難免會磨磨蹭蹭,問東問西,一個菜點它個15分鍾。而設想大廚平均炒一個菜只要10分種。那剩下的那5分鍾呢?大廚在廚房閑着沒事干,喝茶看報紙。時間全被客人-服務生點菜這個環節給浪費掉了。
那有沒有解決方法?我想大家應該都能猜出來了
--- 增加服務生!
這時候,我們給每個大廚多增加一個服務生,從一個服務生變成了兩個服務生(AS),服務生1A和服務生1B開兩個隊列,同時給一個大廚(PU)下單。這樣,當出現服務生1A的客人15分鍾單子都沒有下完的情況下,1B的客人單子很有可能3分鍾下好送給大廚開炒了(PU),這樣大廚就不會站在廚房傻等1A客人的訂單。這樣,最大限度地榨干大廚的勞動力 (大廚估計要罵娘了),而對於CPU來說,最大限度的提高了CPU的使用率,減少了CPU的(IDLE)空閑時間。有的時候,真不能怪大廚(PU)不賣力,而是你服務生(AS)叫單太墨跡。
在下圖中,橙色和藍色表明大廚(PU/CPU)是在工作的,白色格子表明大廚(PU)是空閑的。A圖是單核沒有沒有用超線程,B圖雙核沒有超線程,圖C是單核啟用了超線程。可以清晰地看到,從單核增加到雙核(在沒有超線程的情況下),CPU使用率並沒有增加。而用了超線程后,整體CPU使用率提高了,雖然只是一個核。
左邊的圖是單核超線程
,右邊的圖是雙核,不帶超線程。看出區別了吧?
現在來看實際中多核和超線程的相關問題:
1)i3 雙核4線程,和i5 4核4線程,是一回事嗎?
首先先說一下i3,i3是雙核,開了HT以后,變成4個邏輯核(4線程)。最新的Win10我不知道,但在Win7里面邏輯核是被顯示成物理核的,和i5一樣。那i3和i5一回事嗎?如果你覺得是一回事,那我上面的東東全都是白寫了。
i3是4個服務生兩個廚子,i5是4個服務生4個廚子,你覺得一樣嗎????
2)那i5 4核4線程,相比較開了HT的i7(4核8線程)一樣嗎?
i5是4個服務生4個廚子。i7如果開了HT,是8個服務生4個廚子。當然從CPU利用率尤其是運行多進程/線程程序上面來看,是開了HT的i7好。
3)那i5 4核4線程,相比較關了HT的i7(4核4線程)一樣嗎?
i5是4個服務生4個廚子。i7如果關了HT,也是4個服務生4個廚子。乍一看差不多,至少在大廚(PU)、服務生(AS)的數量上打成平手。但是i7的單核處理能力要稍強於i5,也就是說i7的廚子是特級廚子,i5的廚子的一級廚子。所以其實i5和i7還是有差距,但是從理論上來說,差距並不是特別大。
總結:理論上來說,i3和i5的差距是相當的大。而i5和i7差距主要是廚子(PU)質量的好壞和多出的那4個服務生。其實差距並不是像i5-i3之間的差距那么大。
4)那對與同一個CPU,比如i7,開了HT有什么優點:
- 並行能力增強:處理多進程/線程的能力加強,對於支持多線程的游戲提供比較明顯。
- CPU利用率增高:一般理論上,總體性能提高差不多20%-30%。從這個角度上看,i3開啟了超線程,提高了20%-30%整體水平。但是,這就意味着能和i5打成平手了??? 如果這是真的話,i5也不要賣了。兩個大廚(i3),不是我等拿個鞭子抽抽就能頂的上4個大廚(i5)的。。。。
5) 開HT有什么缺點
- 單核性能下降:
一般在5%-15%之間,主要表現在運行單線程程序。兩個AS的額外開銷比一個AS的開銷要大
比喻:只有一個客人來點餐,指定一號大廚,但你兩個服務生站在那兒,而這個客人可能就會過一下腦子,想想,我是找服務生1A呢,還是服務生1B呢?? 這么一想,半分鍾過去了。。。是不是還不如只有一個服務生來的簡單。
所以現實中我們超算系統測試跑分的時候一般都是要HT關掉的,因為追求極限性能。現在最新的CPU可以做到5%-15%的性能損耗,而老的超線程CPU,比如10幾年前的老奔騰4/志強,我見過單核性能超過50%的性能損耗的,啟動HT的額外開銷極大。
- 電費增加,一般功耗平均上升30%。你多請的4個服務生,不用給工錢???
- 在核特別多的情況下,比如雙槽服務器
的情況下,容易發生擁塞。
比喻:試想一個超大的食堂,有56個服務員(雙CPU,28核,56線程至強E5系列CPU),來了幾百個人過來,是不是會亂了套?大家剛進食堂一開始都不知道該排哪個隊了(一般決定排哪個隊,是操作系統定下的)。(在操作系統的安排下)一個客人,把56個隊列一條一條地查一遍,看看哪條隊客人最少就排哪條。。。。
我想問的是,現實中你去食堂打飯,假設有56個隊,你會一條一條的檢查,找出人最少的隊,然后再做決定嗎?估計你56條隊查完,15分鍾過去了,你的小伙伴飯都吃完了。這時候,是不是我將隊伍減少到28個隊,對你來說會相對容易一些?(當然28隊也還還是夠累的)
- 老系統支持的差
比如老的Win2008,Win2000,對超線程支持比較差。
比喻:如果食堂比較空,沒人。這時候來了兩個客人A和B來訂餐,結果兩個人分別跑到同一個大廚的兩個服務生1A和1B上排隊(一般這都是操作系統干的好事),你能發現哪兒不對勁嗎?
正確的做法應該是A去一號大廚(1號物理核),B去二號大廚(2號物理核)。你讓A,B都擠到一號大廚那里,二號、三號、四號大廚啥事沒有,閑到死,有意義嗎?
其實問題就在於,操作系統不能分辨物理核和邏輯核。看那里有兩個服務生,兩個隊列,就以為有兩個大廚,所以把客人A和B分別打發到1A和1B去排隊,完全不知道后廚的實際情況 - 究竟有幾個大廚。