...continua...
Il problema della filosofia EPIC risiede esattamente nel coinvolgimento del compilatore e nella definizione di un nuovo ISA per cui la esecuzione di codice IA-32 risulta problematica ed inoltre comporta, senza un adeguato e costoso supporto Intel, un certo ritardo nello sviluppo di software che possa avvantaggiarsi di questa architettura. Inoltre l’esecuzione in ordine e il raggruppamento statico delle istruzioni tipiche delle CPU EPIC possono poco contro i miss della cache che sono poco prevedibili a livello di compilazione e per alcune applicazioni come ************************ non è detto che il tempo speso in fase di compilazione possa essere adeguatamente compensato dai tempi di esecuzione.
Thread Level Parallelism (TLP)
Un’altra strada a disposizione degli sviluppatori per incrementare le prestazioni sfruttando il parallelismo consiste nel Thread Level Parallelism (TLP) cioè nella esecuzione in parallelo da parte di sistemi multiprocessore che possono essere fisici (cioè con la presenza effettiva di più CPU sul medesimo chip) o virtuali (cioè ottenuti da un singolo chip che emula un sistema multiprocessore simmetrico).
Questo approccio trova le sue ragioni e naturali applicazioni nell’ambito del mercato server dove effettivamente molte applicazioni possono essere effettivamente scomposte in più threads e assegnati ai diversi processori che costituiscono il sistema. In ambito desktop attualmente l’implementazione del TLP ha un impatto assai contenuto ma le applicazioni multimediali sono naturalmente orientate al TLP e quando nuovi sistemi operativi, come Windows 2000 e XP che supporta sistemi multiprocessore, o linguaggi di programmazione come ************************, che predispone a sviluppare applicazioni multithread, diventeranno standard le cose potrebbero sensibilmente cambiare.
L’approccio TLP in sostanza pone la sua attenzione sul design di sistema più che non sulla definizione di un nuovo ISA (Instruction Set Architecture) ed in particolare, dovendo prevedere la condivisione di risorse tra i diversi processori, sulla banda di memoria.
il TLP prevede lo switch delle delle risorse del chip dal thread attualmente in esecuzione ad un nuovo thread, quando il primo inizia un'operazione a lunga latenza. Ciò riduce le probabilità di stallo della lunga pipeline, permettendo al secondo thread di essere eseguito mentre viene completata l'operazione a lunga latenza del primo. Il dirottamento delle risorse da un thread all'altro comporta, comunque, una penalizzazione delle prestazioni, visto che le istruzioni del thread corrente devono essere drenate dal pipeline. Poichè lo stato dell'architettura del thread deve essere conservato nel pipeline, il nuovo processore logico deve essere attivato, e le istruzioni dal nuovo thread devono essere fornite alle risorse del processore.
Con HT, comunque, le applicazioni software adattate al multiprocessore possono essere lanciate col doppio dei processori logici da usare. Ogni processore logico può rispondere agli interrupt in modo indipendente. Il primo processore logico può seguire un thread, mentre il secondo può seguirne un altro simultaneamente. Siccome i due thread condividono un set di risorse d'esecuzione, l'HT può usare risorse che sarebbero altrimenti inutilizzate se fosse eseguito un solo thread. Il risultato è un aumento dell'utilizzazione delle risorse d'esecuzione in ogni unità di processore fisico.
Ad esempio, un processore logico può eseguire un'operazione floating-point mentre l'altro processore logico esegue un'operazione di addition o di load. HT è complementare ai sistemi MP, perchè il sistema operativo è in grado non solo di registrare thread separati ed eseguirli su ogni processore fisico simultaneamente, ma può farlo anche su ogni processore logico, sempre in simultanea.
Tutto questo migliora le prestazioni generali e la risposta del sistema, perchè molti thread paralleli possono essere distribuiti prima grazie al doppio dei processori logici che il sistema ha a disposizione. Anche se a disposizione c'è il doppio dei processori logici, questi continuano a dividersi le stesse risorse d'esecuzione: così, il beneficio che deriverebbe da un altro processore fisico con le sue proprie risorse offrirebbe i più alti livelli di performance. In altre parole, HT è complementare al multi-processing, offrendo un miglior parallelismo in ogni processore del sistema, ma non è un rimpiazzo per il dual o il multi processing.
Code Level Parallelism (CLP)
Questo livello di parallelismo riguarda la possibilità di eseguire in uno stesso istante più istruzioni distinte. In questo caso, l'approccio è quello delle architetture superscalari, ovvero dotate di due o più unità di esecuzione funzionanti in parallelo, in modo da poter mandare in esecuzione più istruzioni contemporaneamente, nell'ipotesi naturalmente che non vi sia una dipendenza tra queste istruzioni, ovvero che il risultato di alcune non serva come input per le altre. Questo problema di rimozione delle dipendenze, per poter sfruttare al massimo le architetture superscalari, è molto sentito, e c'è gente che vi dedica l'intera carriera...
Instruction Level Parallelism (ILP)
Riguarda la capacità di una singola istruzione della CPU di elaborare contemporaneamente più dati. Questo livello di parallelismo si incrementa con l'uso delle istruzioni SIMD (Single Instruction Multiple Data). Intel ha ereditato queste istruzioni dal mondo dei DSP (Digital Signal Processor) che tipicamente svolgono compiti dove è necessario avere istruzioni di questo tipo per ottenere prestazioni elevate. Nei processori x86, le istruzioni SIMD sono le MMX, le SSE/SEE2/SSE3, le 3DNow! e le 3DNow! Professional (a seconda della CPU che consideriamo). L'uso e l'efficacia di queste istruzioni sono in funzione della possibilità di trattare i dati in modo parallelo: alcune applicazioni non potranno mai beneficiare di queste istruzioni.
Per sfruttare maggiormente l'ILP sono state sviluppate particolari famiglie di processori e di compilatori. Ci sono 2 tipi di tecniche per sfruttare l'ILP:
1) STATICHE: sono tecniche messe in atto dal compilatore stesso nella fase di "produzione" del linguaggio macchina; queste tecniche, tanto per citarne alcune sono la schedulazione statica (per i dati), la diramazione ritardata e la predizione statica (per i controlli).
2) DINAMICHE: queste si rendono operative al momento dell'esecuzione del programma.
FINE
|