1. 程式人生 > >Intel Core & Enhanced Core微架構(5)

Intel Core & Enhanced Core微架構(5)

Branch Prediction Unit

在分支條件決斷結果實際計算出來之前,分支預測機制就可以讓處理器開始“投機式地”執行預測的分支指令。所有的分支指令都依賴於分支預測單元進行分支預測。分支預測單元實現了下列特性:

  • 16個條目的返回棧快取區,可以讓BPU準確的預測RET指令的返回地址
  • BPU查詢(即分支預測)流水線前端排隊機制(todo:說的啥?),BPU每次對32位元組的指令進行分支預測,是取指單元每次讀取的指令的長度的2倍。這個機制使得采納分支可以無效能損失的被預測。

注意:儘管這個機制通常可以消除採納分支導致的效能損失,軟體層面上還是要認為採納分支會比未採納分支消耗更多的資源。

BPU可以對下列的分支型別做預測:

  • 直接呼叫CALL與跳轉JUMP。這些分支目標被當作目標陣列,不做採納或非採納預測。
  • 間接呼叫CALL與跳轉JUMP。分支目標被預測為或者是單一固定目標,或者是多個可變目標(根據近期程式執行行為)。
  • 條件分支。分支目標被預測為採納或者不採納。

後續章節有針對BPU的優化技術。

Instruction Fetch Unit

一次指令讀取是通過ITLB在指令快取和指令預取緩衝區中做16位元組對齊的查詢,如果命中指令快取,則讀取16位元組指令流(也稱為一個指令行,或者讀取行)到指令預譯碼器中。典型的程式平均每條指令略小於4個位元組。由於絕大部分指令都可以被任一譯碼器處理,所以單次讀取的16位元組指令流通常可以在一個時鐘週期內譯碼完畢。

非對齊的分支目標會減少有效指令位元組數,減少的位元組數是指令行中分支目標地址的偏移量,例如,如果分支目標從第14位元組開始,則整個16位元組的指令行中,前13個位元組都是無用指令,會被廢棄。採納分支也會減少傳送給譯碼器的指令位元組數,因為由於分支指令發生跳轉,緊跟在分支指令之後的指令不會被髮送到譯碼器進行譯碼。在一個典型的整型計算程式中,大約平均每10條指令中會發生一次分支跳轉,這就會導致大約每3次或4次指令讀取中即產生一次“非完整”指令行(由非對齊的分支目標或分支指令跳轉導致,這裡“非完整”並不是說讀取的指令行少於16位元組,而是有效的指令位元組數少於16位元組)。這種情況有時候也可能會導致譯碼器空閒,被稱為前端指令飢餓,或者譯碼器指令飢餓,即沒有足夠多的x86指令送給譯碼器進行處理。

由於流水線其他部分的停頓,前端的指令飢餓通常不是導致效能下降的主因。對於極端快速且使用更大(todo:指長度?)指令的程式碼(例如使用SSE2 整型指令的多媒體處理程式),使用對齊的分支目標可以避免前端指令飢餓,或許會有效能收益。