多個CPU、多核CPU以及超執行緒(Hyper-Threading)
一、中央處理器
1.1 簡介
早期CPU由運算器和控制器組成,稱為中央處理機。隨著ULSI技術的發展,CPU晶片外部增加了一些邏輯功能部件,CPU越來越複雜,因此CPU基本部分有了運算器、cache、控制器三大部分,稱為中央處理器。
1.2CPU具有的功能
指令控制:由於程式是一個指令序列,這些指令的相互順序不能任意顛倒,必須嚴格按程式規定的順序進行。
操作控制: CPU管理併產生由記憶體取出的每條指令的操作訊號,把各種操作訊號送往相應部件,從而控制這些部件按指令的要求進行動作。
時間控制:對各種操作實施時間上的定時。
資料加工:對資料進行算術運算和邏輯運算處理。
1.3CPU的基本組成
1.3.1 控制器
1.3.1.1 組成
控制器由程式計數器、指令暫存器、指令譯碼器、時序產生器和操作控制器組成。
1.3.1.2 功能
控制器的功能:
(1)從指令cache中取出一條指令,並指出下一條指令在指令cache中的位置。
(2)對指令進行譯碼或測試,併產生相應的操作控制訊號,以便啟動規定的動作。比如一次資料cache的讀/寫操作,一個算術邏輯運算操作,或一個輸入/輸出操作。
(3)指揮並控制CPU、資料cache和輸入/輸出裝置之間資料流動的方向。
1.3.2 運算器
1.3.2.1 組成
運算器由算術邏輯單元(ALU)、通用暫存器、資料緩衝暫存器DR和狀態條件暫存器PSW組成。
1.3.2.2 功能
運算器的功能:
(1)執行所有的算術運算。
(2)執行所有的邏輯運算,並進行邏輯測試,如零值測試或兩個值的比較。
通常,一個算術操作產生一個運算結果,而一個邏輯操作則產生一個判決。
1.4 CPU的結構圖
二、多個CPU
貫穿這個數字計算機的歷史,我們一直以來的目標就是想要計算機可以做更多的事情,並且做的更快。因此在hyper-threading 和 multi-core CPUs出現之前,人們想到通過增加CPU的數量來增加計算機的計算機能力和速度,但是這樣的方法並沒有在個人PC中得到普及,我們只會在一些超級計算機或者一些伺服器上會看到這個多個CPU的計算機。因為多個CPU會需要主機板有多個CPU socket - 多個CPU被插入到不同的socket中。同時主機板也需要額外的硬體去連線這些CPU socket到RAM和一些其它的資源。如果CPU之間需要彼此通訊,多個CPU的系統會有很大地開銷
三、Hyper-Threading
3.1 簡介
由於多個CPU上面存在的缺點,因此它並沒有進入普通大眾的電腦中,因此消費者電腦的計算始終沒有達到並行的狀態,電腦的速度也一直沒有加快。直到多核處理器和Hyper-Threading技術的出現,才改變了這一點。Hyper-threading這個概念是Intel提出的,這家偉大的公司想把計算機平行計算的能力帶入到個人PC中,它第一次進入大眾PC的產品是2002年的Pentium 4 HT,最初的這款處理器僅有單個CPU核心,因此它一次只能做一件事情。但是Hyper-threading技術的出現彌補了這個不足。
Hyper-threading 有時叫做simultaneous multi-threading,它可以使我們的單核CPU執行多個控制流程。這個技術會涉及到備份一些CPU硬體的一些資訊,比如程式計數器和暫存器檔案等,而對於比如執行浮點運算的單元它只有一個備份,可以被共享。一個傳統的處理器線上程之間切換大約需要20000時鐘週期,而一個具有Hyperthreading技術的處理器只需要1個時鐘週期,因此這大大減小了執行緒之間切換的成本。hyperthreading技術的關鍵點就是:當我們在處理器中執行程式碼時,很多時候處理器並不會使用到全部的計算能力,部分計算能力會處於空閒狀態,而hyperthreading技術會更大程度地“壓榨”處理器。舉個例子,如果一個執行緒必須要等到一些資料載入到快取中以後才能繼續執行,此時CPU可以切換到另一個執行緒去執行,而不用去處於空閒狀態,等待當前執行緒的IO執行完畢。
Hyper-threading 使作業系統認為處理器的核心數是實際核心數的2倍,因此如果有4個核心的處理器,作業系統會認為處理器有8個核心。這項技術通常會對程式有一個性能的提升,通常提升的範圍大約在15%-30%之間,對於一些程式來說它的效能甚至會小於20%, 其實效能是否提升這完全取決於具體的程式。比如,這2個邏輯核心都需要用到處理器的同一個元件,那麼一個執行緒必須要等待。因此,Hyper-threading只是一種“欺騙”手段,對於一些程式來說,它可以更有效地利用CPU的計算能力,但是它的效能遠沒有真正有2個核心的處理器效能好,因此它不能替代真正有2個核心的處理器。但是同樣都是2核的處理器,一個有hyper-threading技術而另一個沒有,那麼有這項技術的處理器在大部分情況下都要比沒有的好。
3.2圖說超執行緒
在作業系統中,有多執行緒(multi-threading)的概念,這很好理解,因為執行緒是程序最小的排程單位,一個程序至少包含一個執行緒。本文將介紹CPU特有的超執行緒技術。簡單來說就是,多執行緒比較軟,超執行緒比較硬,二者本質上都是虛擬化。
3.2.1什麼是超執行緒(hyper-threading)
超執行緒(hyper-threading)其實就是同時多執行緒(simultaneous multi-theading),是一項允許一個CPU執行多個控制流的技術。它的原理很簡單,就是把一顆CPU當成兩顆來用,將一顆具有超執行緒功能的物理CPU變成兩顆邏輯CPU,而邏輯CPU對作業系統來說,跟物理CPU並沒有什麼區別。因此,作業系統會把工作執行緒分派給這兩顆(邏輯)CPU上去執行,讓(多個或單個)應用程式的多個執行緒,能夠同時在同一顆CPU上被執行。注意:兩顆邏輯CPU共享單顆物理CPU的所有執行資源。因此,我們可以認為,超執行緒技術就是對CPU的虛擬化。
3.2.2 超執行緒技術的由來
Hyper-Threading Technology is a form of simultaneous multithreading technology introduced by Intel, while the concept behind the technology has been patented by Sun Microsystems.
超執行緒技術是同時多執行緒技術的一種實現形式,由Intel公司提出,而該技術背後的概念則是Sun公司的專利。Sun公司雖然倒下了,但它永遠是一個偉大的公司。
縱觀計算機的歷史,有兩個需求是驅動計算機科技進步的持續動力。
-
- 第一,人類想讓計算機做得更多;
- 第二,人類想讓計算機跑得更快。
從這個意義上講,那些把工程師當做機器的資本家或資本家豢養的打手在榨取程式設計師的剩餘價值的時候,就是不斷地追求上述兩個需求。超執行緒技術的發明,就是基於這樣的考慮,不榨乾處理器的最後一滴油決不罷休。
3.2.3 單執行緒v.s.超執行緒
常規的CPU需要大約兩萬個時鐘週期做不同執行緒間的切換,而超執行緒的CPU可以在單個時鐘週期的基礎上決定要執行哪一個執行緒。這使得CPU能夠更好地利用它的處理資源。例如:假設一個執行緒必須等到某些資料被裝入到cache中,那麼CPU就可以繼續去執行另一個執行緒。
Intel公司的超執行緒技術
HT allows single processor to fetch and execute two separate code streams simultaneously.
超執行緒允許單個處理器在同一時刻並行地抓取和執行兩個獨立的程式碼流。
3.2.3 超執行緒是如何工作的
3.2.4 小結
由此可見,超執行緒技術雖然很酷,但需要方方面面的支援,否則就玩不轉。 類似地,如果想最大可能地榨取程式設計師的剩餘價值的話,給程式設計師提供實現超執行緒執行的軟硬體環境也是必須地,否則一味地讓他們拼體力(加班)實在不是個好辦法,因為人畢竟不是機器,人只有需要休息好了才可能有創造力,疲憊的人們大多時候是在瞎折騰,往往事倍功半。
超執行緒(hyper-threading)本質上就是CPU支援的同時多執行緒(simultaneous multi-threading)技術,簡單理解就是對CPU的虛擬化,一顆物理CPU可以被作業系統當做多顆CPU來使用。
四、多核CPU
相比於多個處理器而言,多核處理器把多個CPU(核心)整合到單個積體電路晶片(integrated circuit chip)中,因此主機板的單個socket也可以適應這樣的CPU,不需要去更更改一些硬體結構。一個雙核的CPU有2箇中央處理單元,因此不像上面我介紹的hyper-threading技術那樣,作業系統看到的只是一種假象,這回作業系統看到的是真正的2個核心,所以2個不同的程序可以分別在不同的核心中同時執行,這大大加快了系統的速度。由於2個核心都在一個晶片上,因此它們之間的通訊也要更快,系統也會有更小地延遲。處理器之間通過CPU內部匯流排進行通訊。而多CPU是指簡單的多個CPU工作在同一個系統上,多個CPU之間的通訊是通過主機板上的匯流排進行的。從以上原理可知,N個核的CPU,要比N個CPU在一起的工作效率要高(單核效能一致的情況下)。
下圖展示了一個Intel Core i7處理器的一個組織結構,這個微處理器晶片中有4個CPU核,每個核中都有它自己的L1和L2快取。
對稱多處理器是最主要的多核處理器架構。在這種架構中所有的CPU共享一條系統匯流排(BUS)來連線主存。而每一個核又有自己的一級快取,相對於BUS對稱分佈[2],如下圖:
這種架構在併發程式設計中,大致會引來兩個問題,一個是記憶體可見性,一個是Cache一致性流量。記憶體可見性屬於併發安全的問題,Cache一致性流量引起的是效能上的問題。
記憶體可見性:記憶體可見性在單處理器或單執行緒情況下是不會發生的。在一個單執行緒環境中,一個變數選寫入值,然後在沒有干涉的情況下讀取這個變數,得到的值應該是修改過的值。但是在讀和寫不在同一個執行緒中的時候,情況卻是不可以預料的。Core1和Core2可能會同時把主存中某個位置的值Load到自己的一級快取中,而Core1修改了自己一級快取中的值後,卻不更新主存中的值,這樣對於Core2來講,永遠看不到Core1對值的修改。為了保證資料的一致性,使用了MISE一致性協議,但是該協議存在一定的問題,比如通知另一個CPU某個值失效,會導致當前CPU處於空閒狀態,所以引入了儲存快取,並且姜秀改的操作交給儲存快取來做,完成之後在將其寫入快取當中,同時為儲存快取可以及時的得到另一個CPU的迴應,引入了失效佇列,將另一個CPU中值的狀態的修改推遲執行,但是這樣兩種方式由引入了可見性問題,同時由於編譯具有一定的優化功能,可能導致程式的執行與我們編寫程式時期望的有一定的差距,這就是重排序問題;volatile和memory解決軟體層面的可見性和重排序問題;記憶體屏障(讀屏障、寫屏障、讀寫屏障)可以硬體層面的可見性和重排序問題。
Cache一致性問題:指的是在SMP結構中,Core1和Core2同時下載了主存中的值到自己的一級快取中,Core1修改了值後,會通過匯流排讓Core2中的值失效,Core2發現自己存的值失效後,會再通過匯流排從主存中得到新值。匯流排的通訊能力是固定的,通過匯流排使各CPU的一級快取值資料同步的流量過大,那麼匯流排就會成瓶頸。這種影響屬於效能上的影響,減小同步競爭就能減少一致性流量。
五、參考文章
https://blog.csdn.net/zolalad/article/details/28393209?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
https://blog.csdn.net/stpeace/article/details/81608524?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.control&spm=1001.2101.3001.4242
本文來自部落格園,作者:Mr-xxx,轉載請註明原文連結:https://www.cnblogs.com/MrLiuZF/p/15201044.html