危障 (電腦系統結構)

危障(hazard)又稱作冒險險象,是指在電腦CPU的微體系結構中,指令管線化亂序執行中的一些問題可能會導致得到不正確的計算結果。有3類典型的危障:

  • 數據危障
  • 結構危障
  • 控制危障(分支危障)

有幾種方法用於應對這些風險,如管線化停頓(管線化氣泡),暫存器直通等待。

背景

編輯

指令在一個管線化處理器中的執行被分為若干階段,因此在一個時刻有多條指令處於管線化的不同階段上被處理。如取運算元、執行等等。Intel的Pentium就是處理器管線化。有的處理器進一步是指令亂序執行,如Intel的Pentium Pro開創的Intel P6微體系結構。指令的亂序執行就會引入一些危險的情況。

類型

編輯

數據危障

編輯

指令亂序執行時,可能會發生讀取數據與寫入數據之間的時序與空間的相關性,成為數據危障。如果不加以處理,可能會導致競態條件。 有3種可能的數據危障:

  1. 先寫後讀(RAW),這是真實的相關。
  2. 先讀後寫(WAR),被稱為反相關。
  3. 寫後寫(WAW),被稱為輸出相關。

以下為先寫後讀(RAW)的範例:

i1. R2 <- R1 + R3
i2. R4 <- R2 + R3

第一個指令是計算一個值,並將其儲存在R2,而第二個指令是使用這個值計算結果並儲存在R4,但是在我們拿出第二步的運算元時,第一步的結果還未被儲存。因此我們具有一種數據相關性。 我們可以說那有 一種數據依賴性對於指令i2,他依賴於指令i1的完成。

結構危障

編輯

結構危障是指多條指令同時要訪問處理器一處硬件。典型例子是一個儲存單元被一條指令取運算元同時另一條指令要寫入結果。[1]

控制危障

編輯

又稱分支危障,指令流水時,處理器遇到分支指令,不能在流水開始階段就判斷出分支結果。

去除危障

編輯

一般辦法

編輯

管線化汽泡

編輯

管線化汽泡,也稱作管線化停頓,可以同時解決上述3種危障。指令譯碼時如果控制器發現可能存在危障,就插入NOP(No Operation)指令。這樣在有風險的指令進入管線化時,上一條指令已經在管線化中經過了充分多的周期,從而化解了危障。如果插入的NOP的數量等於管線化的級數,那麼處理器就排空了整個管線化。這被稱為沖刷管線化(flushing the pipeline)。

數據危障

編輯

有幾種方案與演算法解決數據危障。

  • 在先寫後讀時,在寫指令與讀指令之間插入管線化汽泡。
  • 使用亂序執行,通過暫存器重新命名保證了先寫後讀的數據相關被順序執行,而對另外兩種反相關、輸出相關的情況的實現了「去相關」後的並行執行。
  • 利用暫存器直通(register forwarding,或稱轉發機制)來使用管線化的最新的計算結果。

控制風險

編輯

避免控制風險的辦法:

  • 在分支指令後插入管線化汽泡,直到分支指令的流水執行完畢。
  • 使用分支預測,然後投機執行。如果分支預測失敗,則要有能力恢復到分支指令執行完畢時刻的暫存器狀態,進入正確的分支繼續執行。

參見

編輯

參考文獻

編輯
  1. ^ Patterson, David A.; Hennessey, John L., Computer Organization and Design 4, Morgan Kaufmann: 336 
  • David Andrew Patterson, John L. Hennessy Computer Organization and Design (4 ed.), Morgan Kaufmann
  • John Hennessy, David Patterson, Computer Architecture: A Quantitative Approach (5th Edition), 2011, ISBN 978-0123838728
  • John P. Shen and Mikko H. Lipasti, Modern Processor Design: Fundamentals of Superscalar Processors, 2004, ISBN 0070570647