---
# System prepended metadata

title: 計算機組織 Hazard

---

# 計算機組織與結構 Hazard

依照發生原因分成三種

* structural hazards 

    硬體資源不足
* data hazards
    
    某一指令要用到前一指令未產生的結果，當前指令所需資料無法取得
* control hazards
    
    branch 指令尚未決定是否 branch 至其他指令，後續指令便進入 pipeline
    
## 解決方案 

:::info
三種 cases 下的 hazards 皆可以用 stall 來解決，只是會造成 clocks cycle 損失，影響效能
:::

* structural hazards 

    有兩種解決方式=>
    1. 增加硬體資源，避免不同指令在相同 clock cycle 中存取資源
    2. 使用 stall，錯開指令順序
* data hazards
    
    有兩種解決方式，分為軟體、硬體
    * 軟體
        1. 插入 NOP 指令 (簡單，但是效率差)，在 MIPS 中最多插入3個 NOP 指令
        2. 用 compiler 進行 instruction reorder(重新排序)
        
        無法 reorder 就 insert NOP
    * 硬體
        1. 使用 forward 來解決
        2. 使用 stall

        硬體解決 data hazards 步驟為
        1. 先 Detection
        2. stall 
        3. forwarding

    依照指令讀/寫順序，分類為
    * RAW(read after write)
    * WAR(write after read)
    * WAW(write after write)

* control hazards(branch hazards)
    
    解決方法為
    1. 此時後續指令已進入 pipeline，如果 branch 指令發生，便捨棄已經解碼的指令，從 branch 目的位址繼續執行 (會有效能損失)
    2. 此時後續指令已進入 pipeline，那便假設 branch 指令不發生，後續指令繼續執行 (不會有效能損失)

    3. 延遲 branch，意思就是不立即 branch 等到後續指令完成後再執行 branch 指令
    4. branch prediction，意思為使用 branch prediction 的結果繼續執行 pipeline
    
    做個比較
    * 第一種會有效能損失
    * 第二種不會有效能損失
    * 第三種可以減少效能損失
    * 第四種可以減少效能損失，但是預測錯會浪費時間
    