1. 程式人生 > 其它 >【體系結構系列】指令排程

【體系結構系列】指令排程

技術標籤:計算機基礎系列

指令排程

動態分支預測

重要性

  • 在n-流出的處理機中,遇到分支指令的可能性增加了n倍。
  • 要給處理器連續提供指令,就需要準確地預測分支。

動態分支預測

  • 動態分支預測
    • 在程式執行時,根據分支指令過去的表現來預測其將來的行為。
    • 如果分支行為發生了變化,預測結果也跟著改變。
    • 有更好的預測準確度和適應性。
  • 分支預測的有效性取決於
    • 預測的準確性
    • 預測正確和不正確兩種情況下的分支開銷
    • 決定分支開銷的因素:
      • 流水線的結構
      • 預測的方法
      • 預測錯誤時的恢復策略等

目標與關鍵問題

  • 採用動態分支預測技術的目標
    • 預測分支是否成功
    • 儘快找到分支目標地址(或指令)(避免控制相關造成流水線停頓)
  • 需要解決的關鍵問題
    • 如何記錄分支的歷史資訊,要記錄哪些資訊?
    • 如何根據這些資訊來預測分支的去向,甚至提前取出分支目標處的指令?

預測錯誤時的處理方法

  • 在預測錯誤時,要作廢已經預取和分析的指令,恢復現場,並從另一條分支路徑重新取指令。

分支歷史表 BHT

  • 概念

    • Branch History Table,BHT
    • 最簡單的動態分支預測方法。
    • 用BHT來記錄分支指令最近一次或幾次的執行情況(成功還是失敗 ),並據此進行預測。
  • 只有1個預測位的分支預測表

    • 記錄分支指令最近一次的歷史,BHT中只需要1位二進位制位(最簡單)
  • 2個預測位的分支預測

    • 提高預測的準確度
    • 研究結果表明:兩位分支預測的效能與n位(n>2)分支預測的效能差不多。
  • 預測步驟

    • 分支預測:當分支指令到達譯碼段(ID)時,根據從BHT讀出的資訊進行分支預測 。
      • 若預測正確,就繼續處理後續的指令,流水線沒有斷流。
      • 否則,就要作廢已經預取和分析的指令,恢復現場,並從另一條分支路徑重新取指令。
    • 狀態修改。
  • BHT的作用範圍

    • 判定分支是否成功所需的時間大於確定分支目標地址所需的時間。
  • BHT的作用效果

    • 對於SPEC89測試程式來說,具有大小為4KB 的BHT的預測準確率為82%~99%。
    • 一般來說,採用4KB的BHT就可以了。
  • BHT的實現

    • BHT可以跟分支指令一起存放在指令Cache中。
    • 也可以用一塊專門的硬體來實現。

分支目標緩衝器BTB

  • 概念

    • 目標:將分支的開銷降為 0
    • 方法:分支目標緩衝將分支成功的分支指令的地址和它的分支目標地址都放到一個緩衝區中儲存起來,緩衝區以分支指令的地址作為標識。
    • 這個緩衝區就是分支目標緩衝器(Branch-Target Buffer,簡記為BTB,或者分支目標Cache (ranch-Target Cache)。
  • BTB的結構

    • 看成是用專門的硬體實現的一張表格。
    • 表格中的每一項至少有兩個欄位:執行過的成功分支指令的地址(作為該表的匹配標識 )、預測的分支目標地址
  • BTB的操作

  • 各種情況下的延遲

  • 改進BTB——提升預測準確率

    • 在分支目標緩衝器中增設一個至少是兩位的“分支歷史表”欄位

  • 更進一步,在表中對於每條分支指令都存放若干條分支目標處的指令,就形成了分支目標指令緩衝器。

靜態指令排程

指令排程

  • 找出不相關的指令序列,讓它們在流水線上重疊並行執行。

  • 制約編譯器指令排程的因素

    • 程式固有的指令級並行
    • 流水線功能部件的延遲
  • 部件延遲示例

指令排程例項

  • 對於下面的原始碼,轉換成 MIPS 組合語言,在不進行指令排程和進行指令排程兩種情況下,分析其程式碼一次迴圈所需的執行時間。

    for (i=1000; i>0; i --) 
    	x[i] = x[i] + s;
    
  • 先把該程式翻譯成MIPS 組合語言程式碼

    Loop:L.D  F0, 0(R1)
        ADD.D F4, F0, F2
        S.D F4, 0(R1)
        DADDIU R1, R1, #-8
        BNE R1, R2, Loop
    
  • 延遲分析

  • 僅使用指令排程優化

進一步的優化:迴圈展開

  • 把迴圈體的程式碼複製多次並按順序排放, 然後相應調整迴圈的結束條件。

  • 開發迴圈級並行的有效方法

  • 示例:將例1 中的迴圈展開3 次得到4 個迴圈體,然後對展開後的指令序列在不排程和排程兩種情況下,分析程式碼的效能。假定R1 的初值為32 的倍數,即迴圈次數為4 的倍數。消除冗餘的指令,並且不要重複使用暫存器。

    • 未展開:50%是空轉週期

    • 展開且再次排程後:沒有空轉週期

迴圈展開和指令排程的注意事項

  • 保證正確性
  • 注意有效性
  • 使用不同的暫存器
  • 刪除多餘的測試指令和分支指令,並對迴圈結束程式碼和新的迴圈體程式碼進行相應的修正。
  • 注意對儲存器資料的相關性分析
  • 注意新的相關性