什麼是延遲分支?
當分支由流水線簡單處理時,在每個執行的分支之後,至少有一個週期未被利用。這是由於流水線的類似裝配線的惰性。分支之後的指令槽稱為分支延遲槽。
延遲槽也可能出現在載入指令之後;這些被定義為載入延遲槽。在傳統執行期間,分支延遲槽會被浪費。但是,當使用延遲分支時,這些槽至少可以部分使用。
延遲分支原理
ti | ti+1 | ti+2 | ti+3 | ti+4 | |||
---|---|---|---|---|---|---|---|
B | b | F | D | E | WB | ||
A | add | F | D | E | WB | ||
C | sub | F | D | ||||
BTA | F |
在圖中,它可以將我們程式段中最初位於分支之前的 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%。
中斷處理變得更加困難。這是因為由延遲槽中的指令引起的中斷請求必須與來自“正常”指令的中斷請求以不同的方式處理。當延遲槽指令引發中斷時,前面的指令(即條件分支)已經獲取但尚未處理。這種情況與傳統指令處理中發生的情況截然不同,在傳統指令處理中,導致中斷的指令之前的所有指令都已完成。
需要額外的硬體來實現延遲分支。