Personal computer: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Pizeta (discussione | contributi)
Pizeta (discussione | contributi)
Riga 1 099:
 
== DLX in Pipeline ==
 
Nei paragrafi precedenti abbiamo visto come le istruzioni DLX siano tutti divisibili in cinque blocchi funzionali:
 
* '''IF''': prelievo dell'istruzione,
* '''ID''': decodifica dell'istruzione,
* '''EX''': esecuzione e calcolo dell'indirizzo,
* '''MEM''': accesso alla memoria,
* '''WB''': scrittura del risultato.
 
Assegnando le cinque operazioni a blocchi distinti, è possibile svolgere più istruzioni contemporneamente:
 
Clock 1 2 3 4 5 6 7 8 9
''Istruzione i'' IF ID EX MEM WB
''Istruzione i+1'' IF ID EX MEM WB
''Istruzione i+2'' IF ID EX MEM WB
''Istruzione i+3'' IF ID EX MEM WB
''Istruzione i+4'' IF ID EX MEM WB
 
questo comporta, con pipeline piena, la scrittura del risultato di un'operazione ad ogni ciclo di clock, ovvero un CPI ideale di '''1''', nonostante il tempo per eseguire un'operazione ( ''latenza'' ) resti invariato .
 
Il CPI reale della pipeline dipende da più fattori, primo fra tutti l'effettiva durata del clock, se tra gli stadi di pipeline bisogna aggiungere degli elementi di memoria il tempo di un ciclo di clock aumenta di un fattore pari alla somma tra il ''setup time'' (tempo per memorizzare il valore) e il ''delay time'' (ritardo di propagazione).
Ben più influente è la necessità di bilanciare la pipeline, se infatti lo stadio di MEM richiede più cicli di clock, è necessario che tutti gli stadi della pipeline abbiano la durata massima per consentirne l'esecuzione.
 
Sono quindi determinanti gli elementi di memoria, per questo motivo si utilizzano le memorie cache, ovvero memorie entegrate nella CPU con tempi di accesso della durata di un clock.
 
Ovviamente la pipeline è possibile soltanto se la sovrapposizione delle istruzioni non sovraccarichi le risorse, è ad esempio impossibile richiedere alla ALU di eseguire un'operazione qualsiasi mentre un'altra istruzione vuole calcolare un indirizzo effettivo (incremento del program counter), vanno quindi apportate alcune modifiche al normale funzionamento della CPU sequenziale:
 
# Il PC deve essere incrementato durante la fase di IF con un incrementatore addizionale per lasciare libera la ALU allo stadio di EX
# Ad ogni ciclo di clock deve essere prelevata una nuova istruzione (stadio IF)
# Sono necessari due MDR (Registro di accesso alla memoria) per gestire il caso di una LOAD seguita da una STORE, i due registri verranno indicati con '''MDR''' e '''SMDR''' (Store MDR)
# In ogni ciclo di clock vanno eseguiti due accessi alla memoria, IF e MEM, per cui sono necessarie due cache separate per dati ed istruzioni
# Occorrono elementi di memoria per conservare i valori da usare negli stadi successivi della pipeline, ma che possono essere modificati dall'istruzione successiva, ovvero l'istruzione, il risultato ALU il prossimo valore del PC.
 
Nonostante questi accorgimenti, una pipeline così costruita funzionerebbe bene se le istruzioni fossero tutte tra di loro indipendenti, qualora non lo fossero si verificherebbero delle '''alee''' o '''conflitti''' (in inglese ''Hazard''), che possono essere di tre tipi:
 
=== Conflitti strutturali ===
 
=== Conflitti tra dati ===
 
=== Conflitti di controllo ===
 
= 8086 =