Ciao Mondo 3!

AMD Llano A-series: Analisi dell'architettura - Unità di Fetch e Decodifica

Indice articoli


Unità di Fetch e Decodifica

L’unità di fetch e decodifica effettua la traduzione del vetusto e complesso set di istruzioni x86-64 in più maneggevoli macro-ops. Ogni macro-op è in grado di descrivere una operazione aritmetico/logica, intera o in virgola mobile, e contemporaneamente una operazione di memoria, sia essa di lettura, scrittura, e lettura-modifica-scrittura (operazione atomica, utile per implementare i semafori nei kernel dei sistemi operativi).

Llano non si discosta molto dal suo predecessore. Incorpora due decoder separati, uno per decodificare e scomporre istruzioni semplici (fino a 2 macro-op), così dette DirectPath e uno per le istruzioni più complesse, così dette VectorPath (3 o più macro-op).

Quando la finestra istruzioni (che ricordiamo è di 32 byte divisa in due parti da 16 byte) è letta dalla cache istruzioni L1, i byte sono esaminati per determinare se le istruzioni sono di tipo DirectPath o VectorPath (questa è una delle informazioni che fanno parte del pre-decode e che sono memorizzate nella L1). L’output di questi decoder mantiene l’ordine di programma per le istruzioni.

Come vedremo più avanti, Llano è una architettura out-of-order, ossia è in grado di eseguire le istruzioni fuori ordine per una esecuzione più veloce.

Questi decoder possono produrre fino a tre macro-op per ciclo, provenienti esclusivamente da uno dei due tipi di decoder, in ogni ciclo. L’output di questi decoder è unito e passato alla unità seguente, la Instruction Control Unit (ICU unità di controllo istruzioni).

Poiché la decodifica di una istruzione VectorPath produce almeno 3 macro-op ed è possibile mandare all’ICU solo le macro-op di una unità alla volta, la decodifica di istruzioni VectorPath ferma quella delle istruzioni DirectPath. Le istruzioni DirectPath che possono essere decodificate in un ciclo dipendono dalla complessità delle stesse.

Il decoder DirectPath è in grado di decodificare ogni combinazione di istruzioni x86 di tipo DirectPath che si traduce con una sequenza di 2 o 3 macro-op, considerando che la decodifica avviene in ordine di programma. Quindi sono possibili 3 istruzioni se ci sono 3 istruzioni consecutive da una macro-op, cosiddette DirectPath Single. 2 istruzioni sono possibili se una è DirectPath Single e l’altra è DirectPath Double (così sono chiamate le istruzioni semplici che generano due macro-op). E’ possibile la decodifica di una sola istruzione se ci sono due istruzioni DirectPath Double consecutive, che non possono essere decodificate assieme in quanto produrrebbero 4 macro-op, oltre il limite di 3 dell’architettura.

Un altro limite alla quantità di istruzioni decodificabili è dato dal fatto che in un dato ciclo può essere acceduto un solo blocco di 16 byte, dei 32, alla volta e quindi possono essere decodificate solo le istruzioni contenute in tale blocco. Poiché ci sono alcune istruzioni che occupano fino a 15 byte, è possibile che in un blocco di 16 byte non siano presenti un numero di istruzioni sufficienti a impegnare tutto il decoder.

 

Branch Prediction

La predizione dei salti in Llano funziona allo stesso modo della precedente generazione. Un nuovo salto è predetto come non preso finché non è effettivamente preso una volta. Successivamente il salto è predetto come preso finché questa previsione non è effettivamente sbagliata. Dopo queste due previsioni sbagliate, la CPU inizia ad usare la Branch Prediction Table (BPT, tavola di predizione dei salti).

La logica di fetch accede alla cache L1 istruzioni e alla BPT in parallelo e le informazioni nella BPT sono usate per predire la direzione di salto. Quando le istruzioni sono spostate nella cache L2, le informazioni di pre-decode e i selettori di salto (che indicano in quale condizione il salto sia, ossia mai visto, preso una volta, preso e poi non preso) sono copiate con esse e memorizzate al posto del codice ECC.

La tecnica di predizione dei salti è basata su una combinazione di un branch target buffer (BTB, buffer delle destinazioni di salto predette) di 2048 elementi e di un global history bimodal counter (GHBC, contatore bimodale storico globale) di 16384 elementi a 2 bit che contengono un contatore a saturazione usato per prevedere se un salto condizionale deve essere predetto come preso. Questo contatore contiene quante volte nelle ultime 4 esecuzioni il salto è stato preso e dunque il salto è predetto come preso se almeno 2 volte è stato preso di recente.

La GHBC è indirizzata con una combinazione di un numero non specificato di risultati degli ultimi salti condizionali e l’indirizzo di salto. Questa è una tecnica standard di predizione che prevede l’indirizzamento della tabella con un hashing dell’indirizzo di salto combinato con l’esito degli ultimi n salti.

Il branch prediction include anche un return address stack (RAS, stack di indirizzi di ritorno) di 24 elementi per predire le destinazioni di chiamate a procedura e ritorno da procedura. Infine è presente una tabella di 512 elementi per predire i salti indiretti, anche con destinazioni multiple.

 

Sideband Stack Optimizer

Tale unità tiene traccia del registro stack-pointer (puntatore allo stack). In tal modo possono essere eseguite in parallelo varie istruzioni che richiedono in ingresso tale registro (CALL, RET, PUSH, POP, indicizzazione tramite lo stack pointer, calcoli che hanno come registro sorgente lo stack pointer).

Istruzioni che non possono essere eseguite in parallelo sono quelle che hanno come destinazione lo stack-register, quelle di indirizzamento indicizzato (in cui sono fatti calcoli su tale registro) e le istruzioni di tipo VectorPath che usano in qualche modo tale registro (per la difficoltà di tenere traccia del registro in istruzioni VectorPath).

 

Instruction Control Unit

La ICU è il centro di controllo del processore. Controlla il registro centralizzato di riordino per le istruzioni in esecuzione e gli scheduler interi e floating point.

E’ responsabile del dispatch (ossia dell’inoltro all’opportuno scheduler) delle macro-op, del ritiro (ossia della determinazione e validazione del risultato) delle macro-op, della risoluzione delle dipendenze dei registri e dei flag, tramite il renaming (una tecnica per poter eseguire in parallelo istruzioni scorrelate ma che accedono allo stesso registro), della gestione delle risorse di esecuzione, delle interruzioni, eccezioni (durante il ritiro delle macro-op) e della gestione della predizione errata dei salti, che comprende lo svuotamento delle varie code e l’annullamento delle operazioni in corso.

L’ICU prende fino a 3 macro-op per ciclo, prodotte dal decoder precedentemente e le inserisce in un buffer di riordino centralizzato, composto da 28 linee di 3 macro-op, che costituiscono un incremento rispetto alle 24 della precedente architettura Stars. Questo incremento può dare maggior respiro al decoder a monte, in quanto se a valle le istruzioni non sono eseguite per mancanza di dati dalla memoria, ad esempio, questa coda si riempie rapidamente. Incrementarla diminuisce il tempo di stallo del decoder, che si deve fermare se tale coda è piena.

Questo buffer consente di tener traccia di un massimo di 84 macro-op, sia intere che floating point. L’ICU può inoltrare simultaneamente le macro-op ai vari scheduler interi o floating point, che faranno la decodifica finale e l’esecuzione delle macro-op.

Una volta completata l’esecuzione, è sempre l’ICU che effettua il ritiro, in ordine di programma, delle istruzioni e ne gestisce le eventuali eccezioni, compresa la predizione errata di un salto

E’ da notare che le varie macro-op possono venire eseguite fuori ordine e in parallelo, sia all’interno della stessa unità (intera o floating point), sia se eseguite su unità diverse. Il dispacth e il retire avvengono, invece, in ordine di programma.

Pubblicità


Corsair

Articoli Correlati - Sponsored Ads