什麼是分支問題?


流水線是一種非常有效的加速指令沿順序路徑執行的方法。但是,如果分支引入流水線並擾亂順序處理,則除非使用適當的方法,否則流水線的實現將受到嚴重破壞。

它可以指示在流水線中生成分支的問題。讓我們假設在流水線中實現一個無條件分支。當沒有采取任何特定措施來提高適應性時,在傳統的 RISC 流水線中實現無條件分支。

流水線被認為在四個連續的週期中處理指令,例如,在連續的取指 (F)、解碼 (D)、執行 (E) 和寫回 (WB) 週期中。因此,分支的目標地址 (TA) 將在 E 週期內計算。

讓我們檢查一下包含無條件分支的簡單指令序列的實現。因此,為簡單起見,讓我們考慮每個指定的指令都可以在四個連續的週期內處理。

當給定的指令序列已執行時,使用簡單的流水線會出現以下情況。流水線作為裝配線,保持處理後續指令,直到在 ti+2 中解碼時遇到分支 (B)。

在下一個週期 (ti+3) 中,將計算目標地址並停止順序處理。因為目標地址在 E 週期的結束時變得熟悉,所以流水線只能在 it+4 週期開始獲取第一個目標指令 (it1)。

在簡單流水線中處理條件分支可能會產生更高的懲罰。這將是計算確定條件的附加函式的結果,這需要更多週期。因此,下一個地址(遞增的順序地址或分支目標地址)只能在之後指定。對於**未解決的條件分支**,情況甚至更糟。

如果無法及時計算確定條件,因為指示的結果尚未產生,則該術語稱為未解決的條件分支。例如,預先確定條件分支以檢查先前浮點除法的結果。在這種方法中,需要大量的週期,通常為 10-50,才能獲得結果。因此,後續的條件分支在多個週期內仍然不確定。

這表示在流水線中,每個分支指令都會導致多個浪費的週期(稱為氣泡),除非引入了合適的分支方法。分支在通用程式碼中非常頻繁,平均而言,可以預期大約每四到六條指令就有一條分支。因此,無效的分支處理會嚴重影響效能。

更新於: 2021年7月23日

3K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.