冒險 (計算機系統結構)
冒險(hazard)又稱作冒險或險象,是指在計算機CPU的微體系結構中,指令管線化亂序執行中的一些問題可能會導致得到不正確的計算結果。有3類典型的冒險:
- 數據冒險
- 結構冒險
- 控制冒險(分支冒險)
背景
指令在一個流水線處理器中的執行被分為若干階段,因此在一個時刻有多條指令處於流水線的不同階段上被處理。如取操作數、執行等等。Intel的Pentium就是處理器流水線。有的處理器進一步是指令亂序執行,如Intel的Pentium Pro開創的Intel P6微體系結構。指令的亂序執行就會引入一些危險的情況。
類型
數據冒險
指令亂序執行時,可能會發生讀取數據與寫入數據之間的時序與空間的相關性,成為數據冒險。如果不加以處理,可能會導致競態條件。 有3種可能的數據冒險:
- 先寫後讀(RAW),這是真實的相關。
- 先讀後寫(WAR),被稱為反相關。
- 寫後寫(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,或稱轉發機制)來使用流水線的最新的計算結果。
控制風險
避免控制風險的辦法:
參見
參考文獻
- ^ 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