---
# System prepended metadata

title: Hazard
tags: [Computer Architecture]

---

# Hazard

## :bulb: Background

### pipeline (review)
---

&emsp;&emsp;pipeline 將一個指令分為5個stage (IF、ID、EX、MEM、WB)，使得同一個clock cycle可以同時處理多條指令。

&emsp;&emsp;ideal pipeline speed up  = # of stages，然而如果each stage執行秒數各不同，受限於執行時間最大的stage，使得speed up 小於理想值。
![image](https://hackmd.io/_uploads/HJlTE7OH0.png)


##  :book: Introduction
---

&emsp;&emsp;pipeline存在一種情況使得下一條指令無法在下一個clock cycle 順利執行。這種情形稱為``pipeline hazard``

### Hazard type

1. Structural hazard

    資源使用衝突，使得必須等待前一指令resource使用完畢。

    ex: 假設pipeline 只有單一memory，那麼同一個cycle Mem stage (load \ store) 與 IF stage (instruction fetch) 產生資源使用衝突
    <br>
    
:::success

:bulb: solution

&emsp;&emsp;use separate instruction / data memory or caches
:::

    
2. Data hazard

    指令所使用data相依於前一指令計算結果
    
    ![image](https://hackmd.io/_uploads/SyWos7uH0.png =500x)

    
    :::warning
    因add指令在ALU階段執行Register value還沒進行更新，但sub指令此時需要ALU計算結果
    :::


3. Control hazard

    需要等待control flow結果才能決定使否執行下一行指令
    
    ```cpp
    if (x > 10) x++;
    else x--;
    ```
    
    :::warning
    x > 10 結果還沒出來，此時x++指令已經載入至cpu中。
    若 x > 10 為 false 則必須把先前載入指令flush，並跳至x- -指令
    :::
---

### **Resolving Data hazard**

#### 1. Stall (insert bubble)

當偵測到Data hazard產生時，insert bubbles (No Operation)，直到執行結果寫回至register
![image](https://hackmd.io/_uploads/Byr_-N_BC.png =600x)


#### 2. Forwarding

adding extra hardware 將執行結果forward到下一個指令

![image](https://hackmd.io/_uploads/B1rzNEuSA.png  =600x)

:::danger
Load-Use Data Hazard 無法只靠forwarding就能解決，這是因為一般指令結果在EX stage就能知道，但ld / sd指令要在Mem stage取得資料才能知道結果
:::

![image](https://hackmd.io/_uploads/rkAaEN_HC.png =600x)

:::success

:bulb: solution

&emsp;&emsp;Stall and Forwarding
:::
#### 3. Data hazard Conclusion

在hazard處理上應避免Stall，因過多Stall將使得pipeline退回non-pipeline執行效率，因此在program方面==load use data hazard==可以透過==調整指令執行順序==，減少因stall所需的clock cycle

![image](https://hackmd.io/_uploads/H1tPiVuHR.png)

----

### **Resolving Control hazard**

1. Stall (insert bubble)

    insert bubble (NOP) 等到branch 指令結果出來

2. Branch Prediction

    **a. Static branch prediction**

    根據typical branch behavior，預設branch結果

    ex: ==for loop== 預設結果為 ==true==、 if statement 預設結果為 ==false==

    **b.Dynamic branch prediction**
    
    根據執行狀況，更改預測選項

    ex: 若branch result一直為 true，那麼預測應該更改為true，反之亦然
    
    :::success
    如果實際結果與預測結果不符，那麼將會指令flush掉，並重新載入正確指令，但如果預測正確將會減少不必要的flush與stall
    :::
    
----

### **Conclusion**

所有Hazard皆可透過Stall技巧解決，但應盡力避免，改採用其他方法，因過多Stall將使得pipeline優勢蕩然無存。因此像==Struct Hazard==透過==seperate memory or caches==、==Data Hazard==透過==Forwarding==、==Condiction Hazard==透過==Branch Prediction==，減少不必要的Stall，維持pipeline應有的Performance。

---

### Reference

[1] P.A.Patterson and J.L. Hennessy, Computer Organization and Design RISC-V

###### tags:  `Computer Architecture`

<style>
    @import url('https://fonts.googleapis.com/css2?family=PT+Serif&display=swap');
    @import url('https://fonts.googleapis.com/css?family=Noto+Serif+TC&amp;display=swap');
    @import url('https://fonts.googleapis.com/css2?family=Fira+Code&family=Noto+Serif+TC&display=swap');

    * {
        font-family: 'PT Serif', 'Noto Serif TC', sans-serif;
        letter-spacing: 0.02em;
        /* font-size: 16px;
        letter-spacing: 0.02em; */
    }

    .easy{
        color:green;
    }
    .medium{
        color:#eda35e;
    }
    .red{
        color:red;
    }
    
    .proof {
        padding:10px;
        background-color: #f7f7f7;
    }    


</style>
