一場流水線帶來的災難
流水線的設計對計算機體系結構來說是乙個重要意義的設計。前人不會無緣無故的把乙個毫無意義的東西引入到計算機世界。
引入流六線對計算機結構的重要性及其優點本人在次不涉及。
(想知道的話,就去問問我們偉大的google
老師把)
通過哲學觀點我們知道任何事物都是有兩面性的。如果不在合適的時間,合適地點使用,那麼它就給我們這些挨踢人士帶來不小的麻煩。
下面就是**流水線帶來的一些災難。
先大概說一些廢話:
**流水線由:預取,解碼和執行三部分組成。
此篇文章針對是arm7
體系結構
一.指令的預取和自修改**
1.許多arm
實現了在前一條指令的指令尚未完成時,將指令從儲存器中取出。這個action
被稱為指令的預取。
2.此處說明一點:指令的預取並不代表實際執行指令(就好比乙個空頭支票一樣,只是乙個口頭承諾)被預期的指令可能得不到執行。有以下兩種原因:
l發生異常
當發生異常時,
當前指令執行完畢,所有預取的指令都被丟棄,指令的執行從異常向量開始。
l發生跳轉
當發生跳轉時,預取的的在分支指令後的指令將被丟棄。
3.在預期指令之前要進行轉移測試,例如在執行一條分支指令,此時要判斷是預期分支指令之後的指令還是轉移目標位址的指令。
二.預取指令引起的困惑
1.如果在儲存器中的指令在被預取之後,被執行之前發生改變。
那麼計算機該怎麼辦呢,是繼續執行以前預期的指令還是執行新的指令?
(whether first or second?
this is a serious question!)
看乙個程式:
;file name :triple instructions pipelining
;author :冀博
;function :emulate the triple instructions pipelining
;time :2010
年1月15號
area test,code,readonly
code32
entry
start ldr r0,addinstr (1)
str r0,nextinstr (2)
nextinstr sub r0,r0,#0x1 (3)
sub r1,r1,#0x1 (4)
sub r2,r1,r0 (5)
addinstr add r1,r1,#0x1 (6)
b start (7)
end分析指令的執行過程:
1>
從位址(1
)預取指
2>
從位址(2
)預取值,ldr
指令進入解碼階段
3>
從位址(3
)預取值,str
指令進入解碼階段,同時ldr
指令進入執行階段,執行完後將位址(6
)的指令裝入r0.
4>
從位址(4
)處預取指,str
指令進入執行階段,執行完後將add
指令存入位址(3
);sub
指令被覆蓋。
5>
雖然sub
指令子啊儲存器中被覆蓋,但是它仍處於流水線上,並進入執行階段。
tiger-john
總結:1>
如果儲存器中的指令在它被預取指之後,被執行令之前發生改變,此時,對儲存器中的指令進行修改一般不能阻止已取指令的執行。
2>
但是,如果儲存器中的指令在它被預取指之後,被執行令之前,發生中斷,那麼該指令就將被丟棄而步會被執行
例如:當指令第一次執行時,在str
指令之後有可能產生乙個中斷,那麼,已經預期的sub
指令將被丟棄。當中斷處理程式返回時,位於nextinstr
處的指令被再次預取,而這次則執行add
指令。3>
如果arm
處理器或儲存器系統允許保持預取指令的備份並使用這些備份而不是重新預取。那麼以後執行這段**仍將執行sub
指令。
每日一摘 流水線
一 什麼是流水線?流水線設計就是將組合邏輯系統地分割,並在各個部分 分級 之間插入暫存器,並暫存中間資料的方法。目的是將乙個大操作分解成若干的小操作,每一步小操作的時間較小,所以能提高頻率,各小操作能並行執行,所以能提高資料吞吐率 提高處理速度 二 什麼時候用流水線設計?使用流水線一般是時序比較緊張...
瀏覽器渲染流水線解析(一)
layer compositor 圖層合成器 接收 blink 的輸入,負責圖層樹的管理,圖層的滾動,旋轉等矩陣變幻,圖層的分塊,光柵化,紋理上傳等任務 display compositor 接收 layer compositor 的輸入,負責輸出最終的 opengl 繪製指令,將網頁內容通過 gl...
GLSL學習筆記一(流水線概念)
摘要 今天開始學習shader的編寫,什麼是shader?說到shader,首先要說說顯示卡的概念,顯示卡因為比較專一,只需要負責相應的圖形運算,而不必像cpu一樣負責電腦上的一切,所以指令集少,在相同的主頻下,顯示卡的速度是cpu的幾倍,那麼如何讓計算機知道啥時候用顯示卡來計算,啥時候用cpu來計...