Multithreading (architettura di computer)
Multithreading interleaved/TemporalEdit
Multithreading a grana grossaModifica
Il tipo più semplice di multithreading si verifica quando un thread viene eseguito finché non viene bloccato da un evento che normalmente creerebbe uno stallo a lunga latenza. Un tale stallo potrebbe essere una cache miss che deve accedere alla memoria off-chip, che potrebbe richiedere centinaia di cicli di CPU per il ritorno dei dati. Invece di aspettare che lo stallo si risolva, un processore threaded passerebbe l’esecuzione ad un altro thread che è pronto per essere eseguito. Solo quando i dati per il thread precedente fossero arrivati, il thread precedente sarebbe stato rimesso nella lista dei thread pronti all’esecuzione.
Per esempio:
- Ciclo i: viene emessa l’istruzione j dal thread A.
- Ciclo i + 1: viene emessa l’istruzione j + 1 dal thread A.
- Ciclo i + 2: viene emessa l’istruzione j + 2 dal thread A, che è un’istruzione load che manca in tutte le cache.
- Ciclo i + 3: invocato lo scheduler del thread, passa al thread B.
- Ciclo i + 4: viene emessa l’istruzione k dal thread B.
- Ciclo i + 5: viene emessa l’istruzione k + 1 dal thread B.
Concettualmente, è simile al multi-tasking cooperativo usato nei sistemi operativi in tempo reale, in cui i compiti cedono volontariamente il tempo di esecuzione quando devono aspettare qualche tipo di evento. Questo tipo di multithreading è noto come multithreading a blocchi, cooperativo o a grana grossa.
L’obiettivo del supporto hardware per il multithreading è quello di permettere una rapida commutazione tra un thread bloccato e un altro thread pronto all’esecuzione. Per raggiungere questo obiettivo, il costo dell’hardware è di replicare i registri visibili del programma, così come alcuni registri di controllo del processore (come il contatore del programma). Passare da un thread a un altro thread significa che l’hardware passa dall’uso di un set di registri a un altro; per passare in modo efficiente tra thread attivi, ogni thread attivo deve avere il proprio set di registri. Per esempio, per passare rapidamente da un thread all’altro, l’hardware del registro deve essere istanziato due volte.
Il supporto hardware aggiuntivo per il multithreading permette di passare da un thread all’altro in un solo ciclo CPU, portando miglioramenti nelle prestazioni. Inoltre, l’hardware aggiuntivo permette ad ogni thread di comportarsi come se stesse eseguendo da solo e non condividendo alcuna risorsa hardware con altri thread, minimizzando la quantità di cambiamenti software necessari all’interno dell’applicazione e del sistema operativo per supportare il multithreading.
Molte famiglie di microcontrollori e processori embedded hanno banchi di registro multipli per permettere una rapida commutazione di contesto per gli interrupt. Tali schemi possono essere considerati un tipo di multithreading a blocchi tra il thread del programma utente e i thread di interrupt.
Multithreading interleavedEdit
Lo scopo del multithreading interleaved è di rimuovere tutti gli stalli di dipendenza dai dati dalla pipeline di esecuzione. Poiché un thread è relativamente indipendente dagli altri thread, c’è meno possibilità che un’istruzione in uno stadio di pipeline abbia bisogno dell’output di un’istruzione più vecchia nella pipeline. Concettualmente, è simile al multitasking preemptive usato nei sistemi operativi; un’analogia sarebbe che la fetta di tempo data ad ogni thread attivo è un ciclo della CPU.
Per esempio:
- Ciclo i + 1: un’istruzione dal thread B viene emessa.
- Ciclo i + 2: viene emessa un’istruzione dal thread C.
Questo tipo di multithreading è stato chiamato inizialmente elaborazione a barile, in cui le doghe di un barile rappresentano le fasi della pipeline e i loro thread in esecuzione. Interleaved, preemptive, fine-grained o time-sliced multithreading sono terminologie più moderne.
In aggiunta ai costi hardware discussi nel tipo di multithreading a blocchi, il multithreading interleaved ha un costo aggiuntivo di ogni stadio della pipeline che traccia l’ID del thread dell’istruzione che sta elaborando. Inoltre, poiché ci sono più thread eseguiti simultaneamente nella pipeline, le risorse condivise come le cache e i TLB devono essere più grandi per evitare il thrashing tra i diversi thread.
Multithreading simultaneoModifica
Il tipo più avanzato di multithreading si applica ai processori superscalari. Mentre un normale processore superscalare emette più istruzioni da un singolo thread ogni ciclo di CPU, nel multithreading simultaneo (SMT) un processore superscalare può emettere istruzioni da più thread ogni ciclo di CPU. Riconoscendo che ogni singolo thread ha una quantità limitata di parallelismo a livello di istruzioni, questo tipo di multithreading cerca di sfruttare il parallelismo disponibile tra più thread per diminuire lo spreco associato agli slot di emissione inutilizzati.
Per esempio:
- Ciclo i: le istruzioni j e j + 1 dal thread A e l’istruzione k dal thread B sono emesse simultaneamente.
- Ciclo i + 1: l’istruzione j + 2 dal thread A, l’istruzione k + 1 dal thread B, e l’istruzione m dal thread C sono tutte emesse simultaneamente.
- Ciclo i + 2: l’istruzione j + 3 dal thread A e le istruzioni m + 1 e m + 2 dal thread C sono tutte emesse simultaneamente.
Per distinguere gli altri tipi di multithreading da SMT, il termine “multithreading temporale” è usato per indicare quando le istruzioni di un solo thread possono essere emesse alla volta.
In aggiunta ai costi hardware discussi per il multithreading interleaved, il SMT ha il costo aggiuntivo di ogni stadio della pipeline che traccia l’ID del thread di ogni istruzione che viene elaborata. Anche in questo caso, le risorse condivise come le cache e i TLB devono essere dimensionate per il grande numero di thread attivi che vengono processati.
Le implementazioni includono DEC (poi Compaq) EV8 (non completato), Intel Hyper-Threading Technology, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT, e AMD Bulldozer e Zen microarchitectures.