計算機系統結構總結_Scoreboard and Tomasulo


 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]

...

 

 

 

 

...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM