View Single Post
Old 01-01-2006, 14:21   #14
MaxArt
Senior Member
 
L'Avatar di MaxArt
 
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6602
Altre tre rispostine! Che ne pensate?

1.8 Cos'è una pipeline?

Una pipeline si può efficacemente immaginare come una catena di montaggio, attraverso la quale le istruzioni vengono processate per essere eseguite. Ogni istruzione, cioè, viene scomposta in operazioni più semplici, eseguibili dai vari stadii della pipeline, e dunque percorre tutta la "catena di montaggio" fino alla sua completa esecuzione. Il vantaggio di tutto ciò è che una volta che un'istruzione abbandona uno stadio della pipeline, tale stadio può occuparsi dell'istruzione successiva, la quale dunque verrà completata dopo la precedente in un tempo sensibilmente inferiore a quello della sua completa esecuzione.

Supponiamo ad esempio di avere due istruzioni, ognuna delle quali necessita di 6 cicli di clock per essere completata, ed una pipeline a tre stadii. Ognuna delle istruzioni può essere scomposta quindi in tre parti, che supponiamo necessitare 2 cicli di clock ciascuna. Inizialmente, dunque, la prima istruzione passa per il primo stadio; dopo due cicli di clock, arriva nel secondo, e la seconda istruzione è nel primo stadio. Dopo sei cicli, la prima istruzione ha finito, mentre la seconda è al terzo stadio. Dopo altri due cicli, anche la seconda istruzione è eseguita completamente. In totale, sono stati necessari solo 8 cicli di clock per completare due istruzioni da 6 cicli ciascuna.



1.8.1 Cosa influenza la lunghezza della pipeline?

Generalmente, una pipeline più lunga consente di scindere in parti più piccole un'istruzione e dunque di occupare meglio le risorse della CPU, oltre che a consentire di raggiungere frequenze di funzionamento più elevate per il processore.

D'altro canto, questa è solo una situazione ideale: in realtà, non tutte le operazioni sono indipendenti le une dalle altre. Può capitare, ad esempio, che un'istruzione necessiti del risultato che viene fornito dall'istruzione precedente per poter essere eseguita, come nel semplice caso:

A = C - 7
B = A + 2

La seconda istruzione, dunque, deve prima attendere che termini la prima istruzione, in quanto gli è necessario conoscere il valore della variabile A prima di poter essere eseguita. (Qualcuno potrebbe obiettare che la situazione si può facilmente risolvere scrivendo B = C - 5 al posto della seconda istruzione: è chiaramente compito di un buon programmatore accorgersi di questi particolari.)
unque, è possibile che nonostante tutto la pipeline debba terminare certe istruzioni prima di affrontarne altre da principio, e dunque che alcuni cicli di clock vengano sprecati. Come si può intuire, tanto più è lunga una pipeline, tanto più alta è la percentuale di cicli di clock che vengono sprecati. Trovare un buon bilanciamento tra frequenza del processore e sua efficienza operativa è alla base del progetto di ogni buona CPU.

Al giorni d'oggi, i processori in commercio hanno lunghezze della pipeline anche piuttosto differenti (i processori Intel Pentium 4 core Prescott hanno una pipeline a 31 stadii, gli AMD Athlon 64 a 12, per le istruzioni intere). In base al discorso in precedenza, non ci si stancherà mai di ripetere che la frequenza di un processore non è tutto! Cioè, non può considerarsi un parametro unico delle prestazioni di un processore: può esserlo solo a parità di architettura.



1.13 Cos'è l'In-Order/Out-of-Order Execution (IOE/OOE)?

Si tratta di tecniche adottate dai processori con pipeline a più stadii per l'esecuzione delle istruzioni.

L'IOE consiste nell'esecuzione delle istruzioni esattamente nell'ordine in cui compaiono nel programma: è chiaramente il metodo più semplice per eseguire i compiti.

Tuttavia, come già detto in precedenza (vedasi domanda 1.8.1: "Cosa influenza la lunghezza della pipeline?"), non tutte le istruzioni sono indipendenti le une dalle altre, per cui il sistema IOE risulta poco efficiente, in quanto può capitare che blocchi la pipeline fino alla completa esecuzione delle istruzioni precedenti, da cui dipendono le successive.

Con l'OOE s'intende quindi una tecnica per cui il processore si avvede delle istruzioni che risultano tra di loro indipendenti, e se necessario le esegue prima delle precedenti per rendere più efficiente l'esecuzione del programma. Ad esempio, supponiamo di avere le seguenti istruzioni:

A = C * 2
B = A + 15
D = E - 2

Nel caso di una IOE, il processore deve terminare di eseguire la prima istruzione prima di poter eseguire la seconda, e ciò sprecherebbe cicli di clock lasciando vuoti gli stadii della pipeline. Con una OOE, invece, si ha che la terza istruzione, essendo indipendente dalla prima, può essere eseguita prima della seconda istruzione, riempiendo così il buco nella pipeline lasciato dalla dipendenza della seconda istruzione dalla prima. In questo modo, l'esecuzione del programma risulta più efficiente.

Implementare un algoritmo di OOE in una CPU può essere complicato e richiedere una notevole quantità di transistor. Tuttavia, è un punto fondamentale per l'efficienza dei processori cosiddetti "general purpose", quali sono i processori dei comuni personal computer. Certi processori più specificamente orientati verso determinati compiti, invece, potrebbero presentare ancora esecuzioni in ordine delle istruzioni: è il caso, ad esempio, delle SPE del venturo processore Cell di IBM. In tal caso, parte dell'ottimizzazione dovrebbe essere svolta da un compilatore appositamente sviluppato per quella determinata architettura.
__________________
HWU Rugby Group :'( - FAQ Processori - Aurea Sectio - CogitoWeb: idee varie sviluppando nel web
MaxArt è offline   Rispondi citando il messaggio o parte di esso