記分牌和tomasulo算法
動態調度:
通過硬件在程序執行時重新安排代碼的執行序列來減少競爭引起的流水線停頓時間
動態調度流水線具備以下功能:
(1)允許按序取多條指令和發射多條指令----取指(IF)流水級允許按順序取多條指令進入單口暫存器(single-entry latch)或隊列(queue), 指令然后從latch或queue取出,進入ID節拍。
(2)能檢查並消除hazards----將ID流水級分為獨立的兩級:Issue級和Read operand級:
Issue級功能
----指令譯碼,檢查是否存在結構競爭(即在這一流水級解決結構競爭問題);
Read operands級功能
----等到無數據競爭(RAW)后,讀出操作數,即在這一流水級解決數據競爭問題
記分牌算法具體設計:
動態調度技術需要將ID譯碼段分成兩個階段:1是發射,2是讀取操作數。發射階段對指令進行譯碼,檢查結構冒險(例如有四個運算器:整數運算、加法器、乘法器、除法器,檢查該指令需要使用的運算器是否正在被占用)讀取操作數階段檢查數據冒險(讀之前檢查寄存器的值是否已經寫回,或者是否會覆蓋了之前的值)。數據冒險的解決方法(讀寫冒險(RAW):將指令和操作數保存起來,然后只能在讀操作數階段進行讀取;寫寫冒險(WAW):檢測是否有其它指令會寫回到相同的寄存器(檢測到冒險),有則等待,直到其它的完成)
發射階段:假如檢測到沒有結構冒險和數據冒險,那么記分板將會將指令發射到相關的運算器,假如結構冒險或者寫寫冒險發生了,那么該指令將會等待,直到冒險消失為止。
讀取操作數:沒有數據相關了以后(之前的指令不會寫回源寄存器或者正在寫寄存器的情況時,讀寫冒險),讀取操作數。讀取操作數后將交給運算器,之后開始運算。發送到運算器的順序可能是亂序的。
之后就是執行段以及寫回段了。沒啥好說的。執行段在完成計算以后會通知記分板。記分板直到計算已經完成了,那么它進行讀寫冒險檢驗(即寫之前是否已經讀取了寄存器的值,例如 ADD F10,F0,F8 SUB F8,F8,F14,這里SUB指令寫回時要檢查ADD指令的F8是否已經讀取了,僅此而已)假如檢測到冒險,則等待,不然就可以寫寄存器了。
記分板由三個部分組成
part1 指令狀態:記錄指令究竟處於4個階段中的哪一個階段
part2 運算器單元FU狀態:有9個域,分別是:
a) Busy 標識該器件是否正被使用
b) OP 該器件正在執行的運算 例如 + - * / 等等
c) FI 目標寄存器
d) Fj, Fk, 源操作寄存器
e) Qj Qk functional units producing source registers FJ FK (源操作寄存器正在被什么單元所處理)
f) Rj, Rk 表示Fj Fk 是否准備好的標志位
part3 寄存器結果狀態:標識哪一個存儲器將會被寫回。
以下是記分板流水線的控制流程
Tomasulo算法
由於記分牌算法只能檢測競爭(WAR,WAW)並不能消除這兩種競爭,所以將記分牌算法改進為Tomasulo算法。
Tomasulo算法的基本思想:
Tomasulo算法采用寄存器重命名(Renaming)方法,將記分牌中的寄存器用一大組虛擬寄存器名來代替,即用虛擬寄存器集來代替真是的FP寄存器組,由於虛擬寄存器集合所含有的寄存器數目遠大於真是的寄存器組,所以可以用虛擬寄存器集來實現寄存器重命名。
虛擬寄存器組由三部分組成:
1.每個功能單元(FU)都帶有的保留站(Reservation station)
2.取數緩沖區(Load buffers)----保存被訪問的存儲單元的數據和地址
3.存數緩沖區(Store buffers)
另外,如圖所示:
浮點寄存器(FP)通過一對總線與每一個功能單元(FU)相連接,這一對總線分別對應兩個操作數,並通過一條總線與存數緩沖區(Load buffer)相連接。
功能單元(FU)的輸出和存數緩沖區(Load Buffer)的輸出匯總在CDB與浮點寄存器(FP)的輸入相連接。
公共數據總線(Common data bus)CDB:CDB與FP,Reservation station,store buffer等輸入相連接,唯一無連接關系的是Load Buffer的輸入。
由於保留站和Buffer都有對應的標識符,所以這里實現了重命名。
Tomasulo每一級流水功能
1.發射級(Issue)
若是一條FP操作指令,如果保留站有空,則將其送至保留站,如果該指令的操作數已在FP寄存器,將操作數的值送往保留站。
若是一條Load或者Store指令,如果Buffer有空,將其送往相應的Buffer
如果保留站或者Buffer沒有空,則存在結構競爭,停頓該指令,知道對應的保留站或者Buffer有空為止。
這一級完成了重命名,因為在保留站中的操作數不在使用寄存器號。
2.執行級(Execute)
若有一個或幾個操作數未就緒,等待該操作數,並同時監控CDB。一旦操作數就緒,立即存入相應的保留站,若兩個操作數均已就緒,則執行該操作,此級檢查了是否存在RAW競爭。
3.寫回級(Write Back)
當結果計算出來之后,將其寫入CDB,並從CDB寫入目的寄存器以及等待此結果的保留站,當連續寫同一寄存器時,只有最后一次才能寫入,消除了WAW競爭。
流水級的形式化描述:
Tomasulo法和記分牌法的異同
相同之處:
兩者消除RAW競爭的思想相同。Tomasulo方法采用了記分牌方法的動態調度的核心思想,多條指令處於發射狀態,等待條件成熟,可以不按順序執行,不按順序完成的思想,即為動態調度來消除RAW競爭。
不同之處:
Tomasulo方法通過寄存器換名過程可以消除WAR和WAW競爭。
記分牌方法能檢測WAR和WAW競爭,一旦檢測到存在WAR和WAW競爭,通過插入停頓周期來解決這一競爭。所以,記分牌方法不能消除WAR和WAW競爭。
硬件組織上有兩點不同:
1.檢測競爭和控制指令執行方式的不同:
Tomasulo方法檢測競爭和控制指令執行兩方面功能是通過分布在每一功能單元的保留站來進行的,因此Tomasulo方法是一種分布式方法。
記分牌方法的上述功能是通過統一的記分牌來實現的,因此記分牌方法是一種集中式方法。
2.寫結果的方法不同:
Tomasulo方法通過CDB直接將功能單元輸出的結果送往需要該結果的所有保留站,而不必經過寄存器這一中間環節。
記分牌方法是將結果寫入FP寄存器, 因而可能造成等待這一結果的指令都出現停頓現象,之后,所有相關指令的功能單元在讀FP 寄存器時又可能出現競爭現象。
Tomasulo方法的流水級功能與記分牌比較:
Tomasulo方法中無檢查WAW和WAR競爭功能,因為在指令發射過程中,由issue logic結合保留站完成了register operands的改名過程,即消除了這兩種競爭。
CDB起到廣播結果的作用,不必通過register file直接結果送到所有需要該結果的保留站和buffers.
Load和Store buffers相當於基本功能單元
轉載:原文地址:http://blog.csdn.net/craftina/article/details/6910426