流水線冒險

2021-09-24 02:51:24 字數 1191 閱讀 9947

流水線冒險

回顧一下常用五階段流水線:f(取指)d(解碼)e(執行)m(訪存)w(寫回)

注意:對暫存器檔案的寫只有在時鐘上公升的時候才會更新!

資料冒險的原因:對暫存器檔案的讀寫是在不同階段進行的

1.用暫停來避免資料冒險

暫停時,處理器會停止流水線中一條或多條指令,直到冒險條件不再滿足。

在本該正常處理的某指令階段中,我們每次要把一條指令阻塞在解碼階段,就在執行階段插入乙個氣泡。

實現簡單,但效能不好,嚴重降低了整體的吞吐量

2.用**來避免資料冒險

①解碼階段邏輯發現暫存器是運算元的源暫存器,但是在寫埠上還有乙個對該暫存器未進行的寫,將結果值直接從乙個流水線階段傳到較早階段的技術稱為資料**(旁路)。這種情況的訊號是w_vale。

②訪存階段中有對暫存器未進行的寫,也可以用資料**。這種情況的訊號是m_vale。

③執行階段alu正在計算的值稍後會寫入暫存器時,也可以將alu的輸出訊號作為運算元valb,這種情況的訊號是e_valm。

④可**剛從記憶體中讀出的值,這種情況的訊號是m_valm。

⑤可**寫回階段對埠m未進行的寫,這種情況的訊號是w_valm。

3.載入/使用資料冒險

有一類資料冒險不能單純用**來解決,因為記憶體讀在流水線發生的比較晚,這時我們可以通過將暫停和**結合起來,避免載入/使用資料冒險。

這種用暫停來處理載入/使用冒險的方法稱為載入互鎖,載入互鎖和**技術結合起來,足以處理所有可能型別的資料冒險

4.避免控制冒險

當處理器無法根據處於取值階段的當前指令來確定下一條指令的位址時,就會出現控制冒險(在流水線化處理器中,控制冒險只會發生在ret指令和跳轉指令)跳轉指令只有在條件跳轉方向**錯誤時才會造成麻煩。

ret指令經過解碼,執行和訪存階段時,流水線不能做任何有用的活動,我們只能在流水線中插入三個氣泡,一旦ret指令到達寫回階段,pc選擇邏輯就會將程式計數器設為返回位址。

跳轉指令的執行階段才會知道是否應該跳轉,但在這之前流水線**會選擇分支並取指、解碼、執行,當跳轉指令通過執行階段後,流水線會向解碼階段和執行階段插入氣泡,取消兩條目標指令,同時取出跳轉指令後面的那條指令,

缺點:兩個時鐘週期的指令處理能力是被浪費的。

通過慎重考慮流水線的控制邏輯,控制冒險是可以被處理的,暫停和往流水線中插入氣泡的技術可以動態調整流水線的流程。

流水線排程

n個作業要在由2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為a i 和b i 你可以安排每個作業的執行順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。求這個最少的時間...

渲染流水線

應用階段 cpu準備資料,skinmeshrender,meshfilter,meshrender 頂點資料,三角形資料,法線資料,切線資料,渲染設定指令,紋理資料,uv資料 由cpu傳送給gpu,即一次drawcall 幾何階段 頂點變換,計算頂點顏色 如逐頂點光照 齊次裁剪空間,透視除法,歸一化...

流水線設計

流水線使用儲存器件將時鐘週期內關鍵路徑 最大組合延遲的路徑 分割開來,減少了關鍵路徑上各階段延遲並使迪娜路能以更高頻率工作。優點 提高了時鐘頻率,增加了各階段時鐘的計算能力 缺點 所有共享一條流水線的指令的階段和階段次序必須相同,例如 add 指令在儲存器階段什麼也不做 所有中間值必須在各週期鎖存 ...