3.
Instruction Control Unit (ICU)
La
ICU ha il compito seguire le istruzioni nei vari stadi dell’esecuzione.
Essa controlla gli scheduler e il proprio reorder buffer in
modo da gestire la distribuzione e il ritiro delle MOPs e le
operazioni di ridenominazione dei registri e gestione delle
risorse delle unità esecutive nonché gli interrupt. La ICU preleva
fino a 3 MOPs per ciclo e le immagazzina in un reorder buffer
composto da 24 linee ciascuna da 3 MOPs per un totale di 72
MOPs gestibili (si confrontino con le 40 del ROB del Pentium
III).
Queste
72 MOPs sono trattate diversamente a seconda che siano destinate
alla pipe interi o a quella FP e sono organizzate al fine di
ottenere il massimo throughput. Le MOPs per FP sono inviate
direttamente alla pipe FP mentre le MOPs su interi sono inviate
al proprio scheduler con l’indirizzo del proprio registro rinominato
e dei propri operandi già determinati tramite l’integer register
file dell’ICU. L’ICU appone un tag nelle MOPs per ogni operando
vacante per rintracciarlo più velocemente quando l’operando
sotto forma di risultato di una precedente operazione sarà disponibile.
3.4 Pipeline Interi e Floating Point

Figura
2 Pipeline per operazioni su dati interi
La
Integer Unit del Athlon si compone di 3 Integer Execution Unit
(IEU) (che si occupano delle usuali operazioni arimetico-logiche,
di risoluzione branch, ect) e di 3 Address Generation Unit (AGU)
(che eseguono le addizioni necessarie al calcolo degli spiazzamenti
degli indirizzi per le operazioni di load e store).
Lo
scheduler degli interi è in pratica una reservation station
dotata di coda profonda 3 posizioni (in cui allocare le 3 MOPs
che escono dalla ICU) per 6 ingressi che consente di immagazzinare,
per l’esecuzione out-of-order, fino a 18 MOP. Essa scompone,
nello stadio di pipeline che gli compete, le MOPs in OPs (generalmente
una OP diciamo di ALU e una OP di Load/Store), fino a 6 per
ciclo (3 di IEU e 3 di AGU), che sono eseguibili indipendentemente
dalle IEU e AGU non appena sono disponibili gli operandi dal
bus risultati o dal register file.
Tutte
le OPs sono eseguite in un ciclo eccetto le moltiplicazioni
e divisioni che sono eseguite da due delle IEU che condividono
un moltiplicatore (IEU0 e IEU1) e richiedono più iterazioni.
Se è necessario accedere ai dati necessari al completamento
delle operazioni si passa allo stadio Addr (stadio 9) dove viene
calcolato l’indirizzo della OP di Load/Store e inviato alla
cache dati. Nel successivo stadio DC (stadio 10) avviene l’accesso
alla cache e le OP che attendevano di essere eseguite nello
scheduler possono essere completate se tutti gli altri operandi
sono disponibili.

Figura
3 Pipeline per operazioni su dati floating point
La
pipeline per FP prevede un primo stadio di Stack
Renaming durante il quale le 3 MOP che giungono dalla
ICU sono assorbite e viene rinominato lo stack Floating Point
su un uno spazio di indirizzi più ampio. In pratica, a causa
del fatto che la unità FPU esegue sia le istruzioni x87 che
3DNow!/MMX condividendo i classici 8 registri a 64 bit sullo
stack Floating Point tipici delle architetture x86, tramite
questo meccanismo gli stack 3DNow!/MMX e x87 vengono resi visibili
a seconda del contesto di esecuzione rendendoli "indipendenti".
Il
secondo stadio effettua invece la classica ridenominazione dei
registri (con ben 88 registri rinominabili) per evitare le false
dipendenze. Nei due stadi successivi all’interno dello scheduler
avviene la ricezione e lo scheduling delle 3 MOPs grazie allo
scheduler a 36 ingressi.
Questa
fase risulta più complicata che per gli interi a causa del fatto
che le unità esecutive non sono simmetriche e hanno differenti
latenze ecco il perché della maggiore profondità dello scheduler
rispetto allo scheduler per interi. Nello stadio successivo
avviene la lettura del Floating Point Register file a 88 ingressi
per determinare gli operandi e le 3 OPs sono inviate alle unità
esecutive. Esse sono:
|
Unità
|
Compiti
|
|
FMUL
|
Caricamento
dei numeri in virgola mobile; moltiplicazione tra numeri
in virgola mobile; esecuzione di complesse operazioni
in virgola mobile; calcoli MMX e 3DNow! |
|
FADD
|
Caricamento
dei numeri in virgola mobile; somme tra numeri in virgola
mobile; esecuzione di complesse operazioni in virgola
mobile; calcoli MMX e 3DNow! |
|
FSTORE
|
Memorizza
numeri in virgola mobile e MMX; esegue altre operazioni
complesse. |
Ogni
unità è pienamente pipelined e può assumere una OP per ciclo
la cui esecuzione richiederà un massimo di 4 stadi aggiuntivi
portando la pipeline FP dell’Athlon a 15 stadi. L’unità FMUL
gestisce le operazioni più complesse ma viene raramente saturata
e in media ogni 1-3 cicli può assumere una nuova istruzione.
Le
latenze maggiori sono a carico delle moltiplicazioni e delle
divisioni FP e 3DNow! e pari a 4 cicli contro i 6 delle moltiplicazioni
SSE (ricordiamo che la unità FPMUL del Pentium III non è pienamente
pipelined) e la latenza minima è pari a 2 cicli per la somma
MMX (contro il solo ciclo del Penitum III). L’impiego dell’unità
Fstore è di concezione nuova nel panorama x86 e oltre a dedicarsi
alle operazioni di load e store per FP e MMX è usata per alcune
primitive per il calcolo di funzioni complesse come divisioni
e trascendentali.
L’unità
FPU consente effettivamente notevoli prestazioni nell’ambito
del calcolo FP raggiungendo un picco di 2.4 Gflops a singola
precisione (32 byte) e 1 Gflop a doppia precisione alla frequenza
di 600 MHz.