一步步编写操作系统 31 cpu的分支预测 下
讓我們說說預測的算法吧。
對于無條件跳轉,沒啥可猶豫的,直接跳過去就是了。所謂的預測是針對有條件跳轉來說的,因為不知道條件成不成立。最簡單的統計是根據上一次跳轉的結果來預測本次,如果上一次跳轉啦,這一次也預測為跳轉,否則不跳。
最簡單的方法是2位預測法。用2位bit的計數器來記錄跳轉狀態,每跳轉一次就加1,直到加到最大值3就不再加啦,如果未跳轉就減1,直到減到最小值0就不再減了。當遇到跳轉指令時,如果計數器的值大于1則跳轉,如果小于等于1則不跳。這只是最簡單的分支預測算法,cpu中的預測法遠比這個復雜,不過它們都是從2位預測法發展起來的。
算法有了,咱們看看cpu是如何實現預測的。
intel的分支預測部件中用了BTB,Branch Target Buffer,分支目標緩沖器。其結構見圖
?
BTB中記錄著分支指令地址,cpu遇到分支指令時,先用分支指令的地址在BTB中查找,若找到相同地址的指令,根據跳轉統計信息判斷是否把相應的預測分支地址上的指令送上流水線。在真正執行時,根據實際分支流向,更新BTB中跳轉統計信息。
如果BTB中沒有相同記錄該怎么辦呢?這時候可以使用Static Predictor,靜態預測器。為什么稱為靜態呢?這是因為存儲在里面預測策略是固定寫死的,它是經由人們經過大量統計之后,根據某些特征總結出來的。比如,轉移目標的地址若小于當前轉移指令的地址,則認為轉移會發生,因為通常循環結構中都用這種轉移策略,為的是組成循環回路。所以靜態預測器的策略是:若向上跳轉則轉移會發生,若向下跳轉則轉移不發生,如圖
?
程序在實際執行轉移分支指令后,再將轉移記錄錄入到BTB。
還記得之前反復強調的重疊嗎?其實是用在這的。如果分支預測錯了,也就是說,當前指令執行結果與預測的結果不同,這也沒關系,只要將流水線清空就好了。因為處于執行階段的是當前指令,即分支跳轉指令。處于“譯碼”、“取指”的是尚未執行的指令,即錯誤分支上的指令。只要錯誤分支上的指令還沒到執行階段就可以挽回,所以,直接清空流水線就是把流水線上錯誤分支上的指令清掉,再把正確分支上的指令加入到流水線,只是清空流水線代價比較大。
好啦各位,關于微架構這塊咱們說到這就夠用了,咱們當初是想解決代碼4-3中第78行的清空流水線的,不能偏離目標太遠啦。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 31 cpu的分支预测 下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中synchronized(同步
- 下一篇: ROS坐标系统,常见的坐标系和其含义