Architetture dei processori/Unità predizione salti: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
Ramac (discussione | contributi)
m cambio avanzamento a 100%
Riga 1:
{{avanzamento|100%}}
{{Architettura dei processori}}
 
[[Image:Pentium4 northwood.png|thumb|right|300px|Pentium IV, processore utilizzante la predizione della linea successiva]]
Esistono molte tecniche per implementare la predizione dei salti. Tecniche più complesse portano ad ottenere percentuali di previsione migliori ma comportano anche costi maggiori per via del maggior numero di transistor impiegato e quindi spesso non vengono utilizzate le migliori strategie di previsione ma strategie più semplici e quindi più economiche da implementare.
 
*===Predizione elementare===
I primi esemplari di [[w:SPARC|SPARC]] e [[w:MIPS (microprocessori)|MIPS]] (due delle prime architetture RISC commerciali) facevano una specie di predizione, molto elementare: non consideravano mai il salto accettato, e decodificavano l'istruzione seguente. L'operazione di salto veniva effettutata solo dopo che la condizione veniva valutata.
 
Entrambe le CPU effettuavano questa "predizione" in fase di decodifica e dedicavano al ''fetch'' delle istruzioni (il caricamento della istruzione dalla cahe) un solo ciclo di clock. In questo modo per effettuare un salto servivano due cicli di clock, ma dopo il primo la CPU aveva già effettuato il ''fetch'' dell'istruzione subito successiva al salto; piuttosto che sprecare questo lavoro, entrambi i microprocessori eseguivano anche queste istruzioni, avvantaggiandosi magari per fasi successive del lavoro. Ovviamente i compilatori (o i programmatori assembler) devono essere ben consci di questa caratteristica pena bug molto difficili da scovare.
 
*===Predizione statica===
I processori che impiegano questa tecnica considerano sempre i salti verso la parte precedente del codice come "accettati" (ipotizzando che siano le istruzioni riguardanti un ciclo) e i salti in avanti sempre come "non accettati" (ipotizzando che siano uscite precoci dal ciclo o altre funzioni di programmazione particolari). Per cicli che si ripetono molte volte, questa tecnica fallisce solo alla fine del ciclo.
 
La predizione statica è usata come "paracadute" quando non ci sono elementi per usare altre tecniche come la predizione dinamica e il processore deve andare "alla cieca".
 
===Predizione della linea successiva===
Alcuni processori superscalari (es.: MIPS R8000 e [[w:DEC Alpha|DEC Alpha EV6/EV8]] eseguivano col ''fetch'' di una linea di istruzioni, quello di un puntatore alla successiva. Questo metodo è piuttosto diverso dagli altri trattati qui perché esegue la previsione sia della scelta della diramazione che dell'obiettivo del salto.
 
Line 22 ⟶ 21:
Le istruzioni scartate dall'unità di predizione fanno guadagnare quasi un completo ciclo di ''fetch'', anche con predizioni eseguite solo sulla linea successiva e in un solo ciclo di clock.
 
*===Predizione bimodale===
Questa tecnica sfrutta una tabella di contatori a due bit, e indicizzati con i bit meno significativi dell'indirizzo dell'istruzione cui si riferiscono (a differenza della cache per le istruzioni, questa tabella non ha ''tag'' e quindi uno stesso contatore può essere riferito a più istruzioni: ciò è definito ''interferenza'' o ''aliasing'' e porta a una perdita di precisione nella previsione). Ogni contatore può trovarsi in uno di questi quattro stati:
 
Line 33 ⟶ 32:
 
Esempi di unità di predizione molto grandi basate su questo sistema hanno ottenuto una percentuale di successo pari al 93,5% su benchmark SPEC.
*===Predizione locale===
 
*Predizione locale
La predizione bimodale fallisce all'uscita di ogni ciclo: per cicli che si ripetono con andamento sempre simile a sè stesso si può fare molto meglio.
 
Line 43 ⟶ 41:
Questa tecnica è più lenta perché richiede il controllo di due tabelle per effettuare ogni previsione. Una versione più veloce organizza un insieme separato di contatori bimodali per ogni istruzione cui si accede, così il secondo accesso all'insieme può procedere in parallelo con l'accesso all'istruzione. Questi insiemi non sono ridondanti, in quanto ogni contatore traccia il comportamento di una singola condizione.
 
*===Predizione globale===
Nella predizione globale si fa affidamento sul fatto che il comportamento di molte condizioni si basa su quello di condizioni vicine e valutate da poco. Si può così tenere un unico registro che tiene conto del comportamento di ogni condizione valutata da poco, e usarne i valori per indicizzare una tabella di contatori bimodali. Questo sistema è di per sè migliore della predizione bimodale solo per grandi tabelle, e non è migliore della predizione locale in nessun caso.
 
Line 55 ⟶ 53:
 
Esistono altre tipologie di predizioni ma sono tecniche che richiedono un dispendio di transistor eccessivo per le prestazioni che effettivamente offrono. Data l'importanza delle predizione dei salti comunque tutti i processori moderni implementano unità di predizione dei salti molto avanzate. Per esempio il POWER 5 prodotto da IBM implementa tre unità di predizione dei salti. Due unità cercano di predire i salti utilizzando strategie diverse e la terza unità tiene traccia delle percentuali di successo delle due unità e a seconda dell'istruzione sceglie l'unità che ha avuto la percentuale di successo maggiore.
 
[[Categoria:Architetture dei processori|Unità predizione salti]]
{{Avanzamento|100%|29 dicembre 2008}}