Il pipelining in un calcolatore elettronico e i suoi vantaggi

Il pipelining in un calcolatore elettronico e i suoi vantaggi

Il pipelining è una tecnica informatica di realizzazione dei processori, in cui le esecuzioni di più istruzioni vengono parzialmente sovrapposte nel tempo. Al giorno d’oggi, si tratta della tecnica più utilizzata per la realizzazione delle CPU  veloci: essa è nata quando, fin dagli anni ’70, i progettisti di CPU (Central Processing Unit) si posero il problema di modificare l’architettura delle unità di elaborazione in modo da migliorarne le prestazioni al di là di quanto si potesse fare in termini puramente tecnologici. In altre parole, il pipelining è una tecnica di realizzazione dei processori che sfrutta il parallelismo esistente tra le istruzioni di un flusso di esecuzione sequenziale, ossia la possibilità di eseguirle contemporaneamente (almeno parzialmente) anziché una dopo l’altra nel classico modo sequenziale. Si tratta di un meccanismo importante in quanto è trasparente al programmatore, al contrario invece di altre tecniche di accelerazione che, per essere sfruttate, devono necessariamente essere previste dal programmatore al momento della scrittura dei propri programmi.

Il pipelining in un calcolatore elettronico e i suoi vantaggi

Possiamo dunque pensare ad una pipeline come ad una catena di montaggio: ogni avanzamento lungo la pipeline completa una parte del ciclo di esecuzione di una istruzione. Il lavoro che l’istruzione deve compiere viene suddiviso in compiti più semplici, ognuno dei quali richiede solo una frazione del tempo totale necessario per completare l’intera istruzione: ogni compito è detto stadio di pipeline (o semplicemente stadio o anche segmento di pipeline). I vari stadi di pipeline sono collegati in successione per formare una catena: le istruzioni “entrano” da un  estremo di tale catena, vengono elaborate dalla catena ed “escono” dall’altro estremo. L’ “ingresso” di una istruzione nella pipeline corrisponde evidentemente all’avvio dell’esecuzione di quella istruzione, mentre invece l’ “uscita” di una istruzione dalla pipeline corrisponde al completamento dell’esecuzione di quella istruzione.

La velocità di operazione di una pipeline è determinata dalla frequenza con cui le istruzioni “escono” dalla pipeline stessa, ossia quindi dalla frequenza con cui le istruzioni vengono eseguite (parametro ben diverso dalla velocità con cui viene eseguita la singola istruzione).

Dato che gli stadi della pipeline sono rigidamente collegati in successione, devono operare tutti i modo sincrono. Il tempo richiesto per fare avanzare una istruzione lungo la pipeline è il cosiddetto ciclo macchina. La durata del ciclo macchina è determinata dal tempo richiesto dallo stadio più lento della pipeline, proprio perché gli stadi devono necessariamente avanzare tutti nel medesimo istante, per cui i più “veloci” devono aspettare il più “lento”: ad esempio, se uno stadio richiede 5 ns ma si sta svolgendo in contemporanea uno stadio che richiede 10 ns, il primo dovrà aspettare il completamento del secondo, in modo che possa avvenire contemporaneamente la transizione per entrambi allo stadio  successivo.

Spesso, il ciclo macchina coincide con il ciclo di clock, ma talvolta esso può durare anche due cicli di clock o addirittura tre cicli di clock.

Uno degli obbiettivi del progetto di una pipeline consiste nel bilanciamento della “dimensione” degli stadi della pipeline. Nel caso in cui gli stadi sono perfettamente bilanciati, allora si può facilmente calcolare l’intervallo di tempo tra due istruzioni (inteso come differenza tra l’istante in cui viene completata l’esecuzione di una istruzione e quello in cui viene completata l’esecuzione dell’istruzione successiva) in condizioni ideali, ossia senza i cosiddetti stalli (di cui parleremo più avanti): il suddetto intervallo è pari a:

Tempo per istruzione su una macchina senza pipeline / Numero degli stadi di pipeline

In base a questa formula, si può intuire (ma lo vedremo in modo rigoroso più  avanti) che l’accelerazione dovuta al pipelining è pari al numero di stadi della pipeline (in condizioni ideali). In realtà, le condizioni ideali di cui parlavamo non sono quasi mai realizzate, sia perché solitamente gli stadi non sono bilanciati in  modo perfetto sia anche perché l’introduzione del pipelining comporta comunque qualche costo aggiuntivo (che esamineremo più avanti). Di conseguenza, l’intervallo  di tempo tra due istruzioni, su una macchina dotata di  pipelining, non raggiunge  mai il valore minimo teorico dato dalla formula di prima, anche se può avvicinarsi abbastanza ad esso (ad esempio, entro circa il  10%).

In generale, l’effetto più evidente del pipelining è quello di determinare una riduzione del tempo medio di esecuzione per istruzione, dove l’aggettivo “medio” serve a specificare che non ci si riferisce alla latenza delle istruzioni prese singolarmente, ma al tempo complessivo speso per l’esecuzione di tutte le istruzioni diviso per il numero di istruzioni eseguite. Questo importante risultato si può ottenere in tre modi:

  1. quello più evidente consiste nel diminuire il tempo del ciclo di clock della macchina dotata di pipelining;
  2. in alternativa, si può ridurre il numero di cicli di clock per istruzione  (CPI);
  3. si possono anche adottare entrambe le soluzioni precedenti (soluzioni 1 e 2 assieme)

Solitamente, i risultati migliori si ottengono con la riduzione del CPI, anche se il tempo del ciclo di clock risulta quasi sempre inferiore nelle macchine dotate di pipelining (specialmente nei supercalcolatori). In ogni caso, vedremo che la durata del periodo di clock non può essere ridotta arbitrariamente, per via di una serie di vincoli legati alla tecnologia di realizzazione del processore.

 

Precedente Programmi per valutare le prestazioni di un computer Successivo Il principio di località e la gerarchia di memorie in informatica

Lascia un commento

*