延遲槽
延遲槽(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;