# Hazard ###### tags: `IT鐵人` ## Pipeline隱憂 上一次我們提到Pipeline可以提升速度,不過捷徑一定比較難走,小時候完馬力歐賽車也是捷徑比較難進去或是很難通過。  Pipeline也是一樣,會遇到一些為了加速而遇到的阻礙。 ## Hazard Pipeline主要遇到Hazard為下列三者︰ | 類型 | 原因 | |-|-| | Structural Hazard(結構危障) | 硬體資源不夠多,導致在同一時間內要執行的多個指令無法執行。 | | Data Hazard(資料危障)| Pipeline中某一指令需要用到前面指令尚未產生的結果,也就是執行的指令所需的資料還無法獲得。 | |Control Hazard(控制危障)| Branch的結果尚未產生時,後續的指令就已經進入Pipeline,如果決定要branch到別的位置便會發生錯誤。所以又稱為Branch Hazard。 | ## Structural Hazard **資源太少** 如果我們只有一個單一記憶體,而不是兩個分離的記憶體。那麼Instruction Memory跟Data Memory要同時被存取時,就會發生Structural Hazard。如下︰  這時候就會讓記憶體被兩個指令存取,會導致無法執行產生Hazard。 不過基本上都會把兩個分開來執行啦,所以不用擔心這個。 ## Data Hazard **資料舊了** Data Hazard發生的情況是,前後的指令都有用到同一個Register,不過前面修改的值還沒放回Register中,後面就直接對他取值,將導致資料是錯誤的狀況,比如說以下狀況:  這五個指令都有用到r1 Register,不過第一行的add結果要在最後的WB才會寫回去Register中,導致後面的sub跟and都會拿到尚未修改的值,不符合原先的期望。 除了最後的xor因為在下一個Cycle才取值,一定沒問題外,前面的or指令不會發生的原因為:**WB在Cycle前半完成,而ID是在Cycle後半才開始**,所以不會發生Data Hazard。 ## Control Hazard **做白工** Control Hazard特別的事情在於不是每次Branch指令都會發生,而是萬一Branch的結果為真(需要跳到別的位置執行),才會發生Control Hazard。以下圖為例:  假設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| |-|-| |||
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.