---
# System prepended metadata

title: Lista 8
tags: [SYK24]

---

### Zadanie 1
![Tresc 1](https://hackmd.io/_uploads/HJvBfMax0.png)

Hazard sterowania - podczas instrukcji ze skokiem dowiemy się czy skoczymy dopiero po fazie ALU. Kolejna instrukcja ruszy już w drugim cyklu a my wiemy jeszcze czy skaczemy czy nie.

Hazard strukturalny - podczas gdy kilka instrukcji próbuje wykorzystać te same zasoby (Out of order)

RAW - podczas gdy jedna instrukcja zapisuje w rejestrze a jakaś kolejna chce odczytać z tego rejestru.

WAR - podczas gdy jedna instrukcja odczytuje wartość z rejestru a jakaś kolejna chce do niej zapisać inną wartość (Out of Order)

WAW - podczas gdy instrukcja zapisuje jakąś wartość do rejestru i 
jakaś kolejna chce ją nadpisać (Out of Order)

a) W procesorze jednocyklowym nie występują żadne hazardy, ponieważ każda instrukcja rozpoczyna się po zakończeniu poprzedniej.

b) W procesorze potokowym z pojedynczym ALU mogą wystąpić hazardy:
* RAW
t0 = t1 + t2  // instrukcja 1
t2 = t0 + t1  // instrukcja 2
przy próbie odczytu t0 w instrukcji 2 może jeszcze nie być znana wartość z instrukcji 1

* Hazard sterowania
![Do 1b](https://hackmd.io/_uploads/BkjsNzTl0.png)

WAR, WAW i hazard strukturalny nie występują.

W procesorze potokowym z jednym ALU nie będzie sytuacji gdzie w jednym cyklu są w tej samej fazie (chyba że RF ale tam zapisywanie i odczytywanie wykonują się w różnych połowach RF). (Brak hazardu sterowania)

WAR jak i WAW występują kiedy zezwolimy na Out of Order, jeżeli w potokowym mamy normalnie po kolei to nie ma problemu.

c) W procesorze potokowym z wieloma jednostkami wykonawczymi mogą wystąpić hazardy:

* RAW i hazard sterowania (tak samo jak dla podpunktu b)
* WAR 
    t0 = t1 + t2 //instrukcja 1
    t1 = t2 + t3 // instrukcja 2
    
    Jeżeli mamy Out of Order to może być tak, że najpierw wykona się instrukcja 2 i w instrukcji 1 zostanie odczytana zła wartość t1.
    
* WAW
   t0 = t1 + t2 //instrukcja 1
   t0 = t3 * t4 //instrukcja 2
   
   Jeżeli mamy Out of Order to może być tak, że najpierw wykona się instrukcja 2 a dopiero potem 1 i zostaniemy ze złą wartością w t0 (bo kolejne chcą skorzystać z tej z instrukcji 2 a my mamy z instrukcji 1)

* Hazard strukturalny
    t0 = t1 / t2 // instrukcja 1
    t3 = t4 / t5 // instrukcja 2
    
    mogą zostać wykonane na raz i każda chce skorzystać w ALU z dzielenia


### Zadanie 2
![Tresc 2](https://hackmd.io/_uploads/r1yCvG6lC.png)

**Scoreboard** -> zarządza hazardami i poprawnie zleca instrukcje

![Do 2](https://hackmd.io/_uploads/BkMTKG6g0.png)

* **RAW** -> scoreboard sprawdza czy do rejestru który chcemy odczytać nie będzie jeszcze nadpisywany przez inne instrukcje, jeśli tak to instrukcja powodująca hazard RAW poczeka w scoreboardzie aż hazardu nie będzie
* **WAR** -> jeżeli jakaś instrukcja chce odczytać rejestr który będziemy nadpisywać to ta instrukcja powodująca hazard WAR z obliczoną wartością czeka w scoreboardzie aż reszta odczyta poprawną wartość z rejestru. Jak już hazardu nie będzie to po prostu zapisze w tym rejestrze tą wartość.
* **WAW** -> jeżeli nasza instrukcja chce nadpisać rejestr, a któraś z instrukcji też chce zapisać do tego samego rejestru to nasza instrukcja powodująca hazard WAW czeka przed wejściem do scoreboardu aż hazardu nie będzie.
