|
Ma purtroppo la tecnologia HyperThreading non significa per forza
guadagno di prestazioni. Si pensi, ad esempio, se i due thread, in un
determinato istante, richiedono l'uso delle stesse unità. In questo
caso le prestazioni possono subire un decremento compreso fra 0 e 10%.
Per essere più chiari possiamo fare un esempio concreto: supponiamo di
avere un thread che richiede il caricamento di due dati dalla memoria,
ne fa la somma e mette il risultato in memoria. Le unità di esecuzione
coinvolte sono visibili nella seguente tabella dove in verde abbiamo
le unità occupate in un determinato ciclo di clock ed in nero le
stesse unità che sono "a spasso".
| Unità\Clock |
1 |
2 |
3 |
4 |
| ALU |
|
|
|
|
| Load/Store |
|
|
|
|
Se prendiamo, ora, un altro thread che fa le stesse cose del
precedente ma ha già caricato i dati dalla memoria e lo facciamo girare
assieme al precedente, il grafico diventa (in giallo l'occupazione delle
unità da parte del secondo thread):
| Unità\Clock |
1 |
2 |
3 |
4 |
| ALU |
|
|
|
|
| Load/Store |
|
|
|
|
Si vede subito una maggiore occupazione delle unità di esecuzione
della CPU con un notevole incremento delle prestazioni. Ma cosa accade
se i due thread eseguono le stesse azioni nello stesso istante di clock?
Supponiamo di avere un thread esattamente identico al precedente che
inizia nello stesso istante di clock (in rosso le collisioni nella
richiesta di risorse):
| Unità\Clock |
1 |
2 |
3 |
4 |
| ALU |
|
|
|
|
| Load/Store |
|
|
|
|
Adesso i problemi sono nella soluzione delle collisioni. Questo fatto
implica spesso di dover svuotare le pipeline per cercare di terminare un
thread e poi procedere con il successivo. Dunque la CPU viene costretta
ad un lavoro extra con una conseguente perdita di prestazioni.
Queste considerazioni fanno anche capire perché sinora questa
tecnologia è stata resa disponibile solo su Server e Workstation e non
su sistemi Desktop. Infatti nei sistemi professionali è molto più
probabile che la CPU si trovi ad eseguire threads di varia natura che si
prestano bene ad essere gestiti da una CPU con HyperThreading.
L'architettura NetBurst del Pentium 4, comunque, cerca di risolvere,
almeno in parte i problemi di collisione nella richiesta di una data
risorsa di CPU da parte di thread diversi. Questa funzionalità è resa
possibile dal fatto che il Pentium 4 è stato dotato di ben tre unità di
calcolo intero: due ALU ed una unità per le operazioni di Shift e
Rotate.
| Unità\Clock |
1 |
2 |
3 |
4 |
| ALU 2 |
|
|
|
|
| ALU 1 |
|
|
|
|
| Load/Store |
|
|
|
|
A questo punto si potrebbe pensare che aumentando il numero di unità
di esecuzione della CPU tutti i problemi possano essere risolti. La cosa
è vera in parte dato che questo approccio risulta il più costoso di
tutti in termini di dimensioni e costi del die. Altro approccio potrebbe
essere quello dell'ottimizzazione del software per l'architettura
HyperThreading. Intel sta incoraggiando questo secondo modo di procedere
anche rilasciando nuove versioni dei suoi compilatori: qualche giorno
fa, infatti, è stata messa online la versione 7 del compilatore C++ di
Intel, integrabile nel pacchetto Visual Studio di Microsoft.
|