Very long instruction word: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Vulkano (discussione | contributi)
aggiunta a portale
Riga 3:
 
==Progetto==
In un progettoprocessore superscalare il numero di unità di calcolo non è visibile nel set di instruzioniistruzioni. Ogni istruzione in formato binario codifica una sola instruzione,istruzione perda eseguire, moltiche microprocessorinormalmente è di 32-64 bit o meno.
 
Invece ognile istruzioneistruzioni VLIW codificavengono raggruppate in bundle, ciascuno dei quali contiene più istruzioni elementari specificando, ogniper istruzioneognuna perl'appartenenza ad una ognispecifica unità di calcolo. Per esempio un dispositivo VLIW con 5 unità di calcolo sarà dotato di istruzionibundles, o long instructions, con cinque campi, ogniciascuno campodei specificoquali peristruirà ogniuna unità di calcolo. Ovviamente le istruzioni VLIW sono molto più lunghe delle classiche istruzioni, sono lunghe: almeno 64 bit, ma spesso sono di 128 bit o più.
[[Immagine:CPU VLIW e tradizionale.png|thumb|right|300px|Confronto tra ununa CPU tradizionale e una CPU VLIW]]
Sin dalle prime architetture ci si è resi conto che aggiungendo unità di calcolo alle macchine si potevano incrementare le prestazioni senza aumentare i costi in maniera eccessiva. Nelle CPU superscalari è la CPU stessa che durante l'esecuzione decide dinamicamente quali istruzioni mandare in esecuzione in parallelo. nelle CPU VLIW è il compilatore che durante la fase di traduzione decide quali istruzioni vadano eseguite in parallelo.
 
In un'istruzione VLIW il compilatore rileva le dipendenze tra istruzioni.
Per esempio una CPU può essere in grado di eseguire due moltiplicazioni contemporaneamente. Supponendo che la CPU riceva le due moltiplicazioni, la prima sarà mandata in esecuzione nella prima unità ma se la seconda moltiplicazione dipendesse dal risultato della prima questa non potrebbe essere mandata in esecuzione e al suo posto verrebbe effettuato un blocco in hardware. In un'istruzione VLIW il compilatore individuerebbe il conflitto e introdurrebbe una NOP per la seconda unità di calcolo. Questo riduce la complessità della CPU.
Una dipendenza tipica si ha, ad esempio, quando un'istruzione assembly X deve elaborare il risultato di un'altra istruzione Y. In questa circostanza le due non possono venir eseguite in parallelo.
Il compilatore VLIW rileva questa dipendenza ed attua politiche di risoluzione dei conflitti.
Una politica attuabile potrebbe essere quella di anticipare alcune istruzioni indipendenti. Quando questo non risulta fattibile il compilatore introduce una NOP che stalla l'unità di calcolo.
L'assenza della logica che attua lo scheduling dinamico riduce significativamente la complessità, il costo e l'assorbimento energetico della CPU.
 
Un similealtro problema si presenta se il risultato di un'istruzione viene utilizzato per definire se uscire da un ciclo o no. Molte CPU moderne scelgono in anticipo un percorso in modo da poter caricare i dati corrispondentecorrispondenti. Alcune CPU sono dotate di una unità di [[predizione delle diramazioni]] che effettua una analisi del codice per prevedere la diramazione più probabile. Questi metodi incrementano la complessità del progetto e corrompono la filosofia originaria delle architetture RISC anche perché la CPU deve contenere anche l'elettronica che in caso di errore della predizione elimina le istruzioni in esecuzione e elimina le eventuali modifiche già eseguite (undo).
Inoltre un compilatore VLIW può riconoscere il problema delle due moltiplicazioni e quindi ''anticipare'' una istruzione che non ha precondizioni per poter incrementare le prestazioni della CPU evitando l'utilizzo dell'istruzione NOP. Un simile approccio viene seguito anche da alcune CPU superscalari moderne che però dovendo eseguire queste ''dicisioni'' in tempo reali forniscono modeste prestazioni e incrementano ulteriormente la complessità del progetto.
 
In un'architettura VLIW il compilatore utilizza delle euristiche o dei profili per predeterminare in anticipo il ramo più probabile. Avendo il compilatore molto più tempo della CPU e la possibilità di analizzare tutto il codice e non solo qualche istruzione, le sue previsioni sono molto più precise di quelle effettuate da una CPU in tempo reale. Comunque il compilatore sviluppa il codice con il ramo più probabile già codificato nel codice e fornisce anche il codice per eliminare le istruzioni già eseguite nel caso le previsione non sia quella corretta.
Un simile problema si presenta se il risultato di un'istruzione viene utilizzato per definire se uscire da un ciclo o no. Molte CPU moderne scelgono in anticipo un percorso in modo da poter caricare i dati corrispondente. Alcune CPU sono dotate di una unità di [[predizione delle diramazioni]] che effettua una analisi del codice per prevedere la diramazione più probabile. Questi metodi incrementano la complessità del progetto e corrompono la filosofia originaria delle architetture RISC anche perché la CPU deve contenere anche l'elettronica che in caso di errore della predizione elimina le istruzioni in esecuzione e elimina le eventuali modifiche già eseguite.
Il compilatore sviluppa il codice inserendo le istruzioni relative al ramo più probabilmente scelto in cascata nel codice, e codifica l'algoritmo necessario per fare l'undo nel caso le previsione non sia quella corretta.
 
In un'architettura VLIW il compilatore utilizza delle euristiche o dei profili per predeterminare in anticipo il ramo più probabile. Avendo il compilatore molto più tempo della CPU e la possibilità di analizzare tutto il codice e non solo qualche istruzione le sue previsioni sono molto più precise di quelle effettuate da una CPU in tempo reale. Comunque il compilatore sviluppa il codice con il ramo più probabile già codificato nel codice e fornisce anche il codice per eliminare le istruzioni già eseguite nel caso le previsione non sia quella corretta.
 
== Problematiche ==