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