處理器結構--ReorderBuffer

ReorderBuffer的作用

Reorder Buffer用來保存在亂序執行之前的(OOOE)指令執行順序,當指令集合在亂序執行後按照原有指令順序將結果提交。

ROB會將指令按照原有程序的順序保存,這些指令會在被dispatched後添加到列表的一端,而當他們完成執行後,從列表的另一端移除。通過這種方式,指令會按他們dispatch的順序完成。

實現方案

ROB的一種實現方案是環形緩衝區(類似於操作系統的IO緩衝區)。

在指令分發(dispatch)階段在環形鏈表尾部增加指令集合。在指令完成階段(complete)在頭部增加從鏈表中移除的指令集。

  • 當頭指針(head)趕上尾指針(tail)的時候,ROB處於Empty狀態。
  • 當頭尾指針都到了Buffer的末尾時,他們會再度環繞在最開始的指針處。
  • 當尾指針環繞並且追上頭指針時,Buffer就已經滿了

在ROB中的每個Entry都必須包含足夠的信息,使得在完成階段可以知道該指令是否已經完成:

  • Busy位 Busy位不是真正需要的,因爲在complete階段的頭指針以及dispatch階段的tail指針就是被用來追蹤busy位所標誌的Entries的
  • Issued位 Issued位也可能不需要,因爲在complete階段不關心指令是否已經發射
  • Finished位 Finished位是一個必要的信息,因爲沒有完成執行的指令是不允許進入complete階段。當流水線的execution階段把它的結果寫到轉發總線時,Finished位必須被寫入。這也需要執行單元有一個指向ROB裏面的每條已經完成的指令的指針。

當指令執行造成了異常時,指令地址必須保存下來。當異常被處理完後,PC寄存器將使用保存下來的指令地址重啓。並且分支指令可能需要指令地址去決定PC寄存器去覆蓋預測錯誤的分支。

重命名寄存器編號(Rename register number)對於完全知道重命名寄存器寫入邏輯寄存器(Architected Register)也是有必要的。重命名寄存器編號能夠用來檢查重命名寄存器堆(RRF)中Valid位,判斷指令是否完成。這也使得Finished位沒有必要了。

ROB會提供一個非常便捷的位置用來存儲邏輯寄存器編號(Logical Register Number),Complete階段也需要邏輯寄存器編號去寫入邏輯寄存器中(Architected Register File)

  • Speculative(預測)與Valid位 Speculative與Valid位也可能是不必要的,取決於如何從預測錯誤的分支覆蓋的邏輯實現。推測指令永遠無法到達重新排序緩衝區(ROB)的頭部,因爲之前的指令(包括分支)必須先完成。因此,分支將已經被解決,並且如果需要的話,在允許分支完成的任何(依賴於控制的)指令之前回復到初始狀態。

如果在覆蓋期間從重新排序緩衝器中移除控制依賴的指令,則不需要Valid位,否則,控制依賴指令必須被標記爲無效,這樣當它們到達重新排序緩衝器的頭部時,它們可以被忽略。

流程

重新排序緩衝器的流程必須完成以下操作

  • 分配:在dispatch階段爲程序順序指令在重新排序緩衝區中保留空間
    • 尾指針在重新排序緩衝器中選擇一個位置
    • 將必要的信息加載到ROB中(如指令地址,重命名寄存器,邏輯寄存器等)
    • 尾指針自增
  • 等待:Complete階段必須等待指令執行完畢
    • 在ROB頭部的所有的指令全部執行完畢(finished),或者具有有效的重命名寄存器
    • 第一個未完成的指令完全停止
  • 完成:已結束(finished)指令允許將結果按順序寫入邏輯寄存器中(architected registers)。
    • 將重命名寄存器的值copy到邏輯寄存器中
    • 解除在重命名寄存器與邏輯寄存器之間的關係(將邏輯寄存器的Busy位設置成0)
    • 解除ROB的關係(通過將頭指針遞增)

參考資料

環形緩衝區 Reorder Buffer Reorder Buffer: register renaming and in- order completion The Reorder Buffer 寄存器堆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章