1. 程式人生 > >分支預測

分支預測

ati 機制 進入 方式 指針 中大 找不到 ash ret

分支預測( Branch predictor):當處理一個分支指令時,有可能會產生跳轉,從而打斷流水線指令的處理,因為處理器無法確定該指令的下一條指令,直到分支指令執行完畢。流水線越長,處理器等待時間便越長,分支預測技術就是為了解決這一問題而出現的。因此,分支預測是處理器在程序分支指令執行前預測其結果的一種機制。在ARM中,使用全局分支預測器,該預測器由轉移目標緩沖器( Branch Target Buffer,BTB)、全局歷史緩沖器( Global History Buffer,GHB) MicroBe,以及 Return Stack組成。

采用分支預測,處理器猜測進入哪個分支,並且基於預測結果來取指、譯碼。如果猜測正確,就能節省時間,如果猜測錯誤,大不了從頭再來,刷新流水線,在新的地址處取指、譯碼。

分支預測算法:

  1. 無條件跳轉指令必然會跳轉,而條件跳轉指令有時候跳轉,有時候不跳轉,一種簡單的預測方式就是根據該指令上一次是否跳轉來預測當前時刻是否跳轉。如果該跳轉指令上次發生跳轉,就預測這一次也會跳轉,如果上一次沒有跳轉,就預測這一次也不會跳轉。這種預測方式稱為:1位預測(1- bit prediction)
    技術分享圖片

  2. 2位預測(2- bit predictor)。每個跳轉指令的預測狀態信息從1bit增加到2bit計數器,如果這個跳轉執行了,就加1,加到3就不加了,如果這個跳轉不執行,就減1,減到0就不減了,當計數器值為0和1時,就預測這個分支不執行,當計數器值為2和3時,就預測這個分支執行。2位的計數器比1位的計數器擁有更好的穩定性。

    技術分享圖片

通常商用的處理器會使用多種策略的組合,來獲得更好的預測結果;

分支預測實現

算法是基礎,有了算法後,就可以在處理器中實現分支預測功能。 Intel的分支預測模塊包含了3個單元:

  1. Branch Target Buffer(BTB)
  2. The Static Predictor
  3. Return stack

技術分享圖片
基本的BTB結構如下:
分支指令在執行後,會將這條指令的地址及它的跳轉信息記錄在BTB中。 BtB buffer不會太大,不能將所有的分支指令都存進去,通常采用Hash表的方式存入。在取指時,先將PC(程序指針)和BTB中的分支指令的地址進行比較,如果找到了,說明這條指令是分支指令,並且在BTB中有記錄,就使用BTB預測出來的跳轉地址。如果沒有記錄,就不能使用BTB的信息了,取指下一條指令。

Intel的 Branch Target Buffer還包含了歷史跳轉信息,用於預測分支指令是否發生跳轉。

The Static Predictor

當分支指令在BTB中記錄了歷史信息才能使用BTB進行預測,當分支在BTB中找不到記錄時,可以使用 The Static Predictor(靜態預測器)。人們將分支指令的執行情況做了大量的統計,從中總結出一些特征,並將這些特征總結為一些固定的策略,這就是靜態預測器.
當指令被解碼後,它是不是分支指令,以及要跳轉的地方就知道了,只是不知道是否該跳。一般來說,向上的跳轉,常用來組織成循環,這個跳轉應該被預測為執行。
技術分享圖片

Return Stack

函數調用在程序中大量出現,函數調用與返回也都是通過跳轉來實現的。例如,有3個函數調用了 printf函數,pinf函數地址固定,調用時知道地方,但是在返回時,並不知道該返回到哪個地方, Retum Stack(返回棧)可以用於解決這個問題。在函數調用時,將函數的返回地址壓棧到 Retum Stack中,當遇到函數返回指令時,就從 Retum Stack中取出地址。
技術分享圖片

部分來自《大話處理器》這本書;

分支預測