閱讀223 返回首頁    go 阿裏雲 go 技術社區[雲棲]


同步多線程

同步多線程(SMT)是一種在一個CPU 的時鍾周期內能夠執行來自多個線程的指令的硬件多線程技術。本質上,同步多線程是一種將線程級並行處理(多CPU)轉化為指令級並行處理(同一CPU)的方法。 同步多線程是單個物理處理器從多個硬件線程上下文同時分派指令的能力。同步多線程用於在商用環境中及為周期/指令(CPI)計數較高的工作負載創造性能優勢。 處理器采用超標量結構,最適於以並行方式讀取及運行指令。同步多線程使您可在同一處理器上同時調度兩個應用程序,從而利用處理器的超標量結構性質。

目 錄

1概述

2同步

  1. 2.1 事件
  2. 2.2 臨界區
  3. 2.3 互斥器
  4. 2.4 信號量

3技術問題

4線程通訊

5工作方式

6SMT

  1. 6.1 應用
  2. 6.2 說明

7微軟技術

  1. 7.1 同步多線程
  2. 7.2 交錯多線程
  3. 7.3 超線程技術

8超線程

1概述

任何單個應用程序都不能完全使該處理器達到滿負荷。當一個線程遇到較長等待時間事件時,同步多線程還允許另一線程中的指令使用所有執行單元。例如,當一個線程發生高速緩存不命中,另一個線程可以繼續執行。同步多線程是 POWER5™ 和 POWER6™ 處理器的功能,可與共享處理器配合使用。
SMT 對於商業事務處理負載的性能優化可達30%。在更加注重係統的整體吞吐量而非單獨線程的吞吐量時,SMT 是一個很好地選擇。
但是並非所有的應用都能通過SMT 取得性能優化。那些性能受到執行單元限製的應用,或者那些耗盡所有處理器的內存帶寬的應用,其性能都不會通過在同一個處理器上執行兩個線程而得到提高。
盡管SMT 可以使係統識別到雙倍於物理CPU數量的邏輯CPU(lcpu),但是這並不意味著係統擁有了兩倍的CPU能力。
SMT技術允許內核在同一時間運行兩個不同的進程,以此來壓縮多任務處理時所需要的總時間。這麼做有兩個好處,其一是提高處理器的計算性能,減少用戶得到結果所需的時間;其二就是更好的能效表現,利用更短的時間來完成任務,這就意味著在剩下的時間裏節約更多的電能消耗。當然這麼做有一個總前提——保證SMT不會重複HT所犯的錯誤,而提供這個擔保的則是在酷睿微架構中表現非常出色的分支預測設計。[1]

2同步

事件

1、 Event
用事件(Event)來同步線程是最具彈性的了。一個事件有兩種狀態:激發狀態和未激發狀態。也稱有信號狀態和無信號狀態。事件又分兩種類型:手動重置事件和自動重置事件。手動重置事件被設置為激發狀態後,會喚醒所有等待的線程,而且一直保持為激發狀態,直到程序重新把它設置為未激發狀態。自動重置事件被設置為激發狀態後,會喚醒“一個”等待中的線程,然後自動恢複為未激發狀態。所以用自動重置事件來同步兩個線程比較理想。MFC中對應的類為CEvent.。CEvent的構造函數默認創建一個自動重置的事件,而且處於未激發狀態。共有三個函數來改變事件的狀態:SetEvent,ResetEvent和PulseEvent。用事件來同步線程是一種比較理想的做法,但在實際的使用過程中要注意的是,對自動重置事件調用SetEvent和PulseEvent有可能會引起死鎖,必須小心。
多線程同步-event
在所有的內核對象中,事件內核對象是個最基本的。它包含一個使用計數(與所有內核對象一樣),一個BOOL值(用於指明該事件是個自動重置的事件還是一個人工重置的事件),還有一個BOOL值(用於指明該事件處於已通知狀態還是未通知狀態)。事件能夠通知一個線程的操作已經完成。有兩種類型的事件對象。一種是人工重置事件,另一種是自動重置事件。他們不同的地方在於:當人工重置的事件得到通知時,等待該事件的所有線程均變為可調度線程。當一個自動重置的事件得到通知時,等待該事件的線程中隻有一個線程變為可調度線程。
當一個線程執行初始化操作,然後通知另一個線程執行剩餘的操作時,事件使用得最頻繁。在這種情況下,事件初始化為未通知狀態,然後,當該線程完成它的初始化操作後,它就將事件設置為已通知狀態,而一直在等待該事件的另一個線程在事件已經被通知後,就變成可調度線程。
當這個進程啟動時,它創建一個人工重置的未通知狀態的事件,並且將句柄保存在一個全局變量中。這使得該進程中的其他線程能夠非常容易地訪問同一個事件對象。程序一開始創建了三個線程,這些線程在初始化後就被掛起,等待事件。這些線程要等待文件的內容讀入內存,然後每個線程都會訪問這段文件內容。一個線程進行單詞計數,另一個線程運行拚寫檢查,第三個線程運行語法檢查。這3個線程函數的代碼的開始部分都相同,每個函數都調用WaitForSingleObject.,這將使線程暫停運行,直到文件的內容由主線程讀入內存為止。一旦主線程將數據準備好,它就調用SetEvent,給事件發出通知信號。這時,係統就使所有這3個輔助線程進入可調度狀態,它們都獲得了C P U時間,並且可以訪問內存塊。這3個線程都必須以隻讀方式訪問內存,否則會出現內存錯誤。這就是所有3個線程能夠同時運行的唯一原因。如果計算機上配有三個以上CPU,理論上這個3個線程能夠真正地同時運行,從而可以在很短的時間內完成大量的操作
如果你使用自動重置的事件而不是人工重置的事件,那麼應用程序的行為特性就有很大的差別。當主線程調用S e t E v e n t之後,係統隻允許一個輔助線程變成可調度狀態。同樣,也無法保證係統將使哪個線程變為可調度狀態。其餘兩個輔助線程將繼續等待。已經變為可調度狀態的線程擁有對內存塊的獨占訪問權。
讓我們重新編寫線程的函數,使得每個函數在返回前調用S e t E v e n t函數(就像Wi n M a i n函數所做的那樣)。
主線程將文件內容讀入內存後,它就調用SetEvent函數,這樣操作係統就會使這三個在等待的線程中的一個成為可調度線程。我們不知道係統將首先選擇哪個線程作為可調度線程。當該線程完成操作時,它也將調用S e t E v e n t函數,使下一個被調度。這樣,三個線程會以先後順序執行,至於什麼順序,那是操作係統決定的。所以,就算每個輔助線程均以讀/寫方式訪問內存塊,也不會產生任何問題,這些線程將不再被要求將數據視為隻讀數據。
這個例子清楚地展示出使用人工重置事件與自動重置事件之間的差別。
P u l s e E v e n t函數使得事件變為已通知狀態,然後立即又變為未通知狀態,這就像在調用S e t E v e n t後又立即調用R e s e t E v e n t函數一樣。如果在人工重置的事件上調用P u l s e E v e n t函數,那麼在發出該事件時,等待該事件的任何一個線程或所有線程將變為可調度線程。如果在自動重置事件上調用P u l s e E v e n t函數,那麼隻有一個等待該事件的線程變為可調度線程。如果在發出事件時沒有任何線程在等待該事件,那麼將不起任何作用[2]

臨界區

2、 Critical Section
使用臨界區域的第一個忠告就是不要長時間鎖住一份資源。這裏的長時間是相對的,視不同程序而定。對一些控製軟件來說,可能是數毫秒,但是對另外一些程序來說,可以長達數分鍾。但進入臨界區後必須盡快地離開,釋放資源。如果不釋放的話,會如何?答案是不會怎樣。如果是主線程(GUI線程)要進入一個沒有被釋放的臨界區,嗬嗬,程序就會掛了!臨界區域的一個缺點就是:Critical Section不是一個核心對象,無法獲知進入臨界區的線程是生是死,如果進入臨界區的線程掛了,沒有釋放臨界資源,係統無法獲知,而且沒有辦法釋放該臨界資源。這個缺點在互斥器(Mutex)中得到了彌補。Critical Section在MFC中的相應實現類是CcriticalSection。CcriticalSection::Lock()進入臨界區,CcriticalSection::UnLock()離開臨界區。

互斥器

3、 Mutex
互斥器的功能和臨界區域很相似。區別是:Mutex所花費的時間比Critical Section多的多,但是Mutex是核心對象(Event、Semaphore也是),可以跨進程使用,而且等待一個被鎖住的Mutex可以設定TIMEOUT,不會像Critical Section那樣無法得知臨界區域的情況,而一直死等。MFC中的對應類為CMutex。Win32函數有:創建互斥體CreateMutex() ,打開互斥體OpenMutex(),釋放互斥體ReleaseMutex()。Mutex的擁有權並非屬於那個產生它的線程,而是最後那個對此Mutex進行等待操作(WaitForSingleObject等等)並且尚未進行ReleaseMutex()操作的線程。線程擁有Mutex就好像進入Critical Section一樣,一次隻能有一個線程擁有該Mutex。如果一個擁有Mutex的線程在返回之前沒有調用ReleaseMutex(),那麼這個Mutex就被舍棄了,但是當其他線程等待(WaitForSingleObject等)這個Mutex時,仍能返回,並得到一個WAIT_ABANDONED_0返回值。能夠知道一個Mutex被舍棄是Mutex特有的。

信號量

4、 Semaphore
信號量是最具曆史的同步機製。信號量是解決producer/consumer問題的關鍵要素。對應的MFC類是Csemaphore。Win32函數CreateSemaphore()用來產生信號量。ReleaseSemaphore()用來解除鎖定。Semaphore的現值代表的意義是可用的資源數,如果Semaphore的現值為1,表示還有一個鎖定動作可以成功。如果現值為5,就表示還有五個鎖定動作可以成功。當調用Wait…等函數要求鎖定,如果Semaphore現值不為0,Wait…馬上返回,資源數減1。當調用ReleaseSemaphore()資源數加1,當然不會超過初始設定的資源總數。

3技術問題

1、 何時使用多線程?
2、 線程如何同步?
3、 線程之間如何通訊?
4、 進程之間如何通訊?
先來回答第一個問題,線程實際主要應用於四個主要領域,當然各個領域之間不是絕對孤立的,他們有可能是重疊的,但是每個程序應該都可以歸於某個領域:
1、 offloading time-consuming task。由輔助線程來執行耗時計算,而使GUI有更好的反應。我想這應該是我們考慮使用線程最多的一種情況吧。
2、 Scalability。服務器軟件最常考慮的問題,在程序中產生多個線程,每個線程做一份小的工作,使每個CPU都忙碌,使CPU(一般是多個)有最佳的使用率,達到負載的均衡,這比較複雜,我想以後再討論這個問題。
3、 Fair-share resource allocation。當你向一個負荷沉重的服務器發出請求,多少時間才能獲得服務。一個服務器不能同時為太多的請求服務,必須有一個請求的最大個數,而且有時候對某些請求要優先處理,這是線程優先級幹的活了。
4、 Simulations。線程用於仿真測試

4線程通訊

線程常常要將數據傳遞給另外一個線程。Worker線程可能需要告訴別人說它的工作完成了,GUI線程則可能需要交給Worker線程一件新的工作。
通過PostThreadMessage(),可以將消息傳遞給目標線程,當然目標線程必須有消息隊列。以消息當作通訊方式,比起標準技術如使用全局變量等,有很大的好處。如果對象是同一進程中的線程,可以發送自定義消息,傳遞數據給目標線程,如果是線程在不同的進程中,就涉及進程之間的通訊了。下麵將會講到。
進程之間的通訊:
當線程分屬於不同進程,也就是分駐在不同的地址空間時,它們之間的通訊需要跨越地址空間的邊界,便得采取一些與同一進程中不同線程間通訊不同的方法。
1、 Windows專門定義了一個消息:WM_COPYDATA,用來在線程之間搬移數據,――不管兩個線程是否同屬於一個進程。同時接受這個消息的線程必須有一個窗口,即必須是UI線程。WM_COPYDATA必須由SendMessage()來發送,不能由PostMessage()等來發送,這是由待發送數據緩衝區的生命期決定的,出於安全的需要。
2、 WM_COPYDATA效率上麵不是太高,如果要求高效率,可以考慮使用共享內存(Shared Memory)。使用共享內存要做的是:設定一塊內存共享區域;使用共享內存;同步處理共享內存。
第一步:設定一塊內存共享區域。首先,CreateFileMapping()產生一個file-mapping核心對象,並指定共享區域的大小。MapViewOfFile()獲得一個指針指向可用的內存。如果是C/S模式,由Server端來產生file-mapping,那麼Client端使用OpenFileMapping(),然後調用MapViewOfFile()。
第二步:使用共享內存。共享內存指針的使用是一件比較麻煩的事,我們需要借助_based屬性,允許指針被定義為從某一點開始起算的32位偏移值。
第三步:清理。UnmapViewOfFile()交出由MapViewOfFile()獲得的指針,CloseHandle()交出file-mapping核心對象的handle。
第四步:同步處理。可以借助Mutex來進行同步處理。
3、 IPC
1)Anonymous Pipes。Anonymous Pipes隻被使用於點對點通訊。當一個進程產生另一個進程時,這是最有用的一種通訊方式。
2)Named Pipes。Named Pipes可以是單向,也可以是雙向,並且可以跨越網絡,步局限於單機。
3)Mailslots。Mailslots為廣播式通訊。Server進程可以產生Mailslots,任何Client進程可以寫數據進去,但是隻有Server進程可以取數據。
4)OLE Automation。OLE Automation和UDP都是更高階的機製,允許通訊發生於不同進程間,甚至不同機器間。
5)DDE。DDE動態數據交換,使用於16位Windows,這一方式應盡量避免使用。[3]

5工作方式

圖中首先顯示了單線程方式,其中所有物理資源都通過單個線程。POWER™ 係統支持單線程和同步多線程。
隨後,圖中顯示了粗粒度多線程方式,其中每次隻有一個線程運行。當線程遇到長等待時間事件(如高速緩存不命中)時,硬件切換到第二個線程以使用處理資源,而不是讓服務器保持空閑狀態。此設計允許其他任務使用原本將空閑的處理器周期,從而提高了總係統吞吐量。為了節約資源,兩個線程共享許多係統資源,如結構寄存器。因此,將程序控製從一個線程切換到另一個線程需要數個周期。
最後,圖中顯示了同步多線程方式,其中處理器同時從多個硬件線程檢索指令。處理器將多個硬件線程中的指令調度為同時執行。借助同步多線程,係統將根據環境進行動態調節,從而允許在可能的情況下執行每個硬件線程中的指令;當一個硬件線程遇到長等待時間事件時,它還允許另一個硬件線程中的指令使用所有執行單元。
同步多線程主要在以下上下文中有用:
在單個速度不如所執行的總數重要的商用環境中。同步多線程將通過大型或經常變化的(如Web 服務器)增加工作負載的吞吐量

6SMT

內容提要Power5 芯片是IBM Power 芯片家族中的新一代高端CPU 產品,它與Power4 在二進製上兼容,但在性能和功能上比Power4 有很大的增強。本文將介紹Power5 所支持的同步多線程技術Simultaneous MultiThreading 。

應用

在單個速度不如所執行的總數重要的商用環境中。同步多線程將通過大型或經常變化的工作集(如數據庫服務器和 Web 服務器)增加工作負載的吞吐量。 具有高 CPI 計數的工作負載。這些工作負載往往很少使用處理器和內存資源。高 CPI 計數通常由大型工作機的高速緩存不命中率較高而導致。較大的商用工作負載在某些程度上取決於兩個硬件線程是否共享指令或數據,或取決於兩個硬件線程是否完全不同。共享指令或數據的工作負載可能從同步多線程中獲得較大的好處,這些指令或數據可包括在操作係統中或單個應用程序中廣泛運行的指令或數據。

說明

同步多線程示意圖

  同步多線程示意圖

傳統的CPU 在某一時間隻能處理一個指令序列,通常我們把它稱為一個線程。在線程處理的過程中CPU 的處理單元需要不斷調入指令與數據進行處理。隨著CPU 技術的發展,CPU 的主頻與性能不斷提高,需要調入指令和數據的速度不斷提高。但不幸的是內存技術的發展並沒有跟上CPU 發展的速度,內存通常無法提供足夠的指令和數據給CPU 進行處理。
為了解決這個問題,業界通常采用多級緩存的方式。CPU 處理單元中的寄存器是最快的,通常一個CPU 中有一、兩百個寄存器,它可以在一個時鍾周期內提供指令和數據。其次是一級緩存,他的大小通常為幾十KB ,它需要幾個時鍾周期的訪問時間。再下麵是二級緩存,他的大小通常為幾MB ,它需要十幾個時鍾周期的訪問時間。然後是內存,從內存中取得數據需要幾十個個時鍾周期。而最慢的是硬盤,通常需要幾千甚至幾萬個時鍾周期的訪問時間。
當CPU 需要處理下一條指令時,他通常按照寄存器一級緩存二級緩存、內存、硬盤這一順序去查找。但如果在內存中仍然找不到需要的指令或數據時。係統會進行Context Switch ,終止此線程在CPU 上的運行,使其處於等待狀態,而讓其他的線程運行,當此線程需要的數據被調入內存後,此線程處於就緒狀態,可以被調度到CPU 上運行。線程間的Context Switch 需要幾十個時鍾周期。
由此可見當CPU 需要從內存中取數據時,處理單元需要空轉幾十個時鍾周期,有關統計顯示當前CPU 處理單元的平均利用率不足25% 。為了提高CPU 處理單元的利用率,設計者采用了線程級的並行技術,即在CPU 的核心中執行一個以上的指令序列。對於操作係統來說,一個物理的處理器相當於兩個邏輯的處理器,當前有三種不同的方式,實現多線程技術
粗粒度的多線程,在任一時刻隻有一個線程執行,當線程遇到一個長延遲事件時,如二級緩存不命中,則係統調度另一個線程執行,而不是讓係統資源空轉等待此線程。這一機製可以提高整個係統的利用率。這兩個線程共享許多係統資源,如CPU 的寄存器和緩存等,因此這兩個線程的切換比Context Switch 要快得多,隻需要幾個時鍾周期。IBM 在使用PowerPC RS64 IV 處理器的pSeries 680 和pSeries 660-6M1 上使用過這種粗粒度的多線程技術
另一種與粗粒度的多線程技術相對的是細粒度多線程技術,采用這種多線程的係統循環的執行兩個線程的指令,這就需要在處理器的設計上增加許多冗餘的部件。如果一個線程遇到個長延遲事件時,對應這一線程執行的時鍾周期仍然沒有被利用。
第三種多線程技術是同步多線程技術(SMT) ,與其他的多線程技術一樣,同步多線程能夠從多個線程中取出指令來運行,它能夠同時執行不同線程的指令。通過同步多線程技術,係統能夠動態調整係統環境,如有可能同時執行不同線程的指令。當一個線程遇到長延遲事件時,允許另一個線程使用所用的處理單元。
Power5 處理器的設計采用兩路的同步多線程設計,雖然更多路的同步多線程也是可能的,但模擬現實,其所增加的係統的複雜性是不經濟的。另外一個需要注意的問題是,同步多線程技術可能會由於緩存爭用而降低整個係統的性能。

7微軟技術

基於NetBurst架構的超線程:OOOE + SMT
基於Itanium架構的超線程:IOE + CMT
基於Atom架構的超線程:IOE + SMT
基於Nehalem架構的超線程:OOOE + SMT

同步多線程

SMT(Simultaneous Multi-Threading,同步多線程)實乃是一個專有名詞,是一種類技術的名稱,不僅僅Nehalem有采用,Pentium 4也有采用,還有很多其他商用處理器也有采用。正確的情況應該是,Nehalem的HT技術和Pentium 4的HT技術一樣,都是屬於SMT技術。
實際上,超線程技術在Intel的很多處理器裏麵都有使用,除了Pentium 4(NetBurst架構)、Core i7(Nehalem架構)之外,Itanium 2(Mondecito)和Atom(Silverthorne)處理器裏麵都有,然而它們攜帶的HT技術卻不屬於SMT!
在整理Intel的多種HT超線程技術之前,我們先來回顧一下MultiThreading多線程技術的分類,MultiThreading多線程就是在一個單個的處理核心內同時運行多個工作線程的技術,和CMP(Chip MultiProcessing,芯片多處理)不同,後者是通過集成多個處理內核的方式來讓係統的處理能力提升——也就是現在常見的多核技術。主流的處理器都使用了CMP技術。
然而CMP技術大規模增加了相應的電路,從而增加了成本,MT(MultiThreading)技術卻不是
多線程架構異同

  多線程架構異同

這樣,它隻需要增加規模很少的部分線路(通常,約2%)就可以提升處理器的總體處理器能力,從而可以很簡單地提升相關應用的性能。
MultiThreading(或作Multi-Threading)來源於可以追溯到上個世紀90年代開始的一個叫做ILP(Instruction Level Parallelism,指令級並行化)的思想,這個思想產生了一個叫做Throughput Computing(吞吐量計算)的名詞,用來提升如在線交易這樣的並行計算的性能。Throughput Computing的兩種主要方式就是MultiProcessing和MultiThreading。
一開始,為了開發ILP,在過去的幾十年中利用了超標量(Superscalar,同時具備多個執行器)、亂序執行(Out-Of-Order Execute,允許無數據關聯性的指令同時運行)、動態分支預測、VLIW(Very Long Instruction Word,超長指令集) 等技術(前三種可在經典的Pentium Pro架構上看到,最後一個就是Itanium的特色技術)。然而,超標量使設計的複雜性急劇增加,同時,指令之間的數據和控製相關,可以開發的ILP 也有限,以及一些其它因素,使得經典的超標量結構處理器難以進一步提高處理器性能。
而且從應用的角度看,如在線事務處理OLTP、決策支持係統DSS、Web服務等這樣的應用的特點是具有豐富的線程級並行性(Thread Level Parallelism)而缺乏ILP,因此也就促使了MultiProcessing和MultiThreading的出現。
MultiThreading多線程技術的思想有些類似於早期的分時共享計算係統,執行多個線程的處理器在遇到某個線程由於Cache Miss或者分支預測失敗而停頓的時候,可以切換到另一個線程來執行。主流的MultiThreading具有著三種形式,差別在於線程間共享的資源以及線程切換的機製:
其中CMT和FMT都是在單個執行單元下的技術,不同的線程在指令級別上並不是真正的“並行”,而SMT則具有多個執行單元,同一時間內可以同時執行多個指令,因此前兩者有時先歸類為TMT(Temporal MultiThreading,時間多線程),以和SMT相區分。
首先介紹CMT——Coarse-Grained MultiThreading是因為:它是最簡單的多線程技術,當單一執行線程遇到長時間的延遲,如Cache Missed時,就進行線程切換,直到原線程等待的操作完成,才切換回去。Coarse-Grained MultiThreading有時也叫Block MultiThreading堵塞多線程或者Cooperative MultiThreading協作多線程。
由於CMT很簡單,因此很多處理器都有實現,除了下麵列出之外,很多嵌入式微控製器都有實現:
1999年的IBM RS64 III「Pulsar」(單核心/雙線程)
2005年Fujitsu SPARC64 VI「Olympus-C」(雙核心/4線程)
2006年Intel Itanium 2「Montecito」(雙核心/4線程)
2007年Intel Itanium 2「Montvale」(雙核心/4線程)
Intel的Itanium 2赫然在目

交錯多線程

FMT——Fine-Grained MultiThreading隨時可以在每個時鍾周期內切換多個線程,以追求最大的輸出能力——當然,隨時可以切換也是有代價的,它拉長了每個執行線程的平均執行時間。Fine-Grained MultiThreading有時也叫Interleaved MultiThreading交錯多線程或者Pre-emptive MultiThreading搶先多線程。
和CMT比起來,FMT要複雜一些,因此相應的處理器就沒有那麼多,例:
2005年Sun UltraSPARC T1「Niagara」(8核心/32線程)
2007年Sun UltraSPARC T2「Niagara 2」(8核心/64線程)
其實UltraSPARC T2同時還使用了其他的MT技術,才實現了比T1多了一倍的多線程能力,仔細看看上圖,T2還使用了什麼MT技術(注意第一段的CMT是Chip MultiThreading的意思而不是Coarse-Grained M
最典型的:Intel Pentium 4或者Core i7

  最典型的:Intel Pentium 4或者Core i7

ultiThreading的意思)?
雖然CPU上使用FMT技術的並不 早在NV G40以及ATI R520開始,GPU內部就開始應用了FMT細粒度多線程技術,為了隱含Cache Miss的存儲器高延遲,GPU內部的執行單元不停的在工作線程之間切換,提升總的處理能力。不過,G40的FMT實現了具體多少個線程筆者倒不是很清楚,根據資料看應該在100左右。
前麵說過,SMT其實和其他兩種多線程技術都不同——那兩種技術被稱之為TMT時間多線程。SMT——Simultaneous MultiThreading具有多個執行單元,可以同時運行多條指令,因此才叫做“同步多線程”!SMT起先源自充分挖掘超標量架構處理器的潛力——超標量的意思就是可以同時執行多個不同的指令。因此SMT具有最大的靈活性和資源利用率,然而實現也最複雜(當然比起多核結構來說就是小意思了)。
2002年Intel Pentium 4 Xeon「Prestonia」(單核心/雙線程)
2007年Sun UltraSPARC T2「Niagara 2」(8核心/64線程)
2008年Intel Core i7「Nehalem」(4核心/8線程)
這裏又看到了UltraSPARC T2,這是因為它同時采用了FMT和SMT技術:因為UltraSPARC T2具有兩個執行單元,每一個線程組使用一個,線程組內則按照T1那樣執行4個線程。現代的GPU也采用了類似的混合設計:
不同的流處理器可以同時執行不同的線程,當然同一個流處理器也可以在不同的線程之間切換。

超線程技術

介紹了所有的MT多線程技術種類之後,我們可以來看Intel的HyperThreading超線程技術了,前麵說過,Intel具有超線程技術的CPU有:Pentium 4(NetBurst架構)、Core i7(Nehalem架構)、Itanium 2(Mondecito)、Atom(Silverthorne)。我們已經知道具有超線程技術的Pentium 4/Pentium 4 Xeon(不是所有的P4都有超線程技術)采用的是SMT架構,Core i7的則是其改進版本。我們再來看看Itanium 2:Itanium 2 Montecito采用了雙核心設計,每核心兩個線程;Itanium 2 Montecito的超線程技術采用了CMT架構; 可見,Itanium 2的超線程技術和Pentium 4的SMT不同,它實際上是CMT粗粒度多線程技術。這是因為Itanium 2是In-Order架構的,SMT的原始構想就是充分壓榨OOOE(Out-Of-Order Execution)的能力,因此In-Order架構的Itanium 2就沒有采用SMT的方式。因為要創建多個線程的代價太大。
那是否In-Order架構的處理器就不能實現SMT了呢?並不是,Intel的Atom就是一個典型的例子: 除了Atom之外,IBM的怪物Power6(起始頻率4.7GHz)也采用了基於In-Order架構的SMT技術(Power5的SMT是基於Out-Of-Order):IBM Power6處理器,雙核,每核兩個線程;Power6:In-Order + SMT,Power5則是Out-Of-Order + SMT。[4]

8超線程

在NetBurst微架構後期,Intel為了維持性能上的優勢,將Prescott核心的Pentium 4流水線拉長到31級;細化後的流水線可以被分成若幹個環節,然後執行不同的任務進程,Intel將其稱為“Hyper-Threading Technology(超線程技術,簡稱HT)”。但過長的流水線需要進行大量的分支預測工作,而且一旦預測失準,就要把當前的工作全部推倒重新來過。這就造成了Pentium 4 HT處理器空有高頻率,發熱量也大得驚人,性能卻提高有限,最終還被扣上了“高頻低能”的大帽子。
從原則上來講HT技術絕對是一項非常有意義的創新和嚐試,如果我們假設當初HT遇到的不是流水線冗長Prescott Pentium 4,而是更加精簡高效的Core 2Duo,結果會怎樣?
當然,隻有14級流水線的Core 2 Duo最終還是與HT擦肩而過(當初的理由是過短的流水線沒必要引入超線程
術);但這並不代表Intel放棄了這方麵的努力,Nehalem就在嚐試做這樣的事情。所不同的是,這次的主角有了一個新名字——Simultaneous Multi-Threading(同步多線程,簡稱SMT)。

最後更新:2017-04-03 14:54:00

  上一篇:go android Framelayout動態添加組件
  下一篇:go WebService——通過契約優先開發webservice