冒險(計算機系統結構)
編輯在中央處理器 (CPU) 設計領域,當下一條指令無法在隨后的時鐘周期內執行時,CPU 微體系結構中的指令流水線出現問題,并可能導致計算結果不正確。 三種常見類型的風險是數據風險、結構風險和控制風險(分支風險)。
有幾種方法用于處理危險,包括管道停頓/管道冒泡、操作數轉發,以及在亂序執行的情況下,記分牌法和 Tomasulo 算法。
背景
編輯流水線處理器中的指令在多個階段執行,因此在任何給定時間,多個指令在流水線的不同階段處理,例如獲取和執行。 有許多不同的指令流水線微架構,指令可能會亂序執行。 當這些同時發生的(可能是無序的)指令中的兩個或多個發生沖突時,就會發生危險。
類型
編輯數據危害
當表現出數據依賴性的指令在流水線的不同階段修改數據時,就會發生數據冒險。 忽略潛在的數據危害會導致競爭條件(也稱為競爭危害)。 在三種情況下可能會發生數據危害:
- 先寫后讀 (RAW),真正的依賴
- 讀后寫 (WAR),一種反依賴
- 寫后寫 (WAW),輸出依賴
讀后讀 (RAR) 不是危險情況。
考慮兩條指令 i1 和 i2,其中 i1 按程序順序出現在 i2 之前。
先寫后讀(RAW)
(i2 嘗試在 i1 寫入源之前讀取它)寫后讀 (RAW) 數據冒險是指指令引用尚未計算或檢索的結果的情況。 之所以會發生這種情況,是因為即使一條指令是在前一條指令之后執行的,但前一條指令僅通過流水線進行了部分處理。
例子
例如:
i1. R2<-R5+R3i2。 R4 <- R2 + R3
xxx條指令計算要保存在寄存器 R2 中的值,第二條指令將使用該值計算寄存器 R4 的結果。 但是,在流水線中,當為第二次操作取操作數時,xxx次的結果還沒有保存,因此會產生數據依賴。
指令 i2 存在數據依賴性,因為它依賴于指令 i1 的完成。
讀后寫(WAR)
(i2 嘗試在目標被 i1 讀取之前寫入目標)讀取后寫入 (WAR) 數據冒險表示并發執行存在問題。
例子
例如:
i1. R4<-R1+R5i2。 R5 <- R1 + R2
在任何情況下 i2 有可能在 i1 之前完成(即并發執行),必須確保在 i1 有機會獲取操作數之前寄存器 R5 的結果不會被存儲。
寫后寫(WAW)
(i2 嘗試在 i1 寫入操作數之前寫入操作數)并發執行環境中可能會出現寫后寫入 (WAW) 數據冒險。
例子
例如:
i1. R2<-R4+R7i2。 R2 <- R1 + R3
i2 的回寫 (WB) 必須延遲到 i1 完成執行。
結構性危害
當已經在流水線中的兩條(或更多條)指令需要相同的資源時,就會發生結構性風險。 結果是對于一部分流水線,指令必須串行執行而不是并行執行。 結構性危害有時被稱為資源危害。
示例:多條指令準備進入執行指令階段且只有一個ALU(算術邏輯單元)的情況。 解決此類資源危險的一種方法是增加可用資源,例如將多個端口連接到主存儲器和多個 ALU(算術邏輯單元)單元。
控制冒險(分支冒險或指令冒險)
當流水線對分支預測做出錯誤的決定并因此將指令帶入流水線而隨后必須丟棄時,就會發生控制冒險。 術語分支風險也指控制風險。
消除危害
編輯通用
管道冒泡
管道冒泡,也稱為管道中斷或管道停頓,是一種排除數據、結構和分支危險的方法。 當獲取指令時,控制邏輯確定是否可能/將要發生危險。 如果這是真的,那么控制邏輯不會向流水線中插入任何操作 (NOP)。 因此,在下一條指令(會導致危險)執行之前,前一條指令將有足夠的時間完成并防止危險。 如果 NOP 的數量等于流水線中的級數,則處理器已清除所有指令并且可以安全地繼續執行。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/196069/