Architetture dei processori/Unità di decodifica: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Hellisp (discussione | contributi)
mNessun oggetto della modifica
Hellisp (discussione | contributi)
Riga 24:
 
== Esecuzione predicativa ==
L'esecuzione predicativa è un approccio che mira a sostituireridurre la dipendenza del processore dall'unità di predizione delle diramazioni. I microprocessori moderni sono dotati di molte unità funzionali in grado di eseguire operazioni in parallelo ma queste unità sono quasi sempre vuote. Processori anche molto complessi come il Pentium 4 pur potendo in teoria eseguire fino a 6 operazioni in contemporanea in realtà per la maggior parte del tempo eseguono una o due operazioni in parallelo. Partendo da questa constatazione l'approccio predicativo punta a riempire al massimo le unità di elaborazioni eliminando le istruzioni eseguite per errore. Un processore dotato di esecuzione predicativa oltre a leggere le istruzione legge dei predicati associate a esse, questi predicati indicano al processore in caso di salto condizionato quale ramo risulta effettivamente valido. In sostanza in caso di salto condizionato il processore associa alla condizione di salto un predicato (per esempio il predicato P0). Al blocco di istruzioni da eseguire se il salto viene eseguito viene associato il predicato P0=0 mentre al blocco di istruzioni da eseguire nel caso il salto non venga eseguito viene associato il predicato P0=1. Poi il processore esegue in parallelo l'istruzione di salto in un'unità funzionale, le istruzioni del primo blocco in una seconda unità funzionale e l'istruzione del secondo blocco in una terza unità funzionale. Quando l'istruzione di salto viene calcolata si vede se il predicato vale 0 oppure 1 e quindi si può stabilire quale blocco di istruzioni sia valido. Il blocco con le istruzioni non valide vengono individuate tramite i predicati loro associati ed eliminate. Questa filosofia di sviluppo quindi preferisce eseguire anche istruzioni inutili pur di mantenere sempre piene le pipeline. Questa metodologia di esecuzione fornisce buone prestazioni se le pipeline non sono formate da troppi stadi. Per esempio un processore come il Penium 4 è dotato di pipeline da 31 stadi e quindi un'esecuzione predicativa potrebbe portare ad eseguire fino a 31 operazioni inutili prima del completamento del salto e quindi dell'individuazione delle istruzioni eseguite erroneamente. Il processore Itanium 2 che implementa questa modalità di esecuzione difatti utilizza pipeline corte, a 10 stadi. L'esecuzione predicativa se non è gestita dal set di istruzioni del processore è molto costosa da implementare. Il processore dovrebbe associare in tempo reale alle istruzioni i vari predicate e tenerne traccia durante l'esecuzione. É da notare che non tutti i salti possono convenientemente essere risolti con i predicati, a volte conviene basarsi sull'unità di predizione dei salti. Quale delle due alternative scegliere dipende dal codice e solo un'analisi approfondita del codice permette di individuare l'alternativa migliore ma un processore dovendo scegliere in tempo reale quale alternativa scegliere dovrebbe far affidamento su delle euristiche con non sempre danno il risultato ottimo. Invece un processore dotato nativamente di questa modalità di esecuzione deve semplicemente caricare i predicati e regolare correttamente i registri appositi dato che tutta la fase di analisi del codice è stata svolta precedentemente dal compilatore che non avendo problemi di tempo può individuare l'alternativa migliore.
 
 
Ovviamente tutte queste infrastrutture aggiuntive rendono le unità di decodifica molto complesse e queste occupano buona parte dei transistor dei moderni processori. Per ridurre il problema si sono sviluppate architetture come le architetture VLIW e derivate che affrontano il problema alla radice con un paradigma diverso.