Microarchitecture: HyperThreading(超线程)
線程并行
當(dāng)代的軟件趨向于運(yùn)行在多線程模式,或者是并行處理。網(wǎng)絡(luò)包傳輸和web服務(wù)可以運(yùn)行以多線程的方式運(yùn)行以達(dá)到更高的性能。甚至是桌面應(yīng)用也開(kāi)始增加并行性。Intel架構(gòu)師已經(jīng)開(kāi)始嘗試?yán)肨LP( thread-level parallelism) 線程并行性,用來(lái)在較少的晶體管和功耗下就能達(dá)到更高的性能。
高端和終端的服務(wù)器市場(chǎng),多核已經(jīng)被廣泛的使用,已獲得更高的性能。通過(guò)增加處理器,應(yīng)用可以通過(guò)在更多的處理器上運(yùn)行更多的線程已達(dá)到更高的性能。這些線程可能屬于同一個(gè)應(yīng)用,也可以屬于不同的應(yīng)用。多核系統(tǒng)已經(jīng)被使用多年,高端程序員已經(jīng)可以熟練的利用多核來(lái)達(dá)到更高的性能。
近幾年,大家討論了一些提高TLP的技術(shù),也提出了產(chǎn)品。比如CMP(chip multiprocessing),兩個(gè)處理器被放到了一個(gè)die上。這兩個(gè)處理器都各自擁有完全的組件和架構(gòu)資源。處理器之間可以共享更大的片上cache。 CMP和傳統(tǒng)的多核系統(tǒng)基本無(wú)關(guān),你可以在傳統(tǒng)的多核系統(tǒng)上使用CMP芯片。然而,CMP chip 將會(huì)比單核chip面積上大的多,因此造價(jià)更高。并且這也沒(méi)有解決die的面積和功耗問(wèn)題。
另一種方法就是通過(guò)線程切換,允許單核去執(zhí)行多線程。通過(guò)時(shí)間片切換,實(shí)現(xiàn)多線程切換。然而這將導(dǎo)致多余的執(zhí)行,但是可以有效地減少訪問(wèn)memory導(dǎo)致的latency。如果多線程基于event切換,那么當(dāng)多線程遇到cache miss的情況時(shí),可以有效地減少latency。這個(gè)方法對(duì)于大量cache miss 和執(zhí)行類(lèi)似任務(wù)的線程很有效。但是時(shí)間片或者是基于event切換都沒(méi)有實(shí)現(xiàn)提高資源的利用效率,比如分支預(yù)測(cè)失敗和指令依賴(lài)。
最終,可以用過(guò)單核,不切換的方式實(shí)現(xiàn)多線程。線程可以同時(shí)執(zhí)行,以更高效的利用資源。這個(gè)方法可以最大資源的利用效率。在單位晶體管和功耗時(shí),實(shí)現(xiàn)了性能的最大化。
Hyper-Threading 技術(shù)為intel 架構(gòu)提出了多線程的方法。這篇文章我們將要討論在Xeon 處理器家族中,Hyper-Threading技術(shù)的首次應(yīng)用。
Hyper-Threading技術(shù)架構(gòu)
Hyper-Threading 在單個(gè)物理處理器上實(shí)現(xiàn)了多個(gè)邏輯處理器。我們?yōu)槊恳粋€(gè)邏輯處理器都做了一份architecture 狀態(tài)的拷貝,邏輯處理器之間共享物理執(zhí)行資源。從軟件到架構(gòu)的角度,這意味著操作系統(tǒng)或者是用戶(hù)的程序可以像在多核處理器上調(diào)度多線程一樣,在單核上調(diào)度多線程。從微架構(gòu)的角度,這意味著邏輯處理器將會(huì)在共享的執(zhí)行資源上執(zhí)行不同線程的指令。
圖2展示了多核系統(tǒng)上,兩個(gè)沒(méi)有采用hyper-threading技術(shù)的物理核心。圖3展示了采用了hyper-threading技術(shù)的多核系統(tǒng)。通過(guò)在每個(gè)物理核心上實(shí)現(xiàn)兩份邏輯核心狀態(tài)的備份,系統(tǒng)就看起來(lái)有四個(gè)邏輯核心。
Hyper-Threading 技術(shù)首次實(shí)現(xiàn)在Xeon家族的雙處理器和多處理器服務(wù)器上。通過(guò)有效地利用更多的處理器資源,Xeon 處理器產(chǎn)品可以有效地提高性能。Hyper-Threading技術(shù)增加了小于5%的芯片面積和功耗,但是提供了更多的性能。
?
?
每一個(gè)邏輯處理器都維持一份完整的架構(gòu)狀態(tài)。架構(gòu)狀態(tài)包括寄存器(通用寄存器,控制寄存器和中斷控制寄存器以及狀態(tài)寄存器)。從軟件的角度看,一旦架構(gòu)狀態(tài)有多份,那么處理器可以虛擬的看成兩個(gè)處理器。存儲(chǔ)架構(gòu)狀態(tài)的寄存器的晶體管的數(shù)量是非常小的。邏輯處理器之間基本上共享了所有的資源,比如cache,執(zhí)行單元,分支預(yù)測(cè),控制邏輯以及總線。
每個(gè)邏輯處理器都擁有自己的中斷控制器,因此中斷可以發(fā)送給指定的邏輯處理器,并且準(zhǔn)確的被相應(yīng)的處理器處理。
Hyper-threading 技術(shù)在Intel Xeon 產(chǎn)品中的首次應(yīng)用
在Xeon產(chǎn)品中實(shí)現(xiàn)Hyper-Threading技術(shù)時(shí),預(yù)先設(shè)定了幾個(gè)目標(biāo)。其中一個(gè)是在實(shí)現(xiàn)Hyper-Threading的同時(shí)最小化die的面積。因?yàn)檫壿嬏幚砥鞴蚕砹酥饕奈⒓軜?gòu)資源,僅僅有少部分結(jié)構(gòu)被復(fù)制,因此實(shí)現(xiàn)該技術(shù)的面積占用了全die面積不到5%。
第二個(gè)目標(biāo)是當(dāng)一個(gè)邏輯處理器阻塞時(shí),另一個(gè)邏輯處理器可以繼續(xù)工作。一個(gè)邏輯處理器可能會(huì)因?yàn)閏ache miss,處理branch預(yù)測(cè)失敗和等待依賴(lài)的指令執(zhí)行完畢而暫時(shí)的阻塞一段時(shí)間。獨(dú)立的前向工作流應(yīng)當(dāng)保證在兩個(gè)線程同時(shí)執(zhí)行時(shí),沒(méi)有邏輯處理器可以占用全部的資源。這是通過(guò)劃分或者限制每個(gè)thread可以擁有的資源數(shù)量實(shí)現(xiàn)的。
第三個(gè)目標(biāo)是單線程軟件在hyper-threading處理器上運(yùn)行時(shí)應(yīng)當(dāng)擁有和普通處理器一樣的速度。這意味著,如果單線程運(yùn)行在處理器上,那么它將擁有全部的資源。從更高的角度看,微架構(gòu)的pipeline如figute4所示,其中緩沖隊(duì)列將pipeline分割。Queue要么被對(duì)半分,要么被復(fù)制,以保證每個(gè)線程都可以獨(dú)立的前行。
?
接下來(lái)的章節(jié)我們將會(huì)梳理pipeline,討論一下主要的功能,并且闡述資源的共享與復(fù)制。
Frond End 前端
流水線的前端負(fù)責(zé)將指令傳輸給后續(xù)的pipe 階段。如圖5-a所示,指令最初從Execution Trace Cache(TC)或者L1 指令cache中獲得。圖5-b表明只有TC miss的時(shí)候,cpu才從L2 Cache中取指,譯碼。靠近TC的是微指令ROM(Microcode ROM),存儲(chǔ)為較長(zhǎng),較復(fù)雜的IA-32指令存儲(chǔ)譯碼過(guò)的微碼。
?
Execution Trace Cache (TC)
TC存儲(chǔ)譯碼過(guò)的指令,也稱(chēng)作微指令。大多數(shù)程序中的指令都是從TC中取出并執(zhí)行的。獨(dú)立的兩組指令PC用于追蹤各自的線程的執(zhí)行。兩個(gè)邏輯處理器可以每周期仲裁一次,以獲得TC的所有權(quán)。如果兩個(gè)邏輯處理器在同一時(shí)刻擁有權(quán)限,那么將會(huì)仲裁給一個(gè),在下個(gè)周期仲裁給另一個(gè)。比如,如果兩個(gè)邏輯處理器都請(qǐng)求trace cache的權(quán)限,第一個(gè)周期為一個(gè)邏輯處理器取指令,那么下一個(gè)周期則為另一個(gè)處理器作用。如果一個(gè)邏輯處理器阻塞了,不能夠使用TC,那么另一個(gè)邏輯處理器將可以每個(gè)周期都全帶寬的訪問(wèn)TC。
TC Entry被線程信息所標(biāo)記,并且可以按照需要?jiǎng)討B(tài)的分配。TC結(jié)構(gòu)為8路組相連,使用LRU替換算法。共享的特性可以使一個(gè)邏輯處理器在需要的情況下,擁有比另一個(gè)更多的Entry。
Microcode ROM
當(dāng)遇到了復(fù)雜的指令時(shí),TC發(fā)送一個(gè)微指令指針給Microcode ROM。Microcode ROM將會(huì)控制取微碼,然后將控制權(quán)返回給YC。兩個(gè)邏輯處理器擁有各自獨(dú)立的微指令指針。
邏輯處理器也共享Microcode ROM。訪問(wèn)Microcode ROM的權(quán)限在兩個(gè)邏輯處理器之間切換。
ITLB 和 分支預(yù)測(cè)
如果TC miss,將會(huì)從L2 Cache中取指,解碼為微碼后,存入TC中。ITLB接收到來(lái)自TC對(duì)指令的請(qǐng)求,ITLB將下一條指令的地址(PC)翻譯為物理地址。請(qǐng)求被發(fā)送給L2 Cache,并得到來(lái)自L2 Cache的響應(yīng)。這些指令將會(huì)存放在streaming buffer,直到他們被譯碼。
在hyper-threading中,ITLB被復(fù)制了兩份。每個(gè)邏輯處理器有它自己的的ITLB,而且都有自己得一套指令指針,以追蹤程序的PC。取指邏輯負(fù)責(zé)向L2 Cache發(fā)送請(qǐng)求,它會(huì)基于先來(lái)先處理的準(zhǔn)則,對(duì)取值邏輯進(jìn)行仲裁。一般會(huì)為兩個(gè)邏輯處理器至少處理一個(gè)請(qǐng)求。因此,兩個(gè)邏輯處理器可以同時(shí)有pending的取指。
每個(gè)邏輯處理器都有一套64-byte的stream buffer,為指令解碼階段緩存指令。ITLB和streaming buffer都是較小的結(jié)構(gòu),因此這個(gè)結(jié)構(gòu)的復(fù)制對(duì)die的面積占用較小。
分支預(yù)測(cè)結(jié)構(gòu)可以是復(fù)制的或者共享的。用于預(yù)測(cè)返回指令地址的Return stack buffer也被復(fù)制了,因?yàn)檫@是一個(gè)非常小的部件,并且call/return pair的預(yù)測(cè)根據(jù)獨(dú)立的線程進(jìn)行預(yù)測(cè)會(huì)更加準(zhǔn)確。BHB(分支歷史緩存)用于在global history array中為每個(gè)邏輯處理器查找全局歷史。然而,因?yàn)間lobal history array很大,因此這是一個(gè)共享結(jié)構(gòu),其內(nèi)部項(xiàng)會(huì)被邏輯處理器ID號(hào)打上tag。
IA-32 指令譯碼
IA-32 指令是譯碼起來(lái)是非常笨重的,因?yàn)橹噶钍亲冮L(zhǎng)的,并且有不同的選擇。譯碼將會(huì)花費(fèi)大量的邏輯和臨時(shí)狀態(tài)。幸運(yùn)的是,TC 會(huì)命中大部分的uop,因此我們只需要在TC miss的時(shí)候譯碼。
譯碼邏輯從stream buffer中取出指令,將其譯碼為uop。當(dāng)兩個(gè)線程同時(shí)譯碼時(shí),stream buffer會(huì)在線程之間切換,因此線程會(huì)共享譯碼邏輯。譯碼邏輯需要為兩個(gè)線程保存中間狀態(tài),即使它只為一個(gè)邏輯寄存器譯碼。總體上說(shuō),在切換到另一個(gè)邏輯處理器之前,會(huì)有另一個(gè)邏輯處理器的幾條指令被譯碼。我們會(huì)基于die的大小以及復(fù)雜性來(lái)確定邏輯處理器切換的顆粒度。當(dāng)然,如果只有一個(gè)邏輯處理器需要譯碼,那么它會(huì)占據(jù)全部的譯碼帶寬。譯碼指令將會(huì)被寫(xiě)入TC,并forward到uop隊(duì)列中。
Uop隊(duì)列
Uop來(lái)自以下三個(gè)來(lái)源:
Uop會(huì)被放置到uop queue中。這個(gè)queue將front-end即前端和亂序執(zhí)行執(zhí)行單元解耦。Uop queue根據(jù)邏輯處理器分為兩半。切換使得邏輯處理器可以有獨(dú)立的forward邏輯,不會(huì)因?yàn)榱硪粋€(gè)邏輯處理器的TC miss或者是執(zhí)行單元的暫停而阻塞。
亂序執(zhí)行單元
亂序執(zhí)行單元由分配、寄存器重命名、調(diào)度和執(zhí)行單元組成,如圖6所示。這部分亂序的執(zhí)行指令。一旦他們的輸入準(zhǔn)備好,就立刻執(zhí)行,而不考慮原本的程序中的指令順序。
?
分配
亂序執(zhí)行單元有緩沖buffer用于執(zhí)行重排序,跟蹤和順序操作。分配器從uop queue中取出uop,然后分配執(zhí)行uop所需要的buffer。緩沖buffer包括 126項(xiàng)重排序buffer, 128個(gè)整數(shù)和128個(gè)浮點(diǎn)物理寄存器,48個(gè)load 和 24個(gè)store 項(xiàng)buffer。我們拆分了其中的幾個(gè)重要buffer,所以每個(gè)邏輯處理器可以最多使用其中的一半數(shù)目。比如,邏輯處理器最多可以使用63個(gè)re-order buffer,24個(gè)load buffer和12個(gè)store buffer。
如果兩個(gè)邏輯處理器在uop queue都有uop要處理,分配器將會(huì)每個(gè)周期都為邏輯處理器切換。如果邏輯處理器已經(jīng)使用了它所分配的資源的上限,那么分配器將會(huì)向這個(gè)邏輯處理器發(fā)送一個(gè)暫停信號(hào),而后為另一個(gè)邏輯處理器分配資源。如果uop queue中只包含一個(gè)邏輯處理器的uops,那么分配器將會(huì)每個(gè)周期都為這個(gè)邏輯處理器繼續(xù)分配資源,以?xún)?yōu)化分配帶寬,盡管還需要滿足資源上限條件。
通過(guò)限制關(guān)鍵buffer的資源占用限制,可以公平的對(duì)待每個(gè)邏輯處理器并且避免死鎖。
寄存器重命名
寄存器重命名將IA-32寄存器命名為物理寄存器。這將會(huì)使8個(gè)通用IA-32整數(shù)寄存器變?yōu)閯?dòng)態(tài)可調(diào)節(jié)的128個(gè)物理寄存器。重命名邏輯通過(guò)寄存器重命名表格(RAT)以追蹤最新的架構(gòu)寄存器。這樣新來(lái)的指令就可以明確其操作數(shù)架構(gòu)寄存器對(duì)應(yīng)的物理寄存器。
因?yàn)檫壿嬏幚砥餍枰S護(hù)并追蹤自己的完整的架構(gòu)狀態(tài),因此我們?yōu)槊恳粋€(gè)邏輯處理器都設(shè)置了一個(gè)RAT。重命名過(guò)程與上述的分配邏輯并行執(zhí)行。因此分配器和寄存器重命名會(huì)同時(shí)處理相同的uops。
一旦uops已經(jīng)完成了分配和寄存器重命名,他們就會(huì)被分配到兩組queue中,一組作用域寄存器操作(load and store),另一組負(fù)責(zé)所有的其他操作。這兩組queue分別叫做存儲(chǔ)指令隊(duì)列和通用指令隊(duì)列。這兩組隊(duì)列也被切分,每個(gè)邏輯寄存器最多使用一半。
指令調(diào)度
指令調(diào)度是亂序執(zhí)行的關(guān)鍵所在。五個(gè)uop調(diào)度器用于在不同的執(zhí)行單元之間調(diào)度不同類(lèi)型的指令。每周期可以最多派發(fā)6條uops。如果uops的輸入操作數(shù)準(zhǔn)備好了,并且執(zhí)行單元已經(jīng)空出,可以使用,那么調(diào)度器將會(huì)選擇哪個(gè)uops可以開(kāi)始執(zhí)行。
存儲(chǔ)指令隊(duì)列和通用指令隊(duì)列會(huì)盡快的將uops發(fā)送到五個(gè)調(diào)度隊(duì)列。如果需要的話,會(huì)每周期為邏輯處理器切換操作。
每個(gè)調(diào)度器都有自己的8項(xiàng)到12項(xiàng)的調(diào)度隊(duì)列。調(diào)度器從調(diào)度隊(duì)列中選擇uops,發(fā)送給執(zhí)行單元。調(diào)度器不會(huì)基于uops究竟屬于哪一個(gè)邏輯處理器來(lái)選擇uops。也就是說(shuō),調(diào)度器無(wú)視邏輯處理器。Uops可以?xún)H僅根據(jù)輸入操作數(shù)和執(zhí)行單元而被選擇。舉個(gè)例子,調(diào)度器可以同時(shí)分配兩個(gè)邏輯處理器額各自?xún)蓷luops。為了避免死鎖,并且保證公平,我們隊(duì)邏輯處理器在調(diào)度隊(duì)列中的數(shù)目上限進(jìn)行了設(shè)置。這個(gè)上限值取決于調(diào)度隊(duì)列的大小。
執(zhí)行單元
執(zhí)行單元和存儲(chǔ)層次也不會(huì)區(qū)分不同的邏輯處理器。因?yàn)樵醇拇嫫骱湍繕?biāo)寄存器已經(jīng)在同一個(gè)物理寄存器池中被重命名,因此uops僅通過(guò)讀取物理寄存器文件可以知道其目標(biāo)寄存器對(duì)應(yīng)的物理寄存器。通過(guò)比較物理寄存器的編號(hào)就可以將操作結(jié)果forward給其他的uops,而不需要明確邏輯寄存器號(hào)。在執(zhí)行之后,uops被存放到重排序緩沖中。重排序緩沖將執(zhí)行階段和retire階段解耦。重排序緩沖為每個(gè)邏輯處理器各分一半。
退休單元
Uop退休邏輯將會(huì)按照程序的順序改變架構(gòu)狀態(tài)。退休邏輯會(huì)追蹤兩個(gè)邏輯處理器中的待退休指令。然后通過(guò)在兩個(gè)邏輯處理器之間切換,并按照程序的順序提交、改變架構(gòu)狀態(tài)。退休邏輯會(huì)為一個(gè)邏輯處理器退休uop,然后切換到另一個(gè)。如果一個(gè)邏輯處理器一直沒(méi)有準(zhǔn)備好退休uop,那么退休單元會(huì)全力退休另一個(gè)邏輯處理器。
一旦store退休,store的數(shù)據(jù)需要被寫(xiě)入第一級(jí)data cache。選擇邏輯會(huì)在邏輯處理器之間切換,以將數(shù)據(jù)存儲(chǔ)到cache中。
Memory 子系統(tǒng)
Memory子系統(tǒng)包括DTLB,L1 data cache , L2 data cache 和L3 data Cache(L3 cache只在Xeon處理器中有)。對(duì)memory子系統(tǒng)的訪問(wèn)也不考慮邏輯處理。存儲(chǔ)子系統(tǒng)只是來(lái)了請(qǐng)求,就處理。
DTLB
DTLB將邏輯地址翻譯為物理地址。它是64路全相連。每一項(xiàng)可以映射4K或者4M page大小。盡管DTLB是兩個(gè)邏輯處理器中共享的結(jié)構(gòu),但是每一項(xiàng)都會(huì)包含一個(gè)處理器ID。每個(gè)邏輯處理器都有自己的一個(gè)保留寄存器以保證公平性和在DTLB miss時(shí),進(jìn)行forward。
L1 Data Cache, L2 Cache,L3 Cache
L1 data cache是4路組相連,每個(gè)cacheline 64 byte。它是寫(xiě)直達(dá)cache,這意味著寫(xiě)操作也會(huì)直接寫(xiě)入L2 Cache。L1 Cache 是虛擬地址索引,物理地址做tag。
L2 和 L3 Cache是8路組相連,每個(gè)cacheline 128 byte。L2 和L3 cache是物理地址索引。邏輯處理器之間共享cache。
因?yàn)檫壿嬏幚砥鞴蚕韈ache,因此可能有潛在的cache沖突,這可能會(huì)導(dǎo)致更低的性能。但是也可能會(huì)存在共享cache中的數(shù)據(jù)。比如,一個(gè)邏輯處理器可能預(yù)取另一個(gè)處理器需要的指令或者數(shù)據(jù)。這在服務(wù)器應(yīng)用程序中很常見(jiàn)。在生產(chǎn)者-消費(fèi)者模型中,一個(gè)邏輯處理器可能產(chǎn)生另一個(gè)邏輯處理器需要使用的數(shù)據(jù)。在這類(lèi)case中,可以挖掘潛在的更高的性能。
BUS
如果cache miss,那么邏輯處理器將會(huì)訪問(wèn)bus logic。Bus logic包括本地的APIC中斷控制器,也包括片外的系統(tǒng)存儲(chǔ)和I/O 空間。總線邏輯也處理來(lái)自外部總線對(duì)cacheable 地址的snoop請(qǐng)求和本地APIC輸入的終端。
從服務(wù)的角度來(lái)看,邏輯處理器的請(qǐng)求是根據(jù)先來(lái)先處理的原則。Queue和Buffer空間是共享的。我們不會(huì)給其中的一個(gè)邏輯處理器優(yōu)先權(quán)限。
我們也會(huì)區(qū)分來(lái)自不同邏輯處理器的請(qǐng)求。對(duì)本地APIC的請(qǐng)求和中斷資源是唯一的,并區(qū)分不同的邏輯處理器。總線邏輯也會(huì)基于邏輯處理器來(lái)處理barrier fence(屏障操作)和memory order操作。
對(duì)于debug功能,邏輯處理器的ID號(hào)被顯示的發(fā)送給處理器的外部總線。其他的總線操作,如cache line evict和預(yù)取操作,會(huì)根據(jù)產(chǎn)生transaction的請(qǐng)求來(lái)獲取邏輯處理器的ID號(hào)。
單任務(wù)和多任務(wù)模式
當(dāng)一個(gè)軟件線程要執(zhí)行時(shí),為了優(yōu)化性能,提供了兩種模型多任務(wù)模型(multi-task MT)和單任務(wù)模型(ST)。在MT模式中,有兩個(gè)工作的邏輯處理器,其中的一些資源被如前所述的方式切分。ST模式分為兩種,single-task 邏輯處理器0(ST0)和single-task 邏輯處理器1(ST1)。在ST-0或者ST-1模式中,只有一個(gè)邏輯處理器處于工作狀態(tài)。在MT模式中被切分的資源被單個(gè)處理器暢享。IA-32 Intel 架構(gòu)有一個(gè)指令叫做HALT,將會(huì)停止處理器的執(zhí)行,然后使得處理器進(jìn)入低功耗狀態(tài)。HALT是一條特權(quán)指令,這意味著只有操作系統(tǒng)或者其他的ring-0級(jí)別的程序可以執(zhí)行這條指令。用戶(hù)級(jí)別的程序是不可以執(zhí)行HALT執(zhí)行的。
如果處理器采用了Hyper-Threading技術(shù),執(zhí)行HALT指令,處理器將會(huì)從MT模式切換到ST-0或者ST-1模式。比如,如果邏輯處理器0執(zhí)行HALT,那么只有邏輯處理器1處于工作狀態(tài)。那么物理寄存器將會(huì)處于ST-1模式。先前被切分的資源將會(huì)被邏輯處理器1全部助戰(zhàn)。如果邏輯處理器1也執(zhí)行了HALT操作,那么物理處理器可以進(jìn)入低功耗狀態(tài)。
在ST0或者ST1模式中,中斷發(fā)送給已經(jīng)HALT的處理器將會(huì)導(dǎo)致處理器進(jìn)入MT模式,操作系統(tǒng)負(fù)責(zé)管理MT模式的切換。
圖7總結(jié)了上述的討論。在ST0或者ST1模式資源被完全分配給單個(gè)邏輯處理器。在MT模式,資源在兩個(gè)邏輯處理器間共享。
操作系統(tǒng)和應(yīng)用程序
使用了Hyper-Threading 技術(shù)的處理器在操作系統(tǒng)和應(yīng)用程序看來(lái),處理器核心數(shù)翻倍。操作系統(tǒng)將會(huì)當(dāng)把邏輯處理器當(dāng)做物理處理器進(jìn)行管理,調(diào)度程序和線程。然而,為了達(dá)到最高的性能,操作系統(tǒng)會(huì)實(shí)現(xiàn)兩種優(yōu)化。
第一種是如果僅有一個(gè)邏輯處理器active使用HALT指令。使用HALT將會(huì)使處理器進(jìn)入ST0或者ST1模式。不使用這個(gè)優(yōu)化的操作系統(tǒng)將會(huì)在一個(gè)邏輯處理器idle,另一個(gè)邏輯處理器active的處理器上工作。并且idle的邏輯處理器會(huì)持續(xù)的判斷是否有人物要執(zhí)行,這個(gè)叫做idle loop。Idle loop將消耗執(zhí)行資源,如果這些執(zhí)行資源釋放,那么性能將會(huì)更高。
另一種優(yōu)化就是將軟件線程調(diào)度到邏輯處理器上。總體上來(lái)說(shuō),為了更好的性能,操作系統(tǒng)將會(huì)在調(diào)度線程到相同的物理處理器之前,調(diào)度線程到不同的物理處理器上。這個(gè)優(yōu)化將會(huì)使得線程盡可能的執(zhí)行在不同的物理核心上。
性能提升
在單核處理器和多核處理器上,Hyper-threading技術(shù)可以提升21%的性能。
?
在網(wǎng)站服務(wù)器的workload中,可以獲得16%到28%的性能提升。
?
筆記:
| Sub System | IP Block | Share | Duplicate | Partion |
| 前端 | Trace Cache | √ | ? | ? |
| Microcode ROM | √ | ? | ? | |
| ITLB | ? | √ | ? | |
| 分支預(yù)測(cè) | ? | √ | ? | |
| Return stack | ? | √ | ? | |
| 譯碼 | √ | ? | ? | |
| Uop 隊(duì)列 | ? | ? | √ | |
| 亂序執(zhí)行 | 分配 | ? | ? | √ |
| 寄存器重命名 | √ | ? | ? | |
| 指令調(diào)度 | √ | ? | ? | |
| 執(zhí)行單元 | √ | ? | ? | |
| 重排序緩沖區(qū) | ? | ? | √ | |
| 存儲(chǔ)系統(tǒng) | DTLB | √ | ? | ? |
| Cache | √ | ? | ? |
歡迎關(guān)注我的公眾號(hào)《處理器與AI芯片》
?
總結(jié)
以上是生活随笔為你收集整理的Microarchitecture: HyperThreading(超线程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: labuladong的算法小抄_学会了回
- 下一篇: bibtex引用参考文献排版格式