1. 程式人生 > >分支預測器(Branch Predictor) 彙總介紹

分支預測器(Branch Predictor) 彙總介紹

動態分支預測是近來的處理器已經嘗試採用的的技術。最簡單的動態分支預測策略是分支預測緩衝區(Branch Prediction Buff)或分支歷史表(branch history table)。

     BHT——Branch History Table,顧名思義,這是記錄分支歷史資訊的表格,用於判定一條分支指令是否token;這兒記錄的是跳轉資訊,簡單點的,可以用1bit位記錄,例如1表示跳轉,0表示不跳轉,而這個表格的索引是指令PC值;考慮在32位系統中,如果要記錄完整32位的branch history,則需要4Gbit的儲存器,這超出了系統提供的硬體支援能力;所以一般就用指令的後12位作為BHT表格的索引,這樣用4Kbit的一個表格,就可以記錄branch history了。當然,通過大夥的不懈努力和分析,發現在BHT中用1bit位記錄分支是否跳轉還不夠準確,用2bit位記錄就非常好了,而用3bit或者更多位記錄,效果與2bit類似。所以在BHT中,一般就用2bit位記錄分支是否跳轉:例如11和10表示這條分支會跳轉;01和00表示分支不會跳轉。這個2bit計數器大夥叫做飽和計數器。


    BTB——用於記錄一條分支指令的跳轉地址,由於這兒儲存的是指令地址,例如32位地址,因此,這個表格就不能做到儲存BHT那樣多的內容了,如果也支援4K條指令,則需要128Kbit的儲存空間,這幾乎可以趕上一個L1Cache的容量了,所以BTB一般很小,就32項或者64項。由於這個BTB容量小,並且其用於是記錄分支指令的跳轉地址,因此,如果這條指令不跳轉,即其下一條指令就是PC+4,則不會在BTB中記錄的。


      基於BTB和BHT的分支預測就很簡單了:
      1)在取指階段利用PC定址BTB,如果命中,則說明這是一條跳轉指令,利用從BTB中獲取到的地址去取icache;
      2)由於BTB中儲存的內容不夠多,因此BHT的準確率更高,這個時候索引BHT表格,如果發現BHT也跳轉,則說明這條指令預測是跳轉的;如果BHT不跳轉,則說明不跳轉,這個時候就取消BTB中的指令地址,重新PC+4去取icache;