什麼是延遲分支?


當分支由流水線簡單處理時,在每個執行的分支之後,至少有一個週期未被利用。這是由於流水線的類似裝配線的惰性。分支之後的指令槽稱為分支延遲槽。

延遲槽也可能出現在載入指令之後;這些被定義為載入延遲槽。在傳統執行期間,分支延遲槽會被浪費。但是,當使用延遲分支時,這些槽至少可以部分使用。

延遲分支原理



titi+1ti+2ti+3ti+4
Bb
FDEWB
Aadd

FDEWB
Csub


FD





BTAF

在圖中,它可以將我們程式段中最初位於分支之前的 add 指令轉移到分支延遲槽中。使用延遲分支,處理器首先執行 add 指令,但分支只會稍後生效。因此,在此示例中,延遲分支保持初始執行順序 -

add r1, r2, r3;
b anywhere;
anywhere: sub

它定義了一個無條件分支。條件分支在簡單的流水線執行期間會導致相同或更高的延遲。這是因為需要額外檢查特定條件的操作。

因此,未執行分支的延遲槽中的指令將始終被執行。分支到目標指令 (sub) 的執行延遲了一個流水線週期。此週期用於執行延遲槽中的指令 (add)。因此,延遲分支導致以下執行順序 -

a, add
b, b
c, sub

延遲分支最早在 1952 年的 MANIAC I 中引入,後來在微程式設計中得到了廣泛使用(Patterson 和 Sequin,1981)。在 20 世紀 80 年代初,這種方案在 RISC-I 中“重新發明”(Patterson 和 Sequin 1981),並隨後用於當時出現的幾種 RISC 架構,例如 MIPS(1982p)、RISC-II(1983)、MIPS-R-line(從 1987 年開始)和 AMD 29000(1987)。

延遲分支的缺點

延遲分支有各種缺點,如下所示 -

  • 延遲分支需要重新定義體系結構。

  • 由於需要插入 NOP,延遲分支會導致程式碼略微膨脹。例如,它必須插入 100∗fb∗(1−ff)=100∗ 0.2∗(1−0.6)=8 個 NOP 到每 100 條指令中,因此程式碼長度將比沒有延遲分支的情況長 8%。

  • 中斷處理變得更加困難。這是因為由延遲槽中的指令引起的中斷請求必須與來自“正常”指令的中斷請求以不同的方式處理。當延遲槽指令引發中斷時,前面的指令(即條件分支)已經獲取但尚未處理。這種情況與傳統指令處理中發生的情況截然不同,在傳統指令處理中,導致中斷的指令之前的所有指令都已完成。

  • 需要額外的硬體來實現延遲分支。

更新於:2021 年 7 月 23 日

7K+ 次檢視

開啟你的 職業生涯

完成課程獲得認證

開始學習
廣告