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