Pipeline (CPU): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Etichette: Rimozione di avvisi di servizio Modifica visuale
m Annullate le modifiche di 46.255.86.244 (discussione), riportata alla versione precedente di Pil56
Riga 1:
[[File:Nopipeline.png|thumb|upright=1.5|Esecuzione delle istruzioni in un microprocessore senza pipeline]]
In [[Informatica]] la '''pipeline dati''' è una tecnologia utilizzata nell'architettura [[hardware]] dei [[microprocessore|microprocessori]] dei [[computer]] per incrementare il [[throughput]], ovvero la quantità di [[istruzione_(informatica)|istruzioni]] eseguite in una data quantità di tempo, [[calcolo parallelo|parallelizzando]] i flussi di [[Elaborazione dati|elaborazione]] di più istruzioni.
 
==Descrizione==
L'elaborazione di un'istruzione da parte di un processore si compone di cinque passaggi fondamentali:
# '''IF''' (''Instruction Fetch''): Lettura dell'istruzione da [[memoria (informatica)|memoria]];
# '''ID''' (''Instruction Decode''): Decodifica istruzione e lettura operandi da [[registro (informatica)|registri]];
# '''EX''' (''Execution''): [[Esecuzione (informatica)|Esecuzione]] dell'istruzione;
# '''MEM''' (''Memory''): Attivazione della memoria (solo per certe istruzioni);
# '''WB''' (''Write Back''): Scrittura del risultato nel registro opportuno;
Praticamente ogni CPU in commercio è gestita da un [[clock]] centrale e ogni operazione elementare richiede almeno un ciclo di clock per poter essere eseguita. Le prime CPU erano formate da un'unità polifunzionale che svolgeva in rigida sequenza tutti e cinque i passaggi legati all'elaborazione delle istruzioni. Una CPU classica richiedeva quindi almeno cinque cicli di clock per eseguire una singola istruzione.
 
Con il progresso della tecnologia si è potuto integrare un numero maggiore di [[transistor]] in un microprocessore e quindi si sono potute [[calcolo parallelo|parallelizzare]] alcune operazioni riducendo i tempi di esecuzione. La pipeline dati rappresenta la massima parallelizzazione del lavoro di un microprocessore.
[[File:Fivestagespipeline.png|thumb|upright=1.2|Esecuzione delle istruzioni in un microprocessore con pipeline]]
Una CPU con pipeline è composta da cinque stadi specializzati, capaci di eseguire ciascuno una operazione elementare di quelle sopra descritte. La CPU lavora come in una catena di montaggio cioè ad ogni stadio provvede a svolgere in maniera sequenziale un solo compito specifico per l'elaborazione di una certa istruzione. Quando la catena è a regime, ad ogni ciclo di clock dall'ultimo stadio esce un'istruzione completata. Nello stesso istante ogni unità sta però elaborando in parallelo i diversi stadi di successive altre istruzioni. In sostanza quindi si guadagna una maggior velocità di esecuzione a prezzo di una maggior complessità circuitale del microprocessore, che non deve essere più composto da una sola unità, ma da cinque unità che devono collaborare tra loro.
 
== Storia ==
Il concetto di pipeline venne sviluppato dal ricercatore [[Robert Tomasulo]] dell'[[IBM]], il primo sistema dotato di pipeline fu il [[supercomputer]] IBM [[IBM System/360|System 360/91]] presentato nel [[1966]] che grazie alla pipeline otteneva un incremento anche del 33% delle prestazioni. La pipeline si diffuse rapidamente nei supercomputer e nei server. Il primo [[microprocessore]] a utilizzare una pipeline fu il [[MOS Technology 6502]] che tramite una semplice pipeline forniva prestazioni superiori a quelli della concorrenza a una frazione del loro costo. Nel settore di microprocessori le pipeline divennero comuni con i processori [[Reduced instruction set computer|RISC]] che data la loro semplicità consentì di implementare un'architettura a pipeline completa fin dalle loro prime implementazioni negli anni ottanta. I progetti [[Berkeley RISC]] e [[Architettura MIPS|MIPS]] infatti avevano già una pipeline. I processori [[Complex instruction set computer|CISC]] utilizzarono un'architettura a pipeline completa solamente alla fine degli anni 80 per via delle maggiori difficoltà di implementazione. Attualmente tutti i microprocessori utilizzano una struttura a pipeline per migliorare le loro prestazioni.
 
== Problematiche ==
L'implementazione di una pipeline non sempre moltiplica il throughput finale. L'analisi delle problematiche legate alla gestione delle pipeline per ottenere le migliori prestazioni teoriche ricadono sotto la ricerca del [[instruction level parallelism]], il parallelismo a livello d'istruzione, cioè le istruzioni che possono essere eseguite in parallelo senza creare conflitti o errori di esecuzione. Comunque le singole pipeline affrontano due problemi principalmente;
il problema legato alla presenza di istruzioni che possono richiedere l'utilizzo di risorse (dati o registri) non ancora disponibili e il problema legato alla presenza di salti condizionati.
*Il primo problema deriva dal lavoro parallelo delle unità.
Supponiamo che la CPU con pipeline debba eseguire il seguente frammento di codice:
# C=A+B
# D=C-1
La prima istruzione deve prelevare i numeri contenuti nelle variabili A e B, sommarli e porli nella variabile C. La seconda istruzione deve prelevare il valore contenuto nella variabile C, sottrarlo di uno e salvare il risultato in D. Ma la seconda istruzione non potrà essere elaborata (EX) fino a quando il dato della prima operazione non sarà disponibile in memoria (MEM) e quindi la seconda operazione dovrà bloccarsi per attendere il completamento della prima e quindi questo ridurrà il throughput complessivo. Questo problema può essere attenuato facendo in modo che i dati elaborati dalla prima istruzione siano resi disponibile alla seconda istruzione prima del solo salvataggio definitivo in memoria. Questo si ottiene inserendo dei registri temporanei nell'unità di esecuzione dove salvare dati che serviranno all'istruzione successiva. Un problema simile è quando due istruzioni utilizzano gli stessi registri per operare. In questo si utilizza la [[rinominazione dei registri]], una tecnica che elimina la maggior parte degli stalli.
*Il secondo problema consiste nei salti condizionati.
I programmi contengono delle istruzioni condizionate che se una specifica condizione logica è verificata provvedono a interrompere il flusso sequenziale del programma e a mandare in esecuzione un altro pezzo di programma indicato dall'istruzione di [[salto (informatica)|salto]]. Ogni volta che questo accade il microprocessore si trova a dover eseguire un nuovo flusso di operazioni e quindi deve svuotare la pipeline del precedente flusso e caricare il nuovo flusso. Ovviamente queste operazioni fanno sprecare cicli di clock e quindi deprimono il throughput. Per ridurre questo problema le CPU adottano delle unità chiamate [[Predizione delle diramazioni|unità di predizione delle diramazioni]] (in inglese ''Branch Prediction Unit'') che fanno delle [[Esecuzione speculativa|previsioni sul flusso del programma]]. Queste unità riducono notevolmente i cicli persi per i salti.
 
== Evoluzioni ==
[[File:Superscalarpipeline.png|thumb|upright=1.2|CPU superscalare a doppia Pipeline]]
Per realizzare CPU con prestazioni migliori col tempo si è affermata la strategia di integrare in un unico microprocessore più pipeline che funzionano in parallelo. Questi microprocessori sono definiti [[Microprocessore superscalare|superscalari]] dato che sono in grado di eseguire mediamente più di un'operazione per ciclo di clock. Queste pipeline ovviamente rendono ancora più complessa la gestione dei problemi di coerenza e dei salti condizionati. Nelle CPU moderne inoltre le pipeline non sono composte da soli cinque stadi ma in realtà ne utilizzano molti di più (il [[Pentium 4]] ne utilizza da 20 fino a 30).
Questo si è reso necessario per potere innalzare la frequenza di clock. Spezzettando le singole operazioni necessarie per completare un'istruzione in tante sotto operazioni si può elevare la frequenza della CPU dato che ogni unità deve svolgere un'operazione più semplice e quindi può impiegare meno tempo per completare la sua operazione. Questa scelta di progettazione consente effettivamente di aumentare la frequenza di funzionamento delle CPU, ma rende critico il problema dei salti condizionati. In caso di un salto condizionato non previsto il Pentium 4 per esempio può essere costretto a svuotare e ricaricare una pipeline di 30 stadi perdendo fino a 30 cicli di clock contro una classica CPU a pipeline a 5 stadi che avrebbe sprecato nella peggiore delle ipotesi 5 cicli di clock.
 
La sempre maggior richiesta di potenza di calcolo ha spinto le industrie produttrici di microprocessori a integrare in un unico [[Circuito integrato|chip]] più microprocessori (architetture a [[multiprocessore]]). Questo strategia consente al [[computer]] di avere due CPU separate dal punto di vista logico, ma fisicamente risiedenti nello stesso chip. Questa strategia progettuale attenua i problemi di coerenza e di predizione dei salti. Infatti ogni CPU logica esegue un programma separato e quindi tra i diversi programmi non si possono avere problemi di coerenza tra le istruzioni. Questa scelta progettuale aumenta le prestazioni solo nel caso in cui il [[sistema operativo]] sia in grado di utilizzare più programmi contemporaneamente e i programmi siano scritti per poter utilizzare tutte le CPU disponibili, cioè se i programmi sono [[calcolo parallelo|parallelizzabili]].
 
== Voci correlate ==
*[[Dual-core]]
*[[Cell (processore)]]
*[[VLIW]]
*[[Microprocessore superscalare]]
 
== Altri progetti ==
{{interprogetto|commons=Pipeline (computer)}}
 
== Collegamenti esterni ==
* [http://www.appuntidigitali.it/3956/pipeline-la-catena-di-montaggio-informatica/ Articolo sulle pipeline]
{{Portale|informatica}}
 
[[Categoria:Instruction Processing]]