现代处理器设计——超标量处理器基础(5-8)
現(xiàn)代處理器設(shè)計——超標量處理器基礎(chǔ)(5-8)
重命名中出現(xiàn)的影子寄存器(shadow registers)具有專有用處,例如作為計數(shù)寄存器,鏈接寄存器的重命名等。
分派階段停頓的產(chǎn)生原因:寄存器讀端口飽和,保留站飽和,重命名緩沖飽和,完成緩沖飽和,多于一條指令分派到同一單元(保留站只有一個寫端口),串行化限制
串行化限制:某些指令要求之前的指令必須在該指令執(zhí)行之前完成分派/執(zhí)行,之后的指令必須在該指令執(zhí)行結(jié)束之后才能夠分派/執(zhí)行
MSHR(the miss status holding register):保存cache失效后要處理的操作,直到cache miss處理完成。
對于分支預(yù)測器,16K的一位項的性能要好于8K的兩位項
ROB必須要檢查給定的IA32指令的邊界,確定它們是否嚴格地遵守原子性規(guī)則。(某些微操作被標記為第一個微操作或者是最后一個微操作)
當(dāng)對組成IA32指令的一系列微操作進行提交時,不能處理外部的事件,所有外部事件必須等待。當(dāng)時在兩個IA32指令之間,處理器必須能夠捕獲中斷,斷點,自陷和處理錯誤等。
IA32體系結(jié)構(gòu)允許對通用整數(shù)寄存器(EAX,AX,AH)進行部分的讀取和寫入,因此在寄存器重命名實現(xiàn)上就會產(chǎn)生問題。當(dāng)部分寬度的寫操作后面跟有一個更長寬度的讀操作時,更長寬度的讀操作所需要的數(shù)據(jù)必須額能夠得到前面多個寫操作針對寄存器不同部分的更新。
- 解決:P6的解決方法是由RAT記錄整數(shù)數(shù)組的每一項(對應(yīng)一個微操作的目的寄存器)所使用的寄存器寬度,為數(shù)組的每一項增加一個2位的寬度域,以區(qū)分三種寬度的寄存器寫操作。RAT使用寄存器的寬度信息來決定當(dāng)前的讀操作是否需要一個比前面寫入的值更“寬”的寄存器值。如果需要,RAT必須生成一個部分寫停頓。
- 8位寄存器的獨立使用。如果對一個整數(shù)寄存器的三種寬度的訪問都采用同一個別名,那么會導(dǎo)致大量的假相關(guān)出現(xiàn)。使用Low Bank和High Bank,高位字節(jié)或低位字節(jié)寄存器使用的是不同的重命名表項,兩者相互獨立的重新命名
由于RS是亂序分派微操作,其空閑表項典型的分布方式是分散在已經(jīng)使用或者已經(jīng)分配的表項之間,所以不能使用正常的循環(huán)緩沖模型,取而代之的是一種位圖方法,每一個RS表項對應(yīng)著RS分配池中的一位數(shù)據(jù)。通過這種方法,這些表項可以在分配池中以任何順序被移動或者替代。RS的搜索方式是從地址0開始掃描,直到發(fā)現(xiàn)空閑表項為止。
超標量發(fā)展時間表
六種級別的復(fù)雜程度的超標量技術(shù)
- 浮點協(xié)處理器方式:發(fā)射邏輯允許同時發(fā)射一條整數(shù)指令和一條浮點指令,其它不允許多發(fā)射
- 整數(shù)指令和分支指令:允許同時發(fā)射整數(shù)指令和分支指令
- 多條整數(shù)指令發(fā)射
- 相關(guān)的整數(shù)指令發(fā)射:使用級聯(lián)或者3輸入的ALU來實現(xiàn)相關(guān)的整數(shù)指令的多發(fā)射
- 支持精確中斷的多功能部件:強調(diào)精確異常模型,具有復(fù)雜的恢復(fù)機制,功能部件較多而發(fā)射約束較少。完全亂序執(zhí)行
- 擴展的亂序執(zhí)行:按序分派,亂序執(zhí)行,按序提交
Alpha為底層軟件提供了一種特殊模式,稱為特權(quán)體系結(jié)構(gòu)庫(PAL,privileged architecture library)。這些例程具有強制的入口點并且執(zhí)行的時候不允許中斷。盡管它們是由一般的Alpha指令所組成的,但也可以訪問隱藏實現(xiàn)的寄存器和指令。
HP的PA-RISC(Precision architecture精確體系結(jié)構(gòu))是最早的RISC體系結(jié)構(gòu)之一。
如果處理器執(zhí)行指令的速率只受限于真數(shù)據(jù)相關(guān),則稱該處理器運行在處理器的極限狀態(tài)。在程序動態(tài)數(shù)據(jù)流圖中,只要指令的操作數(shù)就緒,則該指令就被執(zhí)行,在這種情況下,該處理器則達到了數(shù)據(jù)流極限。
給定一個數(shù)據(jù)流圖,可以通過計算數(shù)據(jù)流圖的高度(存在的最長路徑的長度)來計算程序執(zhí)行時間的下限。數(shù)據(jù)流極限就是這個下限,并且決定了指令執(zhí)行可獲得的最大速率或者ILP。該速率定義為程序中指令的數(shù)量除以數(shù)據(jù)流圖的高度
程序的值局部性:大部分真實程序產(chǎn)生和消耗的值由有限的值集合構(gòu)成
- 重用前面指令計算的結(jié)果(指令重用)
- 根據(jù)前面一些指令的結(jié)果預(yù)測將要執(zhí)行的指令結(jié)果(值預(yù)測)
值局部性出現(xiàn)的經(jīng)驗統(tǒng)計場景:
- 數(shù)據(jù)冗余:真實程序的輸入構(gòu)成的集合常常是由變動很小的數(shù)據(jù)構(gòu)成。例如包含多個0個稀疏矩陣,包含空格的文本文件
- 錯誤檢測:對不常發(fā)生的情況的檢測頁常常被編譯僅負載單元,而這實際上是運行時的常量
- 程序變量:利用立即數(shù)來構(gòu)造程序常量比從存儲器載入程序常量更加有效
- 分支的計算:為了計算分支的目標地址,例如switch語句,編譯器必須產(chǎn)生代碼,將分支表的基地址裝載入寄存器,該地址常常是運行時的常量
- 虛函數(shù)調(diào)用:為了調(diào)用虛函數(shù),編譯器必須產(chǎn)生代碼來裝載函數(shù)指針,該指針常常是運行時的常量
- 黏合代碼:考慮到可編址能力和鏈接約定,編譯器必須時常產(chǎn)生黏合代碼從一個編譯單元調(diào)用另一個編譯單元。這樣的代碼包含的load指令與數(shù)據(jù)的地址往往在程序的整個執(zhí)行過程中保持不變
- 可編址能力:為了獲得非自動存儲單元的地址可編址能力,編譯器必須從表中裝載指令,該指令只有在程序裝載后才被初始化并始終保持不變
- 調(diào)用子圖的恒等性:函數(shù)或者過程總是被固定的且比較小的函數(shù)集合調(diào)用,同樣,函數(shù)和過程自身也趨向于調(diào)用固定的函數(shù)集合,該集合通常比較小。因此動態(tài)調(diào)用通常在程序調(diào)用圖中形成恒等的子圖。因此,恢復(fù)鏈接寄存器以及其他調(diào)用者保存的寄存器中的load指令有很高的值局部性
- 存儲器別名解析:編譯器必須對可能存在別名的store指令的處理采用保守策略,它會頻繁地產(chǎn)生似乎冗余的load指令來解析這些別名。這些裝載很可能表現(xiàn)出某種程序的值局部性
- 寄存器溢出代碼:當(dāng)編譯器使用完所有的寄存器時,便將保持不變的變量寫入存儲器并重復(fù)地從存儲器載入
- 收斂算法:值局部性常常是由程序員要實現(xiàn)的算法所引起的。常見的例子如收斂算法,該算法在一個數(shù)據(jù)集合上重復(fù)執(zhí)行,直到達到全局收斂。通常,局部收斂會在全局收斂之前出現(xiàn),導(dǎo)致收斂域中的重復(fù)計算。
- 輪詢算法:算法的選擇帶來值局部性的另一個例子:使用輪詢算法替代效率更高的事件驅(qū)動算法。輪詢算法中,重復(fù)檢測會引起大量的冗余計算
非預(yù)測的值局部性利用
- 記憶法:動態(tài)地記錄復(fù)雜計算的結(jié)果,并且在所有可能的情況下,通過重用這些結(jié)果來避免這些復(fù)雜計算。該技術(shù)可以由程序員手工執(zhí)行,也可以由編譯器自動執(zhí)行。缺點:所有被紀錄的計算必須保證沒有副作用,計算本身必須不改變?nèi)魏稳譅顟B(tài),也不會依賴于外部對全局狀態(tài)的修改,并且它的所有的輸入必須定義清楚,以便記憶表查找能夠符合前面的實例,所有的輸出或者對其余程序的影響也必須定義清楚,以便重用機制能夠正確執(zhí)行。
- 指令重用:記憶法在指令級的硬件實現(xiàn)。這種技術(shù)一旦發(fā)現(xiàn)“生產(chǎn)者“指令無須執(zhí)行,則將”生產(chǎn)者“指令和”消費者“指令分離,以發(fā)現(xiàn)更多的指令級并行。只要重用機制發(fā)現(xiàn)某條指令符合重用歷史上的實例,并能夠安全使用前一實例的結(jié)果,就可以采用這一技術(shù)。
重用歷史機制
- 對于指令重用,要執(zhí)行的計算由程序計數(shù)器來指定,程序計數(shù)器在進程地址空間中唯一地指令一條靜態(tài)指令,而活躍輸入則是該靜態(tài)指令的寄存器和存儲器操作數(shù)
- 對于塊重用,計算由基本塊中指令的地址范圍來指令,活躍輸入則是基本塊入口處活躍的源操作數(shù)和存儲器操作數(shù)
- 對于trace重用,相應(yīng)計算和trace cache中的表項相對應(yīng),該表項是由取指指令的地址和確定trace控制流通路的一組條件分支的輸出唯一確定的,同時也必須指明trace入口處活躍的操作數(shù)。
- 保存在重用緩沖中的前提條件包含一個關(guān)鍵屬性,即它們唯一地指令一個事件集合,該集合導(dǎo)致了所紀錄結(jié)果的計算
處理器使用重用機制的難點
- 處理器必須能夠忽略重用指令的執(zhí)行,可以直接執(zhí)行后面的工作,以此來消除或者減少重用指令所帶來的數(shù)據(jù)相關(guān)和結(jié)構(gòu)相關(guān)。
- 重用侯選項必須將它們的結(jié)果寫入處理器的系統(tǒng)狀態(tài),因此需要在現(xiàn)有的物理寄存器文件上再增加寫端口
- 修改指令喚醒和調(diào)度邏輯,以便適應(yīng)延遲實際上為0的重用指令
- 為了支持精確異常,重用侯選項必須進入處理器的再定序緩沖,同時必須繞過發(fā)射隊列或者RS,意味著更復(fù)雜的控制通路
- 為了保持正確的存儲器引用順序,需要在處理器的load/store隊列中跟蹤重用的存儲器指令
數(shù)據(jù)流區(qū)域重用:使用指針嵌入到重用緩沖中來連接具有數(shù)據(jù)相關(guān)的指令。對數(shù)據(jù)流圖而言,因為重用屬性可以傳遞,可以通過遍歷這些指針來重用數(shù)據(jù)流圖的整個子圖,因此任何指令,只要它的數(shù)據(jù)流的前項都是重用候選,則它也是重用候選。
強相關(guān)模型:
- 相關(guān)是以一種絕對而精確的方式?jīng)Q定的,即兩條指令間的關(guān)系不是相關(guān)就是非相關(guān),如果存在疑問,認為存在相關(guān)
- 在指令執(zhí)行中保持相關(guān),即不允許違背相關(guān)關(guān)系,并且在指令執(zhí)行過程中,需要保持這種相關(guān)
弱相關(guān)模型:
- 不需要精確確定或者假定相關(guān)關(guān)系,而是樂觀的近似估計甚至?xí)簳r忽略相關(guān)關(guān)系
- 只要在影響持久的機器狀態(tài)前能夠執(zhí)行恢復(fù)工作,就可以在指令執(zhí)行中暫時違背相關(guān)關(guān)系
弱相關(guān)模型的優(yōu)點:由CFG和DFG指明的程序語義在機器能處理指令之前不需要完全確定,更進一步,只要矯正措施隨時可以恢復(fù)預(yù)測錯誤,機器就可以主動預(yù)測或者暫時違背相關(guān)關(guān)系。從概念上說,使用弱相關(guān)模型的機器有兩個相互作用的引擎。前段引擎采用弱相關(guān)模型并采用推測執(zhí)行,后端引擎仍然使用強相關(guān)引擎來驗證推斷的有效性。
值預(yù)測單元:為處理器核心的推斷計算產(chǎn)生正確的預(yù)測值。值預(yù)測單元的效果主要由兩個因素決定:準確率和覆蓋率。準確性度量預(yù)測器能夠避免預(yù)測發(fā)生錯誤的能力,而覆蓋率則度量預(yù)測器預(yù)測指令輸出的能力。準確率和覆蓋率一般不可兼得。
提高預(yù)測器準確性:置信度估計技術(shù)
置信度估計技術(shù)將置信度和每個值預(yù)測聯(lián)系在一起,并使用這些置信度來過濾不正確的預(yù)測,以此來提高預(yù)測的準確性。如果預(yù)測超過某個置信度閾值后,則處理器核心將采用該預(yù)測值,否則忽略預(yù)測值并不帶推測地執(zhí)行。
置信度是通過歷史機制來建立的,該機制在推測正確時使計數(shù)器加1,推測不正確時將計數(shù)器減1或者重置計數(shù)器。
基于歷史的預(yù)測器:最簡單的基于歷史的預(yù)測器值只記住特定靜態(tài)指令最近寫入的值,并且推測該指令的下一個動態(tài)實例會計算相同的結(jié)果。更復(fù)雜的預(yù)測器提供了相應(yīng)的方法為每條靜態(tài)指令存儲多個不同的值,然后使用一些策略從這些值中選擇一個作為預(yù)測值
計算預(yù)測器:試圖捕捉一條靜態(tài)指令產(chǎn)生的值序列的可預(yù)測模式,然后計算序列中的下一個實例。與基于歷史的預(yù)測器的區(qū)別在于,能夠預(yù)測在前面程序執(zhí)行中沒有發(fā)生的值。
預(yù)測驗證的兩個目的:
- 在預(yù)測發(fā)生錯誤的時候能夠激發(fā)恢復(fù)動作
- 需要將”驗證了一個正確的預(yù)測“這一事實告訴使用改預(yù)測結(jié)果進行推斷執(zhí)行的相關(guān)指令
預(yù)測錯誤恢復(fù)
- 利用重新取指進行恢復(fù):硬件改動小,但是代價非常大
- 利用選擇性重新發(fā)射進行恢復(fù):選擇使用了錯誤預(yù)測值的指令進行重新發(fā)射
數(shù)據(jù)流主動執(zhí)行的錯誤恢復(fù):只要非推測性的操作數(shù)就緒,相關(guān)指令就將推測性地重新執(zhí)行,即相關(guān)指令存在第二個”影子發(fā)射“,就好像前面沒有發(fā)生推測發(fā)射一樣。預(yù)測驗證和第二次發(fā)射并行執(zhí)行,在預(yù)測正確的情況下,影子發(fā)射將停止,否則影子發(fā)射將繼續(xù),就像沒有發(fā)生推測一樣執(zhí)行。問題在于消耗的執(zhí)行資源太多。
選擇性重發(fā)射的問題:
- 存儲器數(shù)據(jù)相關(guān):要考慮由于使用了預(yù)測值進行的得到的預(yù)測地址是否會影響其他存儲操作,例如定向旁路的問題等
- 調(diào)度邏輯的改變:已經(jīng)發(fā)射的指令可能要被重新發(fā)射,所以指令需不需要離開發(fā)射隊列或者保留站。解決:1.將預(yù)測性發(fā)射的指令從保留站移除,但是提供額外的機制在需要重新發(fā)射的時候?qū)⑺鼈冎匦虏迦氡A粽?#xff1b;2. 將它們保留在保留站中直到輸入操作數(shù)不再是預(yù)測的。
值預(yù)測的性能影響因素:
- 程序或者工作負載中值局部性的程度
- 正確預(yù)測指令和使用結(jié)果的指令之間動態(tài)相關(guān)的距離。如果編譯器已經(jīng)將相關(guān)指令調(diào)度為距離較遠,則好處很少
- 通過機器模型得到的取指速率。如果取指速率比流水線的執(zhí)行速率快,則值預(yù)測可以顯著提高執(zhí)行吞吐率,否則好處很少
- 值預(yù)測單元獲得的覆蓋率。越多的指令得到預(yù)測,性能好處越多
- 值預(yù)測單元的準確率。
- 在流水線實現(xiàn)中,發(fā)生預(yù)測錯誤后導(dǎo)致的損失。
- 數(shù)據(jù)流相關(guān)性限制程序的程度。如果程序的性能主要不是受數(shù)據(jù)相關(guān)性的影響,則通過值預(yù)測消除數(shù)據(jù)相關(guān)性將不會帶來很多好處
總結(jié)
以上是生活随笔為你收集整理的现代处理器设计——超标量处理器基础(5-8)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hackmyvm之warez
- 下一篇: Axure 8.1.0.3388授权码