對超執行緒幾個不同角度的解釋

長江CJ發表於2019-02-05

角度1:舉個例子

假設我是一個CPU,我現在需要process(吃)一些食物,我現在只有一張嘴。

假如我有多張嘴,肯定就可以process更多的食物。這就是multi-core processor所要想要完成的任務。但是由於某些原因及限制,有時候無法實現這種方式。

我只有一張嘴,我可以用手抓一片食物,送到嘴邊,然後在嘴busy的時候,抓起下一片食物,繼續送到嘴邊。如果出現這種情況:當我的嘴已經吃完那一片食物了,這個時候手還沒有將食物送到嘴邊,這時候我的嘴就處於空閒狀態。假如我有兩隻手,即使我的嘴並不能吃得更快,但我的嘴也不需要浪費任何時間,可以一直處於busy的狀態。這就是hype-threading(超執行緒),一個processor,然後加上很智慧的排程系統,使得processor可以一直處於busy的狀態。

超執行緒對單執行緒的任務,也就是後面一部分任務必須依賴於前面一部分任務,並沒有太大作用。

對超執行緒幾個不同角度的解釋

比如你要吃一個兩勺冰淇淋錐,你必須先吃掉上面的部分,然後才能吃下面的部分。在這種情況下,增加更多的嘴或者手,都是沒有什麼意義的。

對超執行緒幾個不同角度的解釋
與之相反的,吃很多糖果。吃紅色的糖和吃藍色的糖之間,是沒有任何先後關係的。如果現在我有多張手、多張嘴,肯定是可以更多吃完這糖果的。

在現實生活中,受益於超執行緒和多核處理器的常見任務有:

  • 編輯視訊
  • 3D渲染
  • 繁重的多執行緒任務

比如編輯視訊,視訊是一幀一幀的,完全可以在編輯這一幀的時候同時編輯另外一幀。

總結一下:超執行緒的目的,就是使得processor busy,充分利用CPU資源。所以,超執行緒並沒有他名字聽上去那麼神奇,

角度2:超執行緒之於CPU的意義

首先需要理清楚CPU核core的關係:

對超執行緒幾個不同角度的解釋
上面這張圖一圖勝千言,CPU(processor)是一個物理上的小盒子,裡面在物理上又分為多個core,每個core在功能上市獨立的,可以獨立執行自己的執行緒。不同的core之間共享一個3級快取、共享common bus。相比多CPU單核,單CPU多核的優勢在於不同的core之間可以共享一部分資源,之間通訊也要相對容易很多;缺點在於複雜度提升,因為共享自然就會牽涉到不同執行緒之間的協調、管理、鎖等問題。

超執行緒是intel開發的,已經有10多年的歷史了,它可以在同一時刻,執行兩個執行緒,從而提高了單個CPU core的效率。如下圖所示:

對超執行緒幾個不同角度的解釋

來簡略看一下CPU的發展階段: 剛開始,一個CPU只有一個core,一個CPU只能同時執行一個執行緒:

對超執行緒幾個不同角度的解釋

接著,CPU設計師開始往一個CPU裡面新增更多的core,現在一個CPU就可以同時執行多個執行緒了:

對超執行緒幾個不同角度的解釋

為了進一步提高CPU的效能,Intel又發明了超執行緒。超執行緒把一個物理的core,在邏輯上分成了兩個虛擬核(two virtual cores)。現在,在作業系統的眼裡,這個2核CPU實際上就是一個4核CPU了。

對超執行緒幾個不同角度的解釋
在作業系統眼裡,現在CPU有4個核,她可以把工作分攤給這4個(虛擬的)核。每個core都可以獨立地執行指令。 總結一下:超執行緒就是提高虛擬核的一種手段,減少了CPU處於空閒狀態的時間。

角度3:超執行緒是如何實現的

我們還是從最開始、最簡單的說起。

首先是單核CPU,樹莓派使用的就是單核CPU,但是樹莓派依然可以執行多工的linux系統。為什麼呢?實際上在底層,作業系統在不停地切換不同的任務,速度之快到讓你覺得他們是真的同時執行的。

然後是多核CPU,如上所說的,不同的core之間在邏輯上是獨立的,他們會共享一些資源。作業系統就可以給不同的core分發不同的任務,如果你要執行一個多執行緒的任務,你擁有的core越多,速度就會越快。

再然後就是超執行緒了。要在一個core上面實現兩個執行緒,那麼這個core該怎麼設計呢?

對超執行緒幾個不同角度的解釋
把一個core的前半部分複製一下,然後合在一起,再和後半部分拼接一下,這種情況下,我們就有了一個可以同時執行兩個執行緒的FRONTEND,或者以一個程式設計師更容易理解的角度來說,有了一個可以執行雙執行緒的api介面,對於作業系統來說,他可以"呼叫"這個介面,同時分兩個任務給這個core!這樣不就在一個core的基礎上實現了雙執行緒嗎?(當然,在最後,這兩個執行緒最終是需要合併的。)

把這種core組合一下,就成了多核CPU,且每個CPU都支援超執行緒技術。

對超執行緒幾個不同角度的解釋

接著再來看一個現實生活中的栗子:地鐵過安檢。

對超執行緒幾個不同角度的解釋
排了有兩個隊,但是隻有一個安檢員。分三種情況討論:

  • 對面那隊是空的,這種情況下我這一對可以很快通過。
  • 對面那隊阻塞了,這對我這一隊沒有影響,我們可以不受影響地通過。
  • 兩隊都是正常的,這個時候在安檢員那兒,就會產生競爭核堵塞。

把隊伍換成前面說的兩個FRONTEND介面,把安檢員當作是core,每個介面都能獨立得fetch指令,然後把指令傳遞給core。core在真正執行指令的時候,是會產生競爭的,**所以在效能上來說,一個有超執行緒能力的單核CPU,是無法和一個雙核CPU相比的。**只有當其中一個queue阻塞的時候,才能得到雙倍的效能。一般而言,有超執行緒的核,效能上是沒有超執行緒的核的1.25倍。

那麼我們來做一個計算題:一個6核12執行緒的CPU,和一個8核8執行緒的CPU,哪一個綜合效能要好一點?

  • 6核12執行緒,也就是6個有超執行緒能力的物理核,實際上可以相等於6 * 1.25 = 7.5個核
  • 8核8執行緒,就是8個核

所以,8核8執行緒的效能還要相對好一點。

關注我的微信公眾號

對超執行緒幾個不同角度的解釋

相關文章