CPU 個數、核心數、執行緒數

定義

  • CPU 個數即 CPU 晶片個數。
  • **CPU 核心數(core)**是指物理上,也就是硬體上存在著幾個核心。比如,雙核就是包括 2 個相對獨立的 CPU 核心單元組,四核就包含 4 個相對獨立的 CPU 核心單元組。
  • **執行緒數(thread)**是一種邏輯的概念,簡單地說,就是模擬出的 CPU 核心數。比如,可以通過一個 CPU 核心數模擬出 2 執行緒的 CPU,也就是說,這個單核心的 CPU 被模擬成了一個類似雙核心 CPU 的功能。我們從工作管理員的效能標籤頁中看到的是兩個 CPU。比如 Intel 賽揚 G460 是單核心、雙執行緒的 CPU,Intel 酷睿 i3 3220 是雙核心、四執行緒,Intel 酷睿 i7 4770K 是四核心、八執行緒,Intel 酷睿 i5 4570 是四核心四執行緒等等。對於一個 CPU,執行緒數總是大於或等於核心數的。一個核心最少對應一個執行緒,但通過超執行緒(Hyper Thread)技術,一個核心可以對應兩個執行緒,也就是說它可以同時執行兩個執行緒。

CPU 的執行緒數概念僅僅只針對 Intel 的 CPU 才有用,因為它是通過 Intel 超執行緒技術來實現的,最早應用在 Pentium4 上。如果沒有超執行緒技術,一個 CPU 核心對應一個執行緒。所以,對於 AMD 的 CPU 來說,只有核心數的概念,沒有執行緒數的概念。

為何要增加執行緒數?

robinround

  • CPU 之所以要增加執行緒數,是源於多工處理(multi-tasking)的需要。執行緒數越多,越有利於同時執行多個程式,因為執行緒數等同於在某個瞬間 CPU 能並行處理(concurrent)的任務數。因此,執行緒數是一種邏輯的概念,簡單地說,就是模擬出的 CPU 核心數。一個核心最少對應一個執行緒,但英特爾有個超執行緒技術可以把一個物理執行緒模擬出兩個執行緒來用,充分發揮 CPU 效能,即一個核心可以有兩個到多個執行緒。
    • intel x86:一核心有 2 個邏輯執行緒。
    • IBM power8:一核心有 8 個邏輯執行緒。

多核 CPU

  • 多核心 CPU 主要分原生多核封裝多核
    • 原生多核指的是真正意義上的多核,最早由 AMD 提出,每個核心之間都是完全獨立的,都擁有自己的前端匯流排,不會造成衝突,即使在高負載狀況下,每個核心都能保證自己的效能不受太大的影響,通俗的說,原生多核的抗壓能力強,但是需要先進的工藝,每擴充套件一個核心都需要很多的研發時間。
    • 封裝多核是隻把多個核心直接封裝在一起,比如 Intel 早期的 PD 雙核系列,就是把兩個單核直接封裝在一起,但兩核心只能共同擁有一條前端匯流排,在兩個核心滿載時,兩個核心會爭搶前端匯流排,導致效能大幅度下降,所以早期的PD被扣上了高頻低能的帽子,要提高封裝多核的效能,在多工的高壓下儘量減少效能損失,只能不斷的擴大前端匯流排的總體大小,來彌補多核心爭搶資源帶來的效能損失,但這樣做只能在一定程度上彌補效能的不足,和原生的比起來還是差了很多,而且後者成本比較高,優點在於多核心的發展要比原生快的多。

核心

  • 核心(Die)又稱為核心,是 CPU 最重要的組成部分。CPU 中心那塊隆起的晶片就是核心,是由單晶矽以一定的生產工藝製造出來的,CPU 所有的計算、接受/儲存命令、處理資料都由核心執行。各種 CPU 核心都具有固定的邏輯結構,一級快取、二級快取、執行單元、指令級單元和匯流排介面等邏輯單元都會有科學的佈局。

多核心處理器(Multi-core processor)

  • 又稱多核心微處理器,是在單個 CPU 中,加入兩個或以上的獨立實體中央處理單元,或稱核心(core)。這些核心可以分別獨立地執行程式指令,利用平行計算的能力加快程式的執行速度。只有兩個核心的處理器,稱為雙核心處理器(dual-core processor)。多核心通常是對於中央處理器 CPU 而論的,但是某些時候也指 DSP 和 SoC。
  • 把將兩個或更多獨立處理器封裝在一個單一積體電路(IC)中的方案稱為多核心處理器;而封裝在不同 IC 中的獨立處理器形成的計算機系統被稱為多處理器。
  • 多核心處理器 != 多處理器
  • 多核心處理器可以在不將每個核心分別獨立物理封裝的情況下進行多工處理(執行緒級併發處理(Thread-Level Parallelism, TLP),這種形式的TLP通常被認為是晶片級多處理。

單核多 CPU 與多核單 CPU

一台計算機的處理器部分的架構

  • 單核多 CPU,那麼每一個 CPU 都需要有較為獨立的電路支援,有自己的 Cache,而他們之間通過板上的匯流排進行通訊(一致性問題)。假如在這樣的架構上,我們要跑一個多執行緒的程式,不考慮超執行緒,那麼每一個執行緒就要跑在一個獨立的 CPU 上,執行緒間的所有協作都要走匯流排,而共享的資料更是有可能要在好幾個 Cache 裡同時存在。這樣的話,匯流排開銷相比較而言是很大的,怎麼辦?那麼多 Cache,即使我們不心疼儲存能力的浪費,也無法保證一致性。
  • 多核單 CPU,那麼我們只需要一套晶片組,一套儲存,多核之間通過晶片內部匯流排進行通訊,共享使用記憶體。在這樣的架構上,如果我們跑一個多執行緒的程式,那麼執行緒間通訊將比上一種情形更快。
    • 多個 CPU 常見於分散式系統,用於普通消費級市場的不多,多用於叢集系統(Clustered system)、雲端計算平臺。多 CPU 架構最大的瓶頸就是 I/O,尤其是各個 CPU 之間的通訊,低成本的都用 100M 乙太網做,稍微好一點的用 1000M 乙太網,再好的就用光纖等等,但無論如何速度和通量都比不上主機板的主線。所以多 CPU 適用於大計算量,對時間成本不敏感的任務,比如一些工程建模,或者像 SATI 找外星人這種極端的,跑上幾千年都不著急的。而且多 CPU 架構更簡單清晰,可以用消費級產品簡單做數量堆疊,成本上有優勢。而多核單 CPU 則適合對通訊 I/O 速度要求較快的應用,在相同核數量下成本上也高一些,好像只有在超級計算機裡會用到以萬為單位的核心數,普通消費級產品也就是到 16 核封頂了,因為成本控制的原因。