Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
OTTIMIZZAZIONE DELLA PIPELINE:
Come visto le dipendenze dai dati e dai branch riducono le prestazioni di esecuzione. Si usano
delle tecniche organizzative per compensare questo.
Delayed branch
Delayed load: usati nei LOAD instructions. Il registro target della load è bloccato dal processore,
che continua l’esecuzione dello stream attuale no a che raggiunge un istruzione che richiede
quel registro, quindi si ferma ad aspettare il completamento della load.
Loop unrolling: assegnare un unrolling Factor agli elementi replicati nel body di un loop. 20 of 28
fi fi fi fi fi
Instruction-level Parallelism and Superscalar processors - 18
Superscalare
Architettura in cui tutte le tipologie di istruzioni possono essere iniziate simultaneamente e poi
eseguite in modo indipendente. La possibilità di eseguire istruzioni indipendente in diverse
pipeline. È possibile permettere l’esecuzione delle istruzioni in un ordine diverso da quello indicato
dal programma.
Nello scalare normale: il parallelismo è ottenuto permettendo istruzioni multiple di essere in diversi
stage della pipeline allo stesso momento.
Superscalare: ci sono più unità funzionali, ognuna delle quali è a sua volta implementata
come una pipeline. Stream di istruzioni possono essere eseguiti in parallelo, uno per ciascuna
pipeline.
Superscalare vs Superpipelined
Superpipelined: suddivide la pipeline in un numero maggiore di stages per usare Clock a più alta
frequenza. C’è sempre una sola pipeline, ma in questo modo miglioriamo il parallelismo
temporale, perchè lavora su più istruzioni allo stesso tempo.
-> ciascuno stage esegue le sue istruzioni in sequenza, le esecuzioni nel
(Superpipeline
complesso di tutti gli stage sembrano in parallelo
Superscalare -> ciascuno stage ha a sua volta più pipeline, eseguono istruzioni in parallelo)
(Esempio slide)
Pipeline normale: invia un’istruzione per Clock cycle ed esegue un pipeline stage ogni clock cycle.
Solo un’istruzione alla volta occupa uno stage, anche se sono più esecuzioni concorrenziali.
Superpipeline: eseguire due stage per clock cycle. Le funzioni eseguite in ciascuno stage può
essere divisa in due parti che non si sovrappongono e ciascuna può essere eseguita in mezzo
ciclo di Clock -> pipeline di grado 2.
Superscalare: eseguire due istanze nello stesso stage in parallelo
LIMITAZIONI SUPERSCALARE:
true data dependency (o RAW dependency o ow dependency):
Sulla seconda istruzione si può esseguire il fetch e il decode ma non l’execute no a che sia la
prima ad essere eseguita. Perchè la seconda ha bisogno dei dati prodotti dalla prima.
Con itto di risorse: più istruzioni richiedono la stessa risorsa allo stesso momento
Procedural dependency: presenza di un branch, l’istruzione successiva a un branch non può
essere eseguita in parallelo con questo
Senza dipendenze tra due istruzioni, si può eseguire un fetch in parallelo senza problemi. Se ci
sono data dependencies tra le due, la seconda è ritardata per un numero di Clock necessari a
rimuovere la dipendenza. (Tutte le istruzioni possono ricevere un Delay in attesa di ottenere tutti gli
input necessari)
Istruction issue policy
Politica di spostamento di un’istruzione da una fase a quella successiva.
- rilascio in-order: distribuire le istruzioni nello stesso ordine di come sarebbe se eseguite in
sequenza
- Completamento in-order: scrivere anche i risultati nello stesso ordine
Es: se una funzione richiede più Clock cycle per eseguire un’unità funzionale (es: decode) e
generare un risultato, il rilascio di ulteriori istruzioni va temporaneamente in stallo.
In-order issue con out-of-order completion 21 of 28
fl fl fi
Usato nei RISC. Qualunque numero di istruzione può essere nel ciclo di esecuzione allo stesso
momento, no al massimo grado di parallelismo concesso. Il processore decodi ca istruzioni no
al punto di dipendenza o con itto, e nient’altro è eseguito no alla risoluzione di questo.
Nuova dipendenza: output dependency (WAW)
Out-of-order issue con out-of-order completion
Disaccoppiare la fase di decode da quella di execute, aggiungendo un bu er chiamato instruction
window. Dopo la decodi ca l’istruzione è messa qui dentro, no a che il bu er non è pieno, il
processore continua ad eseguire fetch e decode delle istruzioni.
Quando nello stage di esecuzione si libera un’unità funzionale, un’istruzione dall’instruction
window può essere inviata all’execute stage.
Il processore ha così una capacità di previsione, trovando e mandando in esecuzione solo quelle
istruzioni indipendenti.
Genera antidependency (WAR) (o output dependency)
Che peggiora con le tecniche di ottimizzazione che aumentano l’utilizzo dei registri, causando
maggiori con itti nella richiesta di risorse.
Register renaming
Questo può essere risolto con il cioè i registri sono allocati dinamicamente
dal processore e associati ai valori utili alle istruzioni in diversi momenti. Quando un nuovo valore
di registro è creato, un nuovo registro viene allocato per quel valore 22 of 28
fi fl fi fl fi fi ff ff fi fi
CU operation and microprogrammed control - 19
Micro-operations
L’esecuzione di un programma consiste nella sequenza di cicli di istruzioni con un’istruzione
macchina per ciclo. La sequenza di istruzioni non sempre segue quella indicata dal programma a
causa della presenza di possibili istruzioni di branch.
Ogni ciclo di istruzioni è composto da unità più piccole:
- Fetch
- Indirect
- Execute
- Interrupt
(Con I ciccli di fetch e execute che sono quelli sempre presenti)
Ogni ciclo più piccolo poi include degli steps che coinvolgono i registri del processore -> micro-
operazioni.
Fetch cycle
All’inizio di ogni instruction cycle, per fare il fetch dell’istruzione dalla memoria.
Coinvolge 4 registri:
- MAR: connesso alle address lines del system bus, speci ca l’indirizzo in memoria per una
lettura o scrittura
- MBR: connesso alle data Lines del system bus, contiene il valore da salvare in memoria o
l’ultimo valore letto dalla memoria
- PC: contiene l’indirizzo dell’istruzione per la successiva fetch
- IR: contiene l’istruzione dell’ultimo fetch
1. Indirizzo passato da PC a MAR (unico registro connesso alle Address Lines del system bus)
MAR <- PC
2. MAR invia l’indirizzo nell’address bus
3. CU invia un READ Command sul control bus
4. Il risultato ritornato nel data bus è copiato nel MBR - PC incrementato (usa ALU) [queste due
istruzioni non interferiscono l’una con l’altra quindi sono eseguite insieme]
MBR <- Memory ;
PC <- PC+1
5. Spostare il contenuto dall’MBR all’IR (così l’MBR si libera per un possibile indirect cycle)
IR <- MBR
Tutte le micro operazioni (sono 4, nei punti 1,4,5) sono di input/output di dati nei registri, quindi se
questi movimenti non interferiscono a vicenda possono essere eseguiti in simultanea per
risparmiare tempo.
Indirect cycle
Dopo il fetch dell’istruzione bisogna recuperare anche gli operandi. Se l’istruzione speci ca un
indirect Address allora si esegue un indirect cycle prima dell’execute.
Micro operazioni:
T1: MAR <- IR - address eld of IR
address
T2: MBR <- memory
T3: IR <- MBR
address address
Quindi
- MBR contiene un indirizzo
- IR è nello stesso stato nel caso in cui si fosse usato il Direct addressing
Si può eseguire quindi l’execute
Interrupt cycle
Dopo l’execute cycle si esegue un test per vedere se sono stati chiamati degli interrupt. Se così
allora avvia il ciclo: 23 of 28
fi fi fi
- t1: MBR <- PC così il contenuto può essere salvato in memoria per poi essere ripreso al
return dell’interrupt
- t2: MAR <- save-address indirizzo dove il contenuto del PC deve essere salvato
PC <- routine-address indirizzo dell’inizio dell’interrupt-processing routine
- t3: memory <- MBR
N.B. il salvataggio del context dall’interrupt-handler routine (non dalle micro operazioni)
Instruction cycle
In ogni instruction cycle, per l’execute ci sono cicli di micro operazioni per ogni opcode, per tutti
gli altri c’è solo un ciclo di micro operazioni.
Instruction cycle code ICC : dice in che punto del ciclo è il processore:
- 00 : fetch
- 01: indirect
- 10: execute
- 11: interrupt
È settato alla ne di ciascuno di questi cicli
Controllo del processore
Step per la caratterizzazione della CU:
1. De nire gli elementi base del processore
2. De nire micro operazioni che può eseguire
3. Determinare le funzioni che la CU deve eseguire per innescare l’esecuzione delle micro
operazioni
Elementi funzionali di base di un processore
- ALU
- Registri:
salvare dati internamente al processore. Alcuni registri contengono info sullo stato utili a
gestire la sequenza di operazioni.
Altri contengono dati che vanno o provengono dall’ALU, dalla memoria e dai moduli I/O
- Internal data paths:
sono usati per passare i dati tra registri o tra i registri e l’ALU
- External data paths:
servono per collegare I registri alla memoria e moduli I/O, spesso usando il system bus
- CU: permette l’esecuzione delle operazioni nel processore
Funzioni della CU
2 task di base:
- Sequencing: fa in modo che il processore esegua una serie di micro operazioni nella corretta
sequenza, in base al programma eseguito
- Execution: la CU permette l’esecuzione di ciascuna micro operazione
Opera usando i segnali di controllo.
Input nella CU
- Clock
- IR: l’indirizzo dell’istruzione corrente serve a capire quale micro operazione far eseguire durante
l’execute cycle
- Flags: usate per determinare lo stato del processore
- Control signals dal control bus
Output dalla CU
- Segnali di controllo interni al processore (che fanno muovere dati tra registri o che attivano delle
funzioni nell’ALU)
- Control signals al control bus (verso la memoria o verso I/O devices)
Es: segnale di controllo che apre i Gate per permettere al MAR di inserire l’indirizzo nell’address
bus 24 of 28
fi
fi fi
Es: invio di un memory read nel control bus
Es: segnale di controllo che apre i Gate per permettere all’MBR di prendere i dati dal data bus
Es: segnale di controllo alla logica (nell’ALU) che aggiunge 1 al PC e salva il risultato nel PC
Organizzazione interna del processore
CU controlla i percorsi dei dati,
Data paths: la ognuno dei quali ha uno switch, un segnale dalla
CU li apre temporaneamente facendo passare i dati.