當前位置:
首頁 >
同步多线程
發(fā)布時間:2023/12/2
30
豆豆
同步多線程(SMT)是一種在一個CPU 的時鐘周期內(nèi)能夠執(zhí)行來自多個線程的指令的硬件多線程技術(shù)。本質(zhì)上,同步多線程是一種將線程級并行處理(多CPU)轉(zhuǎn)化為指令級并行處理(同一CPU)的方法。 同步多線程是單個物理處理器從多個硬件線程上下文同時分派指令的能力。同步多線程用于在商用環(huán)境中及為周期/指令(CPI)計數(shù)較高的工作負載創(chuàng)造性能優(yōu)勢。 處理器采用超標量結(jié)構(gòu),最適于以并行方式讀取及運行指令。同步多線程使您可在同一處理器上同時調(diào)度兩個應用程序,從而利用處理器的超標量結(jié)構(gòu)性質(zhì)。任何單個應用程序都不能完全使該處理器達到滿負荷。當一個線程遇到較長等待時間事件時,同步多線程還允許另一線程中的指令使用所有執(zhí)行單元。例如,當一個線程發(fā)生高速緩存不命中,另一個線程可以繼續(xù)執(zhí)行。同步多線程是 POWER5? 和 POWER6? 處理器的功能,可與共享處理器配合使用。 SMT 對于商業(yè)事務(wù)處理負載的性能優(yōu)化可達30%。在更加注重系統(tǒng)的整體吞吐量而非單獨線程的吞吐量時,SMT 是一個很好地選擇。 但是并非所有的應用都能通過SMT 取得性能優(yōu)化。那些性能受到執(zhí)行單元限制的應用,或者那些耗盡所有處理器的內(nèi)存帶寬的應用,其性能都不會通過在同一個處理器上執(zhí)行兩個線程而得到提高。 盡管SMT 可以使系統(tǒng)識別到雙倍于物理CPU數(shù)量的邏輯CPU(lcpu),但是這并不意味著系統(tǒng)擁有了兩倍的CPU能力。 SMT技術(shù)允許內(nèi)核在同一時間運行兩個不同的進程,以此來壓縮多任務(wù)處理時所需要的總時間。這么做有兩個好處,其一是提高處理器的計算性能,減少用戶得到結(jié)果所需的時間;其二就是更好的能效表現(xiàn),利用更短的時間來完成任務(wù),這就意味著在剩下的時間里節(jié)約更多的電能消耗。當然這么做有一個總前提——保證SMT不會重復HT所犯的錯誤,而提供這個擔保的則是在酷睿微架構(gòu)中表現(xiàn)非常出色的分支預測設(shè)計。[1]
[編輯本段]同步多線程的同步機制 1、 Event 用事件(Event)來同步線程是最具彈性的了。一個事件有兩種狀態(tài):激發(fā)狀態(tài)和未激發(fā)狀態(tài)。也稱有信號狀態(tài)和無信號狀態(tài)。事件又分兩種類型:手動重置事件和自動重置事件。手動重置事件被設(shè)置為激發(fā)狀態(tài)后,會喚醒所有等待的線程,而且一直保持為激發(fā)狀態(tài),直到程序重新把它設(shè)置為未激發(fā)狀態(tài)。自動重置事件被設(shè)置為激發(fā)狀態(tài)后,會喚醒“一個”等待中的線程,然后自動恢復為未激發(fā)狀態(tài)。所以用自動重置事件來同步兩個線程比較理想。MFC中對應的類為CEvent.。CEvent的構(gòu)造函數(shù)默認創(chuàng)建一個自動重置的事件,而且處于未激發(fā)狀態(tài)。共有三個函數(shù)來改變事件的狀態(tài):SetEvent,ResetEvent和PulseEvent。用事件來同步線程是一種比較理想的做法,但在實際的使用過程中要注意的是,對自動重置事件調(diào)用SetEvent和PulseEvent有可能會引起死鎖,必須小心。 多線程同步-event 在所有的內(nèi)核對象中,事件內(nèi)核對象是個最基本的。它包含一個使用計數(shù)(與所有內(nèi)核對象一樣),一個BOOL值(用于指明該事件是個自動重置的事件還是一個人工重置的事件),還有一個BOOL值(用于指明該事件處于已通知狀態(tài)還是未通知狀態(tài))。事件能夠通知一個線程的操作已經(jīng)完成。有兩種類型的事件對象。一種是人工重置事件,另一種是自動重置事件。他們不同的地方在于:當人工重置的事件得到通知時,等待該事件的所有線程均變?yōu)榭烧{(diào)度線程。當一個自動重置的事件得到通知時,等待該事件的線程中只有一個線程變?yōu)榭烧{(diào)度線程。 當一個線程執(zhí)行初始化操作,然后通知另一個線程執(zhí)行剩余的操作時,事件使用得最頻繁。在這種情況下,事件初始化為未通知狀態(tài),然后,當該線程完成它的初始化操作后,它就將事件設(shè)置為已通知狀態(tài),而一直在等待該事件的另一個線程在事件已經(jīng)被通知后,就變成可調(diào)度線程。 當這個進程啟動時,它創(chuàng)建一個人工重置的未通知狀態(tài)的事件,并且將句柄保存在一個全局變量中。這使得該進程中的其他線程能夠非常容易地訪問同一個事件對象。程序一開始創(chuàng)建了三個線程,這些線程在初始化后就被掛起,等待事件。這些線程要等待文件的內(nèi)容讀入內(nèi)存,然后每個線程都會訪問這段文件內(nèi)容。一個線程進行單詞計數(shù),另一個線程運行拼寫檢查,第三個線程運行語法檢查。這3個線程函數(shù)的代碼的開始部分都相同,每個函數(shù)都調(diào)用WaitForSingleObject.,這將使線程暫停運行,直到文件的內(nèi)容由主線程讀入內(nèi)存為止。一旦主線程將數(shù)據(jù)準備好,它就調(diào)用SetEvent,給事件發(fā)出通知信號。這時,系統(tǒng)就使所有這3個輔助線程進入可調(diào)度狀態(tài),它們都獲得了C P U時間,并且可以訪問內(nèi)存塊。這3個線程都必須以只讀方式訪問內(nèi)存,否則會出現(xiàn)內(nèi)存錯誤。這就是所有3個線程能夠同時運行的唯一原因。如果計算機上配有三個以上CPU,理論上這個3個線程能夠真正地同時運行,從而可以在很短的時間內(nèi)完成大量的操作 如果你使用自動重置的事件而不是人工重置的事件,那么應用程序的行為特性就有很大的差別。當主線程調(diào)用S e t E v e n t之后,系統(tǒng)只允許一個輔助線程變成可調(diào)度狀態(tài)。同樣,也無法保證系統(tǒng)將使哪個線程變?yōu)榭烧{(diào)度狀態(tài)。其余兩個輔助線程將繼續(xù)等待。已經(jīng)變?yōu)榭烧{(diào)度狀態(tài)的線程擁有對內(nèi)存塊的獨占訪問權(quán)。 讓我們重新編寫線程的函數(shù),使得每個函數(shù)在返回前調(diào)用S e t E v e n t函數(shù)(就像Wi n M a i n函數(shù)所做的那樣)。 當主線程將文件內(nèi)容讀入內(nèi)存后,它就調(diào)用SetEvent函數(shù),這樣操作西永就會使這三個在等待的線程中的一個成為可調(diào)度線程。我們不知道系統(tǒng)將首先選擇哪個線程作為可調(diào)度線程。當該線程完成操作時,它也將調(diào)用S e t E v e n t函數(shù),使下一個被調(diào)度。這樣,三個線程會以先后順序執(zhí)行,至于什么順序,那是操作系統(tǒng)決定的。所以,就算每個輔助線程均以讀/寫方式訪問內(nèi)存塊,也不會產(chǎn)生任何問題,這些線程將不再被要求將數(shù)據(jù)視為只讀數(shù)據(jù)。 這個例子清楚地展示出使用人工重置事件與自動重置事件之間的差別。 P u l s e E v e n t函數(shù)使得事件變?yōu)橐淹ㄖ獱顟B(tài),然后立即又變?yōu)槲赐ㄖ獱顟B(tài),這就像在調(diào)用S e t E v e n t后又立即調(diào)用R e s e t E v e n t函數(shù)一樣。如果在人工重置的事件上調(diào)用P u l s e E v e n t函數(shù),那么在發(fā)出該事件時,等待該事件的任何一個線程或所有線程將變?yōu)榭烧{(diào)度線程。如果在自動重置事件上調(diào)用P u l s e E v e n t函數(shù),那么只有一個等待該事件的線程變?yōu)榭烧{(diào)度線程。如果在發(fā)出事件時沒有任何線程在等待該事件,那么將不起任何作用[5]。 2、 Critical Section 使用臨界區(qū)域的第一個忠告就是不要長時間鎖住一份資源。這里的長時間是相對的,視不同程序而定。對一些控制軟件來說,可能是數(shù)毫秒,但是對另外一些程序來說,可以長達數(shù)分鐘。但進入臨界區(qū)后必須盡快地離開,釋放資源。如果不釋放的話,會如何?答案是不會怎樣。如果是主線程(GUI線程)要進入一個沒有被釋放的臨界區(qū),呵呵,程序就會掛了!臨界區(qū)域的一個缺點就是:Critical Section不是一個核心對象,無法獲知進入臨界區(qū)的線程是生是死,如果進入臨界區(qū)的線程掛了,沒有釋放臨界資源,系統(tǒng)無法獲知,而且沒有辦法釋放該臨界資源。這個缺點在互斥器(Mutex)中得到了彌補。Critical Section在MFC中的相應實現(xiàn)類是CcriticalSection。CcriticalSection::Lock()進入臨界區(qū),CcriticalSection::UnLock()離開臨界區(qū)。 3、 Mutex 互斥器的功能和臨界區(qū)域很相似。區(qū)別是:Mutex所花費的時間比Critical Section多的多,但是Mutex是核心對象(Event、Semaphore也是),可以跨進程使用,而且等待一個被鎖住的Mutex可以設(shè)定TIMEOUT,不會像Critical Section那樣無法得知臨界區(qū)域的情況,而一直死等。MFC中的對應類為CMutex。Win32函數(shù)有:創(chuàng)建互斥體CreateMutex() ,打開互斥體OpenMutex(),釋放互斥體ReleaseMutex()。Mutex的擁有權(quán)并非屬于那個產(chǎn)生它的線程,而是最后那個對此Mutex進行等待操作(WaitForSingleObject等等)并且尚未進行ReleaseMutex()操作的線程。線程擁有Mutex就好像進入Critical Section一樣,一次只能有一個線程擁有該Mutex。如果一個擁有Mutex的線程在返回之前沒有調(diào)用ReleaseMutex(),那么這個Mutex就被舍棄了,但是當其他線程等待(WaitForSingleObject等)這個Mutex時,仍能返回,并得到一個WAIT_ABANDONED_0返回值。能夠知道一個Mutex被舍棄是Mutex特有的。 4、 Semaphore 信號量是最具歷史的同步機制。信號量是解決producer/consumer問題的關(guān)鍵要素。對應的MFC類是Csemaphore。Win32函數(shù)CreateSemaphore()用來產(chǎn)生信號量。ReleaseSemaphore()用來解除鎖定。Semaphore的現(xiàn)值代表的意義是目前可用的資源數(shù),如果Semaphore的現(xiàn)值為1,表示還有一個鎖定動作可以成功。如果現(xiàn)值為5,就表示還有五個鎖定動作可以成功。當調(diào)用Wait…等函數(shù)要求鎖定,如果Semaphore現(xiàn)值不為0,Wait…馬上返回,資源數(shù)減1。當調(diào)用ReleaseSemaphore()資源數(shù)加1,當時不會超過初始設(shè)定的資源總數(shù)。
[編輯本段]有關(guān)多線程的一些技術(shù)問題 1、 何時使用多線程? 2、 線程如何同步? 3、 線程之間如何通訊? 4、 進程之間如何通訊? 先來回答第一個問題,線程實際主要應用于四個主要領(lǐng)域,當然各個領(lǐng)域之間不是絕對孤立的,他們有可能是重疊的,但是每個程序應該都可以歸于某個領(lǐng)域: 1、 offloading time-consuming task。由輔助線程來執(zhí)行耗時計算,而使GUI有更好的反應。我想這應該是我們考慮使用線程最多的一種情況吧。 2、 Scalability。服務(wù)器軟件最常考慮的問題,在程序中產(chǎn)生多個線程,每個線程做一份小的工作,使每個CPU都忙碌,使CPU(一般是多個)有最佳的使用率,達到負載的均衡,這比較復雜,我想以后再討論這個問題。 3、 Fair-share resource allocation。當你向一個負荷沉重的服務(wù)器發(fā)出請求,多少時間才能獲得服務(wù)。一個服務(wù)器不能同時為太多的請求服務(wù),必須有一個請求的最大個數(shù),而且有時候?qū)δ承┱埱笠獌?yōu)先處理,這是線程優(yōu)先級干的活了。 4、 Simulations。線程用于仿真測試。
[編輯本段]線程之間的通訊 線程常常要將數(shù)據(jù)傳遞給另外一個線程。Worker線程可能需要告訴別人說它的工作完成了,GUI線程則可能需要交給Worker線程一件新的工作。 通過PostThreadMessage(),可以將消息傳遞給目標線程,當然目標線程必須有消息隊列。以消息當作通訊方式,比起標準技術(shù)如使用全局變量等,有很大的好處。如果對象是同一進程中的線程,可以發(fā)送自定義消息,傳遞數(shù)據(jù)給目標線程,如果是線程在不同的進程中,就涉及進程之間的通訊了。下面將會講到。 進程之間的通訊: 當線程分屬于不同進程,也就是分駐在不同的地址空間時,它們之間的通訊需要跨越地址空間的邊界,便得采取一些與同一進程中不同線程間通訊不同的方法。 1、 Windows專門定義了一個消息:WM_COPYDATA,用來在線程之間搬移數(shù)據(jù),――不管兩個線程是否同屬于一個進程。同時接受這個消息的線程必須有一個窗口,即必須是UI線程。WM_COPYDATA必須由SendMessage()來發(fā)送,不能由PostMessage()等來發(fā)送,這是由待發(fā)送數(shù)據(jù)緩沖區(qū)的生命期決定的,出于安全的需要。 2、 WM_COPYDATA效率上面不是太高,如果要求高效率,可以考慮使用共享內(nèi)存(Shared Memory)。使用共享內(nèi)存要做的是:設(shè)定一塊內(nèi)存共享區(qū)域;使用共享內(nèi)存;同步處理共享內(nèi)存。 第一步:設(shè)定一塊內(nèi)存共享區(qū)域。首先,CreateFileMapping()產(chǎn)生一個file-mapping核心對象,并指定共享區(qū)域的大小。MapViewOfFile()獲得一個指針指向可用的內(nèi)存。如果是C/S模式,由Server端來產(chǎn)生file-mapping,那么Client端使用OpenFileMapping(),然后調(diào)用MapViewOfFile()。 第二步:使用共享內(nèi)存。共享內(nèi)存指針的使用是一件比較麻煩的事,我們需要借助_based屬性,允許指針被定義為從某一點開始起算的32位偏移值。 第三步:清理。UnmapViewOfFile()交出由MapViewOfFile()獲得的指針,CloseHandle()交出file-mapping核心對象的handle。 第四步:同步處理。可以借助Mutex來進行同步處理。 3、 IPC 1)Anonymous Pipes。Anonymous Pipes只被使用于點對點通訊。當一個進程產(chǎn)生另一個進程時,這是最有用的一種通訊方式。 2)Named Pipes。Named Pipes可以是單向,也可以是雙向,并且可以跨越網(wǎng)絡(luò),步局限于單機。 3)Mailslots。Mailslots為廣播式通訊。Server進程可以產(chǎn)生Mailslots,任何Client進程可以寫數(shù)據(jù)進去,但是只有Server進程可以取數(shù)據(jù)。 4)OLE Automation。OLE Automation和UDP都是更高階的機制,允許通訊發(fā)生于不同進程間,甚至不同機器間。 5)DDE。DDE動態(tài)數(shù)據(jù)交換,使用于16位Windows,目前這一方式應盡量避免使用。[4]
[編輯本段]同步多線程的工作方式 圖中首先顯示了單線程方式,其中所有物理資源都通過單個線程。POWER? 系統(tǒng)支持單線程和
同步多線程的工作方式
同步多線程。 隨后,圖中顯示了粗粒度多線程方式,其中每次只有一個線程運行。當線程遇到長等待時間事件(如高速緩存不命中)時,硬件切換到第二個線程以使用處理資源,而不是讓服務(wù)器保持空閑狀態(tài)。此設(shè)計允許其他任務(wù)使用原本將空閑的處理器周期,從而提高了總系統(tǒng)吞吐量。為了節(jié)約資源,兩個線程共享許多系統(tǒng)資源,如結(jié)構(gòu)寄存器。因此,將程序控制從一個線程切換到另一個線程需要數(shù)個周期。 最后,圖中顯示了同步多線程方式,其中處理器同時從多個硬件線程檢索指令。處理器將多個硬件線程中的指令調(diào)度為同時執(zhí)行。借助同步多線程,系統(tǒng)將根據(jù)環(huán)境進行動態(tài)調(diào)節(jié),從而允許在可能的情況下執(zhí)行每個硬件線程中的指令;當一個硬件線程遇到長等待時間事件時,它還允許另一個硬件線程中的指令使用所有執(zhí)行單元。 同步多線程主要在以下上下文中有用: 在單個事務(wù)速度不如所執(zhí)行事務(wù)的總數(shù)重要的商用環(huán)境中。同步多線程將通過大型或經(jīng)常變化的工作集(如數(shù)據(jù)庫服務(wù)器和 Web 服務(wù)器)增加工作負載的吞吐量。 具有高 CPI 計數(shù)的工作負載。這些工作負載往往很少使用處理器和內(nèi)存資源。高 CPI 計數(shù)通常由大型工作機的高速緩存不命中率較高而導致。較大的商用工作負載在某些程度上取決于兩個硬件線程是否共享指令或數(shù)據(jù),或取決于兩個硬件線程是否完全不同。共享指令或數(shù)據(jù)的工作負載可能從同步多線程中獲得較大的好處,這些指令或數(shù)據(jù)可包括在操作系統(tǒng)中或單個應用程序中廣泛運行的指令或數(shù)據(jù)。[3][編輯本段]IBM Power5 中的同步多線程技術(shù)(SMT) 內(nèi)容提要Power5 芯片是IBM Power 芯片家族中的新一代高端CPU 產(chǎn)品,它與Power4 在二進制上兼容,但在性能和功能上比Power4 有很大的增強。本文將介紹Power5 所支持的同步多線程技術(shù)Simultaneous MultiThreading 。
應用
在單個事務(wù)速度不如所執(zhí)行事務(wù)的總數(shù)重要的商用環(huán)境中。同步多線程將通過大型或經(jīng)常變化的工作集(如數(shù)據(jù)庫服務(wù)器和 Web 服務(wù)器)增加工作負載的吞吐量。 具有高 CPI 計數(shù)的工作負載。這些工作負載往往很少使用處理器和內(nèi)存資源。高 CPI 計數(shù)通常由大型工作機的高速緩存不命中率較高而導致。較大的商用工作負載在某些程度上取決于兩個硬件線程是否共享指令或數(shù)據(jù),或取決于兩個硬件線程是否完全不同。共享指令或數(shù)據(jù)的工作負載可能從同步多線程中獲得較大的好處,這些指令或數(shù)據(jù)可包括在操作系統(tǒng)中或單個應用程序中廣泛運行的指令或數(shù)據(jù)。說 明
同步多線程示意圖
傳統(tǒng)的CPU 在某一時間只能處理一個指令序列,通常我們把它稱為一個線程。在線程處理的過程中CPU 的處理單元需要不斷調(diào)入指令與數(shù)據(jù)進行處理。隨著CPU 技術(shù)的發(fā)展,CPU 的主頻與性能不斷提高,需要調(diào)入指令和數(shù)據(jù)的速度不斷提高。但不幸的是內(nèi)存技術(shù)的發(fā)展并沒有跟上CPU 發(fā)展的速度,內(nèi)存通常無法提供足夠的指令和數(shù)據(jù)給CPU 進行處理。 為了解決這個問題,業(yè)界通常采用多級緩存的方式。CPU 處理單元中的寄存器是最快的,通常一個CPU 中有一、兩百個寄存器,它可以在一個時鐘周期內(nèi)提供指令和數(shù)據(jù)。其次是一級緩存,他的大小通常為幾十KB ,它需要幾個時鐘周期的訪問時間。再下面是二級緩存,他的大小通常為幾MB ,它需要十幾個時鐘周期的訪問時間。然后是內(nèi)存,從內(nèi)存中取得數(shù)據(jù)需要幾十個個時鐘周期。而最慢的是硬盤,通常需要幾千甚至幾萬個時鐘周期的訪問時間。 當CPU 需要處理下一條指令時,他通常按照寄存器、一級緩存、二級緩存、內(nèi)存、硬盤這一順序去查找。但如果在內(nèi)存中仍然找不到需要的指令或數(shù)據(jù)時。系統(tǒng)會進行Context Switch ,終止此線程在CPU 上的運行,使其處于等待狀態(tài),而讓其他的線程運行,當此線程需要的數(shù)據(jù)被調(diào)入內(nèi)存后,此線程處于就緒狀態(tài),可以被調(diào)度到CPU 上運行。線程間的Context Switch 需要幾十個時鐘周期。 由此可見當CPU 需要從內(nèi)存中取數(shù)據(jù)時,處理單元需要空轉(zhuǎn)幾十個時鐘周期,有關(guān)統(tǒng)計顯示當前CPU 處理單元的平均利用率不足25% 。為了提高CPU 處理單元的利用率,設(shè)計者采用了線程級的并行技術(shù),即在CPU 的核心中執(zhí)行一個以上的指令序列。對于操作系統(tǒng)來說,一個物理的處理器相當于兩個邏輯的處理器,當前有三種不同的方式,實現(xiàn)多線程技術(shù)。 粗粒度的多線程,在任一時刻只有一個線程執(zhí)行,當線程遇到一個長延遲事件時,如二級緩存不命中,則系統(tǒng)調(diào)度另一個線程執(zhí)行,而不是讓系統(tǒng)資源空轉(zhuǎn)等待此線程。這一機制可以提高整個系統(tǒng)的利用率。這兩個線程共享許多系統(tǒng)資源,如CPU 的寄存器和緩存等,因此這兩個線程的切換比Context Switch 要快得多,只需要幾個時鐘周期。IBM 在使用PowerPC RS64 IV 處理器的pSeries 680 和pSeries 660-6M1 上使用過這種粗粒度的多線程技術(shù)。 另一種與粗粒度的多線程技術(shù)相對的是細粒度多線程技術(shù),采用這種多線程的系統(tǒng)循環(huán)的執(zhí)行兩個線程的指令,這就需要在處理器的設(shè)計上增加許多冗余的部件。如果一個線程遇到個長延遲事件時,對應這一線程執(zhí)行的時鐘周期仍然沒有被利用。 第三種多線程技術(shù)是同步多線程技術(shù)(SMT) ,與其他的多線程技術(shù)一樣,同步多線程能夠從多個線程中取出指令來運行,它能夠同時執(zhí)行不同線程的指令。通過同步多線程技術(shù),系統(tǒng)能夠動態(tài)調(diào)整系統(tǒng)環(huán)境,如有可能同時執(zhí)行不同線程的指令。當一個線程遇到長延遲事件時,允許另一個線程使用所用的處理單元。 Power5 處理器的設(shè)計采用兩路的同步多線程設(shè)計,雖然更多路的同步多線程也是可能的,但模擬現(xiàn)實,其所增加的系統(tǒng)的復雜性是不經(jīng)濟的。另外一個需要注意的問題是,同步多線程技術(shù)可能會由于緩存爭用而降低整個系統(tǒng)的性能。[編輯本段]Intel超線程技術(shù)有多少種? 基于NetBurst架構(gòu)的超線程:OOOE + SMT 基于Itanium架構(gòu)的超線程:IOE + CMT 基于Atom架構(gòu)的超線程:IOE + SMT 基于Nehalem架構(gòu)的超線程:OOOE + SMT SMT(Simultaneous Multi-Threading,同步多線程)實乃是一個專有名詞,是一種類技術(shù)的名稱,不僅僅Nehalem有采用,Pentium 4也有采用,還有很多其他商用處理器也有采用。正確的情況應該是,Nehalem的HT技術(shù)和Pentium 4的HT技術(shù)一樣,都是屬于SMT技術(shù)。 實際上,超線程技術(shù)在Intel的很多處理器里面都有使用,除了Pentium 4(NetBurst架構(gòu))、Core i7(Nehalem架構(gòu))之外,Itanium 2(Mondecito)和Atom(Silverthorne)處理器里面都有,然而它們攜帶的HT技術(shù)卻不屬于SMT! 在整理Intel的多種HT超線程技術(shù)之前,我們先來回顧一下MultiThreading多線程技術(shù)的分類,MultiThreading多線程就是在一個單個的處理核心內(nèi)同時運行多個工作線程的技術(shù),和CMP(Chip MultiProcessing,芯片多處理)不同,后者是通過集成多個處理內(nèi)核的方式來讓系統(tǒng)的處理能力提升——也就是現(xiàn)在常見的多核技術(shù)。現(xiàn)在主流的處理器都使用了CMP技術(shù)。 然而CMP技術(shù)大規(guī)模增加了相應的電路,從而增加了成本,MT(MultiThreading)技術(shù)卻不是
多線程架構(gòu)異同
這樣,它只需要增加規(guī)模很少的部分線路(通常,約2%)就可以提升處理器的總體處理器能力,從而可以很簡單地提升相關(guān)應用的性能。 MultiThreading(或作Multi-Threading)來源于可以追溯到上個世紀90年代開始的一個叫做ILP(Instruction Level Parallelism,指令級并行化)的思想,這個思想產(chǎn)生了一個叫做Throughput Computing(吞吐量計算)的名詞,用來提升如在線交易這樣的并行計算的性能。Throughput Computing的兩種主要方式就是MultiProcessing和MultiThreading。 一開始,為了開發(fā)ILP,在過去的幾十年中利用了超標量(Superscalar,同時具備多個執(zhí)行器)、亂序執(zhí)行(Out-Of-Order Execute,允許無數(shù)據(jù)關(guān)聯(lián)性的指令同時運行)、動態(tài)分支預測、VLIW(Very Long Instruction Word,超長指令集 ) 等技術(shù)(前三種可在經(jīng)典的Pentium Pro架構(gòu)上看到,最后一個就是Itanium的特色技術(shù))。然而,超標量使設(shè)計的復雜性急劇增加,同時,指令之間的數(shù)據(jù)和控制相關(guān),可以開發(fā)的ILP 也有限,以及一些其它因素,使得經(jīng)典的超標量結(jié)構(gòu)處理器難以進一步提高處理器性能。 而且從應用的角度看,如在線事務(wù)處理OLTP、決策支持系統(tǒng)DSS、Web服務(wù)等這樣的應用的特點是具有豐富的線程級并行性(Thread Level Parallelism)而缺乏ILP,因此也就促使了MultiProcessing和MultiThreading的出現(xiàn)。 MultiThreading多線程技術(shù)的思想有些類似于早期的分時共享計算系統(tǒng),執(zhí)行多個線程的處理器在遇到某個線程由于Cache Miss或者分支預測失敗而停頓的時候,可以切換到另一個線程來執(zhí)行。目前主流的MultiThreading具有著三種形式,差別在于線程間共享的資源以及線程切換的機制: 其中CMT和FMT都是在單個執(zhí)行單元下的技術(shù),不同的線程在指令級別上并不是真正的“并行”,而SMT則具有多個執(zhí)行單元,同一時間內(nèi)可以同時執(zhí)行多個指令,因此前兩者有時先歸類為TMT(Temporal MultiThreading,時間多線程),以和SMT相區(qū)分。 首先介紹CMT——Coarse-Grained MultiThreading是因為:它是最簡單的多線程技術(shù),當單一執(zhí)行線程遇到長時間的延遲,如Cache Missed時,就進行線程切換,直到原線程等待的操作完成,才切換回去。Coarse-Grained MultiThreading有時也叫Block MultiThreading堵塞多線程或者Cooperative MultiThreading協(xié)作多線程。 由于CMT很簡單,因此很多處理器都有實現(xiàn),除了下面列出之外,很多嵌入式微控制器都有實現(xiàn): 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隨時可以在每個時鐘周期內(nèi)切換多個線程,以追求最大的輸出能力——當然,隨時可以切換也是有代價的,它拉長了每個執(zhí)行線程的平均執(zhí)行時間。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技術(shù),才實現(xiàn)了比T1多了一倍的多線程能力,仔細看看上圖,T2還使用了什么MT技術(shù)(注意第一段的CMT是Chip MultiThreading的意思而不是Coarse-Grained M最典型的:IntelPentium4或者Corei7
ultiThreading的意思)? 雖然CPU上使用FMT技術(shù)的并不 早在NV G40以及ATI R520開始,GPU內(nèi)部就開始應用了FMT細粒度多線程技術(shù),為了隱含Cache Miss的存儲器高延遲,GPU內(nèi)部的執(zhí)行單元不停地在工作線程之間切換,提升總的處理能力。不過,G40的FMT實現(xiàn)了具體多少個線程筆者倒不是很清楚,根據(jù)資料看應該在100左右。 前面說過,SMT其實和其他兩種多線程技術(shù)都不同——那兩種技術(shù)被稱之為TMT時間多線程。SMT——Simultaneous MultiThreading具有多個執(zhí)行單元,可以同時運行多條指令,因此才叫做“同步多線程”!SMT起先源自充分挖掘超標量架構(gòu)處理器的潛力——超標量的意思就是可以同時執(zhí)行多個不同的指令。因此SMT具有最大的靈活性和資源利用率,然而實現(xiàn)也最復雜(當然比起多核結(jié)構(gòu)來說就是小意思了)。 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技術(shù):因為UltraSPARC T2具有兩個執(zhí)行單元,每一個線程組使用一個,線程組內(nèi)則按照T1那樣執(zhí)行4個線程。現(xiàn)代的GPU也采用了類似的混合設(shè)計: 不同的流處理器可以同時執(zhí)行不同的線程,當然同一個流處理器也可以在不同的線程之間切換。 介紹了所有的MT多線程技術(shù)種類之后,我們可以來看Intel的HyperThreading超線程技術(shù)了,前面說過,Intel具有超線程技術(shù)的CPU有:Pentium 4(NetBurst架構(gòu))、Core i7(Nehalem架構(gòu))、Itanium 2(Mondecito)、Atom(Silverthorne)。我們已經(jīng)知道具有超線程技術(shù)的Pentium 4/Pentium 4 Xeon(不是所有的P4都有超線程技術(shù))采用的是SMT架構(gòu),Core i7的則是其改進版本。我們再來看看Itanium 2:Itanium 2 Montecito采用了雙核心設(shè)計,每核心兩個線程;Itanium 2 Montecito的超線程技術(shù)采用了CMT架構(gòu); 可見,Itanium 2的超線程技術(shù)和Pentium 4的SMT不同,它實際上是CMT粗粒度多線程技術(shù)。這是因為Itanium 2是In-Order架構(gòu)的,SMT的原始構(gòu)想就是充分壓榨OOOE(Out-Of-Order Execution)的能力,因此In-Order架構(gòu)的Itanium 2就沒有采用SMT的方式。因為要創(chuàng)建多個線程的代價太大。 那是否In-Order架構(gòu)的處理器就不能實現(xiàn)SMT了呢?并不是,Intel的Atom就是一個典型的例子: 除了Atom之外,IBM的怪物Power6(起始頻率4.7GHz)也采用了基于In-Order架構(gòu)的SMT技術(shù)(Power5的SMT是基于Out-Of-Order):IBM Power6處理器,雙核,每核兩個線程;Power6:In-Order + SMT,Power5則是Out-Of-Order + SMT。[2][編輯本段]超線程“靈魂附體”——同步多線程技術(shù) 在NetBurst微架構(gòu)后期,Intel為了維持性能上的優(yōu)勢,將Prescott核心的Pentium 4流水線拉長到31級;細化后的流水線可以被分成若干個環(huán)節(jié),然后執(zhí)行不同的任務(wù)進程,Intel將其稱為“Hyper-Threading Technology(超線程技術(shù),簡稱HT)”。但過長的流水線需要進行大量的分支預測工作,而且一旦預測失準,就要把當前的工作全部推倒重新來過。這就造成了Pentium 4 HT處理器空有高頻率,發(fā)熱量也大得驚人,性能卻提高有限,最終還被扣上了“高頻低能”的大帽子。 從原則上來講HT技術(shù)絕對是一項非常有意義的創(chuàng)新和嘗試,如果我們假設(shè)當初HT遇到的不是流水線冗長Prescott Pentium 4,而是更加精簡高效的Core 2 Duo,結(jié)果會怎樣? 當然,只有14級流水線的Core 2 Duo最終還是與HT擦肩而過(當初的理由是過短的流水線沒必要引入超線程技 術(shù));但這并不代表Intel放棄了這方面的努力,現(xiàn)在Nehalem就在嘗試做這樣的事情。所不同的是,這次的主角有了一個新名字——Simultaneous Multi-Threading(同步多線程,簡稱SMT)。 新技術(shù)允許內(nèi)核在同一時間運行兩個不同的進程,以此來壓縮多任務(wù)處理時所需要的總時間。這么做有兩個好處,其一是提高處理器的計算性能,減少用戶得到結(jié)果所需的時間;其二就是更好的能效表現(xiàn),利用更短的時間來完成任務(wù),這就意味著在剩下的時間里節(jié)約更多的電能消耗。當然這么做有一個總前提——保證SMT不會重復HT所犯的錯誤,而提供這個擔保的則是在Core微架構(gòu)中表現(xiàn)非常出色的分支預測設(shè)計。
轉(zhuǎn)載于:https://www.cnblogs.com/czjone/archive/2010/05/20/1739979.html
總結(jié)
- 上一篇: Windows XP SP3支持多用户远
- 下一篇: 如何开启OpenSSL和mcrypt