Hazards

Hazards #

Problema #

Abbiamo delle istruzioni che provocano hazards.

Alee strutturali #

⚠️ Risorsa condivisa tra più stadi (es. memoria).

Come si risolve? #

  • Duplicazione della risorsa. Lo facciamo per esempio per l’ALU, che dovrebbe essere condivisa tra la fase di EXECUTE e quella di FETCH. Non sempre va bene ovviamente.
  • Serializzazione degli accessi.
  • [ADVANCED] Caches ovunque e facciamo finta di aver duplicato la risorsa.

Alee di Dato #

⚠️ Un istruzione legge qualcosa che è stato modificato da un’altra istruzione che è ancora in pipeline (es. Read After Write - RAW, jump a registro appena modificato)

Come si risolve? #

  • Forwarding: colleghiamo all’EX le fasi più avanti in modo tale che l’u.c. possa scegliere se utilizzare i registri provenienti dalla fase di DECODE (stale) oppure quelli appena creati (forwarded).

    Risolve quasi tutte le RAW senza stallare la pipeline.

  • Se l’istruzione che modifica (quella da cui la nostra istruzione attuale nell’EX dipende) è una LOAD è un problema. Perchè? Perchè c’è accesso in memoria. Che cazzo forwardi? nulla. Quindi bisogna aspettare la fine di MEM.

    In questo caso si può ricorrere alla delayed load perchè se la nostra istruzione è nella fase di EX, la LOAD sarà in fase di WB, quindi possiamo prendere già il valore presente nel registro appena e forwardarlo alla fase di EX.

🔥 La delayed load è fattibile solamente se ho il forward.

Alee di Controllo #

La BRANCH e la JUMP, oltre ad avere un problema di alea di dato se faccio jump/branch ad un registro appena modificato, hanno anche un alea di controllo.

In generale per entrambe possiamo ottimizzare l’archittetura per avere che il risultato della JUMP/BRANCH (nella EX) mi faccia caricare direttamente la prossima istruzione corretta.

Mentre per la JUMP, non posso fare nient’altro, per la branch posso provare a predirre se il jump sarà taken or not. Per fare questo ci sono vari modi.

La migliore (vista) è il BTB, perchè sbaglio molto meno di qualsiasi modo (sicuramente non ha senso l’always stall e con la predict not taken sbaglio molte più volte)