延遲槽
延遲槽(Delay slot),是計算機體系結構中一個指令槽,在前一條指令沒有執行完畢的情況下,處理器內部指令流水線上該指令槽的執行不會修改處理器的狀態。這種技術常用於DSP與早期的RISC體系結構。最常見的是下文描述的分支延遲槽。另外還有過存儲延遲槽,即在存儲內存的指令之後跟一個延遲槽,現在已經基本不用了。
分支延遲槽
編輯當一個分支指令之後的延遲槽指令,在指令流水線中被稱作分支延遲槽(Branch delay slot)。常見於DSP體系結構與老式的RISC體系結構。MIPS、PA-RISC、ETRAX CRIS、SuperH、SPARC等RISC體系結構在分支後有一個延遲槽。PowerPC、ARM、DEC Alpha沒有採用分支延遲槽。DSP具有單個分支延遲槽的有VS DSP、µPD77230、TMS320C3x。SHARC DSP與MIPS-X使用兩個分支延遲槽。
採用指令流水線的處理器的目標是每個時鐘周期完成一條指令。為此,在任何時刻流水線都應該充滿了處於不同執行階段的指令。分支指令會導致分支冒險,也就是不到分支指令執行完畢被退休(retired),是不能確定哪些後繼指令應該繼續執行。一個簡單辦法是在分支指令後面插入流水線遲延(stall),直到新的分支目標地址被求出,並把新的指令地址裝入程序計數器。流水線延遲的每個周期都是分支延遲槽。更為複雜的設計是在分支指令後面執行那些不依賴於分支結果的指令。這可以由編譯器自動優化。
特定流水線的實現中分支延遲槽的理想數量由流水線階段數、是否存在寄存器轉發、分支條件計算在哪一級流水線、是否使用分支目標緩存(BTB)以及許多其他因素所決定。為了保證軟件兼容性,體系結構的迭代不能改變延遲槽的數量。因此這需要新的硬件實現依然包含額外的硬件來確保遵循體系結構規定的行為。
以下示例展示了SHARC DSP匯編語言中對於分支延遲槽的優化。寄存器R0到R9按編號依次清零,並且沒有任何指令被執行超過一次。
R0 = 0; CALL fn (DB); /* 调用函数"fn" */ R1 = 0; /* 第一个延迟槽 */ R2 = 0; /* 第二个延迟槽 */ /***** 在此处中断 (调用生效,跳转到"fn") *****/ R6 = 0; /* 调用结束,返回到此处而非"R1 = 0"处 */ JUMP end (DB); R7 = 0; /* 第一个延迟槽 */ R8 = 0; /* 第二个延迟槽 */ /***** 在此处中断 (跳转生效,跳转到"end") *****/ /* 下面 4 条指令是函数"fn" */ fn: R3 = 0; RTS (DB); /* 返回到调用处,并略过调用指令后的延迟槽 */ R4 = 0; /* 第一个延迟槽 */ R5 = 0; /* 第二个延迟槽 */ /***** 在此处中断 (RTS指令生效,返回到调用处) *****/ end: R9 = 0;