# Hazard ###### tags: `IT鐵人` ## Pipeline隱憂 上一次我們提到Pipeline可以提升速度,不過捷徑一定比較難走,小時候完馬力歐賽車也是捷徑比較難進去或是很難通過。 ![](https://i.imgur.com/AGYunCP.png) Pipeline也是一樣,會遇到一些為了加速而遇到的阻礙。 ## Hazard Pipeline主要遇到Hazard為下列三者︰ | 類型 | 原因 | |-|-| | Structural Hazard(結構危障) | 硬體資源不夠多,導致在同一時間內要執行的多個指令無法執行。 | | Data Hazard(資料危障)| Pipeline中某一指令需要用到前面指令尚未產生的結果,也就是執行的指令所需的資料還無法獲得。 | |Control Hazard(控制危障)| Branch的結果尚未產生時,後續的指令就已經進入Pipeline,如果決定要branch到別的位置便會發生錯誤。所以又稱為Branch Hazard。 | ## Structural Hazard **資源太少** 如果我們只有一個單一記憶體,而不是兩個分離的記憶體。那麼Instruction Memory跟Data Memory要同時被存取時,就會發生Structural Hazard。如下︰ ![](https://i.imgur.com/Jlh4Bzb.png) 這時候就會讓記憶體被兩個指令存取,會導致無法執行產生Hazard。 不過基本上都會把兩個分開來執行啦,所以不用擔心這個。 ## Data Hazard **資料舊了** Data Hazard發生的情況是,前後的指令都有用到同一個Register,不過前面修改的值還沒放回Register中,後面就直接對他取值,將導致資料是錯誤的狀況,比如說以下狀況: ![](https://i.imgur.com/5yrK73H.png) 這五個指令都有用到r1 Register,不過第一行的add結果要在最後的WB才會寫回去Register中,導致後面的sub跟and都會拿到尚未修改的值,不符合原先的期望。 除了最後的xor因為在下一個Cycle才取值,一定沒問題外,前面的or指令不會發生的原因為:**WB在Cycle前半完成,而ID是在Cycle後半才開始**,所以不會發生Data Hazard。 ## Control Hazard **做白工** Control Hazard特別的事情在於不是每次Branch指令都會發生,而是萬一Branch的結果為真(需要跳到別的位置執行),才會發生Control Hazard。以下圖為例: ![](https://i.imgur.com/gDJ3WV8.png) 假設beq指令成立,要跳到64位址執行slt,那麼中間的and, or, sub等等的指令都需要作廢,這時候就稱為Control Hazard。 ## 下回預告 這次跟大家談到了hazard的類型,下次會跟大家說明怎麼解決hazard。不知道聰明如你有沒有想到什麼簡單的解決方式呢? | 上一篇 | 下一篇 | |-|-| | [Pipeline](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/rynNyOKJY) |[在Hazard尋求解法是否搞錯了什麼](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/BkGKEG61F)| ## BIOHAZARD 跟大家補充一個小故事,BIOHAZARD這個字,其實就是我們熟悉的惡靈古堡系列,不過因為美國紐約有一個樂團已經把這個字註冊為樂團名字,所以歐美版本就使用了現在大部份人熟悉的Resident Evil。 臺灣使用了就是歐美版,聽說中國大陸跟香港則繼續使用BIOHAZARD。 |BIOHAZARD|RESIDENT EVIL| |-|-| |![](https://i.imgur.com/eAl83ne.png =500x500)|![](https://i.imgur.com/f8BUAD6.jpg =500x500)|