管線,是現代計算機處理器中必不可少的部分,是指計算機指令處理過程拆分為多個步驟,將多個指令的執行動作重疊,以達到加速程式執行之目的,並通過多個硬體處理單元並行執行來加快指令執行速度。
指令週期
l 一個指令執行完成的期間稱為一個指令週期(instruction cycle)
l 指令週期依執行順序可分成以下六個階段
– 指令提取 (instruction fetch)
– 指令解碼(instruction decode)
– 計算有效位址(effective address calculate)
– 運算元的提取(operand fetch)
– 執行(execution)
– 儲存結果(store)
指令提取 (instruction
fetch)
l 「指令提取」階段主要的工作為將指令內容由記憶體中取回,詳細步驟如下:
– (1)首先,根據指令指標(Instruction Counter;IC ),將存放指令的位址設定給記憶體位址暫存器(Memory Address Register;MAR)
– (2)其次,根據MAR存放的位址資料,由該位址處提取指令
– (3)將指令放置於記憶體緩衝暫存器(Memory Buffer Register;MBR),然後IC依指令的長度自動增加數值
– (4)最後將指令從MBR中移送到指令暫存器(Instruction Register;IR )中等待執行
指令解碼(instruction
decode)
l 「指令解碼」階段主要的工作為對指令進行解碼動作(即翻譯動作) ,詳細步驟如下:
– (1)將存放在IR中指令之運算碼(OP Code)利用解碼器解碼並產生指令碼。控制單元會根據指令碼並藉由控制邏輯電路產生控制信號控制算術邏輯單元的動作。
– (2)存放在IR中指令之位址部份傳送到MAR。但有時IR中指令因為要做Jump的動作而將位址部份傳送到程式
計算有效位址(effective
address calculate)
l 根據MAR中位址執行解碼動作
運算元的提取(operand fetch)
l 利用前一步驟計算出的有效位址,從該位址的記憶體中提取資料並置於MBR中
執行(execution)
l (1)加法/減法
– 「算術/邏輯運算單元」透過控制單元之控制對累積器(Accumulator,ACC)與MBR的內容執行加/減法運算
l (2)乘法
– 「算術/邏輯運算單元」透過控制單元之控制對ACC與MBR的內容執行乘法運算。利用對MQ(乘商暫存器)做移位的動作,對「算術/邏輯運算單元」做加法的動作而達到乘法之運算
l (3)除法
– 「算術/邏輯運算單元」透過控制單元之控制對ACC與MBR的內容執行除法運算。對ACC做移位的動作,對「算術/邏輯運算單元」做減法的動作,而商是置於MQ暫存器中
儲存結果(store)
l 若前一步驟執行加法、減法或乘法,最後都是將計算結果送回ACC儲存;若是執行除法則是將運算結果的餘數置於ACC,而商置於MQ中
「管線」執行範例
l 當第6個機器週期結束時,第1條指令會執行完成。第6個機器週期以後,每多1個機器週期便有一條指令會執行完成。因此5條指令利用「管線」技術執行所需的時間為6+4×1=10個機器週期時間。如果未利用「管線」技術執行所需的時間則約為5×6=30個機器週期時間。
「管線」特性 (cont.)
l 若從單獨的一條指令來分析導入「管線」技術前後所需的執行時間之差異的話,整體程式會因導入「管線」技術而降低執行時間,但個別指令執行的總時間則會因導入「管線」技術而增加
l 「管線」技術可增加CPU單位時間內處理的指令數,但並未真正減少一個單獨的指令真正執行所需要的時間
管線化的優點
1.
減少了處理器執行指令所需要的時脈週期,在通常情況下增加了指令的輸入頻率(issue-rate)。
2.
一些積體電路(combinational
circuits),例如加法器(adders)或者乘法器(multipliers),通過添加更多的環路(circuitry)使其工作得更快。如果以管線化替代,能相對地減少環路。
沒有管線化的優點
1.
非管線化的處理器每次(at a time)只執行一個指令。防止分支延時(事實上,每個分支都會產生延時)和序列指令被並列執行產生的問題。設計比較簡單和較低生產成本。
2.
在執行相同的指令時,非管線化處理器的指令傳輸延遲時間(The
instruction latency)比管線化處理器明顯較短。這是因為管線化的處理器必須在資料路徑(data path)中添加額外正反器(flip-flops)。
3.
非管線化處理器有固定指令位寬(a
stable instruction bandwidth)。管線化處理器的效能更難以預測,並且不同的程式之間的變化(vary)可能更大
管線危障(pipeline hazards)
假如一個指令在執行的時候需要等待流水線上早前的一個指令首先執行完畢的話那麼這兩個指令相互之間有依賴關係。這可能導致管線衝突。以下三種衝突情況可能出現:
·
資源衝突:假如流水線上的一個指令需要使用一個已經被另一個指令佔據的資源
·
數據衝突
·
指令層的數據衝突:一個指令需要的數據還沒有計算出來
·
傳輸層的數據衝突:一個指令需要的暫存器內容還沒有被調入暫存器
·
控制流衝突:流水線必須等待一個有條件Goto指令是否會被執行。
這些衝突導致相應的指令必須在流水線的開始等候,這會在流水線上導致空缺。這樣的話流水線就不能理想運行,其加速下降。因此要盡量避免這樣的衝突:
通過增加功能單位可以解決資源衝突。通過把流水線後面的計算結果立刻向前傳可以避免許多數據衝突。
參考資料 : wiki
參考資料 : wiki
沒有留言:
張貼留言