1. Data Forwarding (Bypass):
* Meccanismo: Questo è il metodo più comune ed efficiente. Se il risultato di un'istruzione in una fase successiva della pipeline è necessario con un'istruzione in una fase precedente, il risultato viene inoltrato direttamente dalla fase successiva alla fase precedente, aggirando l'accesso alla memoria.
* Esempio: Diciamo che le istruzioni i1 scrive per registrare R1 e le istruzioni I2 recita da R1. L'inoltro dei dati invierebbe il valore scritto da I1 direttamente a I2, impedendo una stalla anche se I1 non ha completato la sua scrittura in memoria.
* Efficacia: Altamente efficace per la risoluzione dei pericoli RAW (leggi dopo scrittura) in cui la dipendenza è tra le istruzioni che scrive e quindi leggere lo stesso registro.
2. Stalling (inserzione delle bolle):
* Meccanismo: Se l'inoltro dei dati non è possibile (ad esempio, la dipendenza è troppo lontana nella pipeline o prevede l'accesso alla memoria), la pipeline viene bloccata inserendo "bolle"-istruzioni no-op-fino a quando i dati sono pronti.
* Esempio: I1 scrive in memoria e I2 legge da quella posizione di memoria. L'inoltro dei dati non è fattibile poiché la scrittura di I1 deve essere completata prima che I2 possa leggere. La pipeline si blocca fino a quando I1 non completa la sua scrittura.
* Efficacia: Più semplice da implementare rispetto all'inoltro ma riduce in modo significativo il throughput della pipeline.
3. Registrati di rinomina:
* Meccanismo: Il compilatore o l'hardware assegna diversi registri alle istruzioni che potrebbero avere una dipendenza dai dati. Questo elimina i pericoli di guerra (scrivi dopo letti) e waw (scrittura dopo scrittura). Ad esempio, se due istruzioni utilizzano lo stesso registro, l'hardware può rinominarne uno in un registro diverso, risolvendo così il conflitto.
* Esempio: Due istruzioni vogliono scrivere su R1. Il registro di rinominato assegna alla seconda istruzione un diverso registro temporaneo, risolvendo il pericolo WAW.
* Efficacia: Molto efficace nell'eliminazione dei rischi di guerra e Waw, ma comporta la complessità hardware. Spesso utilizzato in combinazione con l'inoltro dei dati.
4. Ottimizzazioni del compilatore:
* Meccanismo: I compilatori possono analizzare il codice per le dipendenze dei dati e il riordino per ridurre al minimo i pericoli. Ciò può comportare la pianificazione delle istruzioni per separare istruzioni che dipendono l'una dall'altra, riducendo così la necessità di stallo o inoltro.
* Esempio: Il compilatore potrebbe riordinare le istruzioni per spostare le istruzioni che leggono i dati più lontani dalle istruzioni che scrivono tali dati, dando così alla pipeline più tempo per finire prima che le istruzioni dipendenti ne abbiano bisogno.
* Efficacia: Riduce la frequenza dei pericoli a livello di codice sorgente, ma l'efficacia dipende dalle capacità del compilatore.
La scelta della tecnica di mitigazione dipende dall'architettura specifica del processore. I processori moderni in genere utilizzano una combinazione di inoltro dei dati, reinserimento di registrazione e ottimizzazioni del compilatore per un'efficace gestione dei pericoli dei dati. Lo stallo viene spesso usato come ultima risorsa quando altre tecniche sono insufficienti.
software © www.354353.com