Textbook:
《計算機組成與設計——硬件/軟件接口》 HI
《計算機體系結構——量化研究方法》 QR
超標量
前面講過超標量的概念。超標量的目的就是實現指令級並行(Instruction Level Parallelism),來解決stall太多的問題。
超標量(Super Scalar) 將一條指令分成若干個周期處理以達到多條指令重疊處理,從而提高cpu部件利用率的技術叫做標量流水技術。 超級標量是指cpu內一般能有多條流水線,借助硬件資源重復(例如有兩套譯碼器和ALU等)來實現空間的並行操作。在單流水線結構中,指令雖然能夠重疊執行,但仍然是順序的,每個周期只能發射(issue)或退休(retire)一條指令。
超級標量結構的cpu支持指令級並行,一個周期可以發射多條指令(2-4條居多,也叫做多發射[multiple issue])。這樣可以使得cpu的IPC(Instruction Per Clock)>1 (也就是CPI<1咯),從而提高cpu處理速度。超級標量機能同時對若干條指令進行譯碼,將可以並行執行的指令送往不同的執行部件(也就是說執行過程可以是亂序的)。我們熟知的pentium系列(可能是p-II開始),還有SUNSPARC系列的較高級型號,以及MIPS若干型號等都采用了超級標量技術。
實現多發射處理器也有兩種方式,其區別是將主要工作分給編譯器來做還是硬件來做。由千不同的實現方式將導致某些決策是靜態進行的(在編譯時)還是動態進行的(在執行時),所以這兩種方式有時也被稱為靜態多發射( s tatic mul ti pl e issue) 和動態多發射(dynamic multiple issue) 。
理想情況下我們希望能有這么一個pipeline:
其中IF ID肯定只能是順序執行(in order)的。MEM WB這部分也要順序執行,畢竟指令的完成順序不能亂嘛。
但是中間功能單元執行的環節其實可以亂序執行(out of order execution)。假設依次有指令A、B、C。A和B存在依賴,而C和前面的都沒有依賴。因為A和B的依賴關系會導致流水線停頓,進而導致C也不能執行。如果指令可以亂序執行,就可以先執行C(指令在所需數據可用時立即開始執行),提高效率。
scoreboard system
scoreboard是一種古老的方法了...但其實現在在GPU的thread scheduling中仍然在用
......
Tomasulo Algorithm
這是目前的CPU中在廣泛使用的方法。 QR P143
Tomasulo的核心思想是通過寄存器重命名來消除冒險,寄存器重命名功能由保留站(Reservation Station)提供。每個功能單元會有一個保留站。
- 每個保留站保存一條已經被發射,正在等待功能單元(EX)執行的指令。如果該指令的操作數值已經被算出了,也放到保留站里,否則保留站先記錄這些操作數值對應的保留站名稱。
- 保留站在一個操作數可用時馬上緩沖一份,這樣就可以為等待發射的指令緩沖操作數。
- 待執行的指令也會指定某個保留站作為自己的輸入,並在發射指令是將寄存器更名為對應的保留站的名字,而不再依賴寄存器了。
- 在對寄存器進行連續寫入時,只會用最后一個操作(也就是最終的值)來更新寄存器。
- 保留站的數量多於寄存器
一個使用了Tomasulo算法的浮點計算單元的結構如下:
- 保留站相當於“虛擬寄存器”,來make copies of data。用於解決亂序執行時,不同指令公用同一個寄存器帶來的冒險。解決Write After Write和Write After Read的依賴。
- Common Data Bus能夠將數據同時Forward到多個位置,同時需要數據的保留站也能及時從Common Data Bus上得到自己需要的數據。解決Read After Write的依賴。
每個保留站會記錄以下字段:
- Op:要執行的運算
- Qj, Qk:對於還沒生成的源操作數,這里記錄將生成源操作數的保留站號。
- Vj, Vk:對於已經available的源操作數,這里記錄源操作數的值。
- A:記錄load/store指令所需的地址
- Busy:表示該保留站在用
另外在每個寄存器中,也要加一個字段來記錄 哪個保留站中的指令要修改當前寄存器。
之前提到過有三種數據冒險,我們來分別看看它們是如何被消除的:
1. Read after Write PPT P5-7
假設有這樣的指令:
1: R2:=R0*R4 2: R3:=R0+R2 3: R0:=R1*R2
...
2. Write after Read(比如 r4=r1+r0 和 r0=r3+4) PPT P7-10
假設有這樣的指令:
1: R3:=R0*R4 2: R4:=R3+R1 3: R1:=R0+R2
...
3. Write after Write(2個指令write the same register) PPT P11-15
假設有這樣的指令:
1: R3:=R0*R4 2: R1:=R3+R1 3: R3:=R0+R2 4: R0:=R3*R2
...
Memory System Dependency
[PPT P15]
Tomasulo解決了寄存器中的依賴問題,但有些奇怪的指令(比如Load/Store)還可能造成內存的依賴,比如對同一個內存地址的RAW / WAR / WAW。這種用Tomasulo就搞不定了。因為有些情況下雖然內存地址不同,但實際上落到了同一個block(前面講過),還是不能同時access。這種用Tomasulo就搞不定了。我們可以定義兩個人工規則:
- Load:Proceed only when no prior instruction store to the same address
- Store:Proceed only when no prior instruction load/store to the same location
但是在load/store中也會設計地址的計算(也就是前面的ALU指令了)。因此我們把這個規則套用到tomasulo里面:
如圖,Addr Unit負責計算地址,送入Store buffer和Load buffer。
以一個RAW的例子為例:
i1: R1 := load 0(R0) //write R1 i2: 0(R1) := store R2 //Read R1 when calculating address 0[R1]
...
...