# pipeline Hazards pipeline Hazards 是計算機pipeline架構中遇到的障礙。這些障礙可能會阻礙指令在pipeline中的順利執行,可能導致效率低下或結果不正確。pipeline Hazards主要有三種類型: ## Structural Hazards: * 指的是試圖同時以兩種不同方式使用同一資源的情況。 * 例如,一個結合了洗衣機和烘乾機的設備,同時嘗試清洗和烘乾衣物,這就會造成Structural Hazards。 * 另一個例子是一個電腦正在忙於做其他事情(例如看電視),無法同時處理來自其他地方的信息,這也會導致Structural Hazards的發生。 ![image](https://hackmd.io/_uploads/SJQg1Bwop.png) ## Data Hazards: * 指的是在準備好之前嘗試使用數據的情況。 * 這通常發生在一個指令依賴於仍在pipeline中的前一個指令的結果時。 * 例如,如果一個指令需要依賴前一個指令產生的結果,而該前一個指令仍在pipeline中執行,這就會導致Data Hazards的發生。 Data Hazards的三種類型: * RAW(讀後寫): * 指令 i2 試圖在指令 i1 寫入操作數之前讀取它。 * WAR(寫後讀): * 指令 i2 試圖在指令 i1 讀取操作數之前寫入它。這導致獲得錯誤的操作數,例如自動增加地址。 * WAW(寫後寫): * 指令 i2 試圖在指令 i1 寫入操作數之前寫入它。這會導致得到錯誤的結果,因為結果是 i1 的,而不是 i2 的。 ![image](https://hackmd.io/_uploads/rJ35xBPia.png) 在MIPS(Microprocessor without Interlocked Pipeline Stages)架構的五級pipeline中,只有 RAW 類型的Data Hazards是可能發生的。 這是因為在MIPS架構中,所有的指令都需要經過五個階段才能完成,並且讀取操作數的階段始終在第二階段進行,而寫入操作數的階段始終在第五階段進行。 因此,WAR(寫後讀)和 WAW(寫後寫)類型的Data Hazards不會發生在MIPS架構的pipeline中。 #### 處理Data Hazards的方法包括: * 使用簡單、固定的設計: * 通過在pipeline中的早期階段(如指令解碼階段)提前獲取操作數,從而消除 WAR(寫後讀)類型的Data Hazards。 * 通過在最後一個階段(靜態階段)按順序執行所有寫回操作,從而消除 WAW(寫後寫)類型的Data Hazards。 * 這些特性與指令集架構(ISA)的設計密切相關。 * Register file 中的內部轉發: * 在clock的前半部分進行寫入,而在後半部分進行讀取,這樣可以確保後續指令能夠立即獲得之前指令寫入的數據。 * 讀取操作會提供前一個clock週期內寫入的數據,從而解決加法和減法等操作之間的數據衝突。 * 檢測和解決剩餘的障礙: * 編譯器可以插入空操作指令(NOP),從而解決數據依賴的衝突,這是一種軟件解決方案。 * 使用轉發機制,將數據直接傳遞給需要的指令,這是一種硬件解決方案。 * 在必要時暫停pipeline的執行,直到數據準備好為止,這是另一種硬件解決方案。 這些方法結合起來可以有效地處理Data Hazards,從而提高pipeline的效率和正確性。 ## Control Hazards: * 發生在嘗試在條件評估之前做出決定的情況下。 * 例如,洗足球隊的球衣時,需要查看前一次洗滌的結果以確定適當的洗衣劑水平,而此時可能需要在評估條件之前做出決定。 * 另一個例子是分支指令,在評估條件之前就要做出分支決定,這也會導致控制障礙的發生。