### 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.