Multithreading simultaneo

L’Intel Pentium 4 è stato il primo processore desktop moderno ad implementare il multithreading simultaneo, a partire dal modello da 3,06 GHz rilasciato nel 2002, e da allora introdotto in diversi loro processori. Intel chiama la funzionalità Hyper-Threading Technology, e fornisce un motore SMT di base a due thread. Intel dichiara fino al 30% di miglioramento della velocità rispetto a un Pentium 4 non SMT, altrimenti identico. Il miglioramento delle prestazioni visto è molto dipendente dall’applicazione; tuttavia, quando si eseguono due programmi che richiedono la piena attenzione del processore, può effettivamente sembrare che uno o entrambi i programmi rallentino leggermente quando l’Hyper-threading è attivato. Questo è dovuto al sistema di replay del Pentium 4 che impegna preziose risorse di esecuzione, aumentando la contesa per risorse come la larghezza di banda, le cache, i TLB, le voci del buffer di riordino, equalizzando le risorse del processore tra i due programmi che aggiungono una quantità variabile di tempo di esecuzione. Il core Pentium 4 Prescott ha guadagnato una coda di replay, che riduce il tempo di esecuzione necessario al sistema di replay. Questo è sufficiente per superare completamente quel colpo di prestazioni.

Gli ultimi progetti dell’architettura MIPS di Imagination Technologies includono un sistema SMT noto come “MIPS MT”. MIPS MT prevede sia elementi di elaborazione virtuale pesanti che microthreads hardware più leggeri. RMI, una startup di Cupertino, è il primo fornitore MIPS a fornire un processore SOC basato su otto core, ognuno dei quali esegue quattro thread. I thread possono essere eseguiti in modalità fine-grain dove un thread diverso può essere eseguito ogni ciclo. Ai thread possono anche essere assegnate delle priorità. Le CPU MIPS di Imagination Technologies hanno due thread SMT per core.

Il Blue Gene/Q di IBM ha SMT a 4 vie.

L’IBM POWER5, annunciato nel maggio 2004, è disponibile sia come modulo dual core dual-chip (DCM), sia come modulo quad-core o ott-core multi-chip (MCM), con ogni core che include un motore SMT a due thread. L’implementazione di IBM è più sofisticata delle precedenti, perché può assegnare una priorità diversa ai vari thread, è più a grana fine, e il motore SMT può essere acceso e spento dinamicamente, per eseguire meglio quei carichi di lavoro dove un processore SMT non aumenterebbe le prestazioni. Questa è la seconda implementazione di IBM di multithreading hardware generalmente disponibile. Nel 2010, IBM ha rilasciato sistemi basati sul processore POWER7 con otto core con ciascuno quattro Simultaneous Intelligent Threads. Questo commuta la modalità di threading tra un thread, due thread o quattro thread a seconda del numero di thread di processo in programma in quel momento. Questo ottimizza l’uso del core per un tempo di risposta minimo o un throughput massimo. IBM POWER8 ha 8 thread simultanei intelligenti per core (SMT8).

IBM z13 ha due thread per core (SMT-2).

Anche se molte persone hanno riferito che l’UltraSPARC T1 di Sun Microsystems (conosciuto come “Niagara” fino al suo rilascio del 14 novembre 2005) e l’ormai defunto processore dal nome in codice “Rock” (originariamente annunciato nel 2005, ma dopo molti ritardi cancellato nel 2010) sono implementazioni di SPARC focalizzate quasi interamente sullo sfruttamento delle tecniche SMT e CMP, Niagara non usa effettivamente SMT. Sun si riferisce a questi approcci combinati come “CMT”, e il concetto generale come “Throughput Computing”. Il Niagara ha otto core, ma ogni core ha solo una pipeline, quindi in realtà usa un multithreading a grana fine. A differenza di SMT, dove le istruzioni da più thread condividono la finestra di emissione ogni ciclo, il processore usa una politica di round robin per emettere istruzioni dal prossimo thread attivo ogni ciclo. Questo lo rende più simile a un processore a barile. Il processore Rock di Sun Microsystems è diverso, ha core più complessi che hanno più di una pipeline.

La Oracle Corporation SPARC T3 ha otto thread a grana fine per core, SPARC T4, SPARC T5, SPARC M5, M6 e M7 hanno otto thread a grana fine per core di cui due possono essere eseguiti contemporaneamente.

Fujitsu SPARC64 VI ha il Vertical Multithreading a grana grossa (VMT) SPARC VII e più recenti hanno SMT a 2 vie.

Intel Itanium Montecito usa il multithreading a grana grossa e Tukwila e più recenti usano SMT a 2 vie (con multithreading a doppio dominio).

Intel Xeon Phi ha SMT a 4 vie (con multithreading time-multiplexed) con thread basati sull’hardware che non possono essere disabilitati a differenza del normale Hyperthreading. L’Intel Atom, rilasciato nel 2008, è il primo prodotto Intel ad avere SMT a 2 vie (commercializzato come Hyper-Threading) senza supportare il riordino delle istruzioni, l’esecuzione speculativa o la rinominazione dei registri. Intel ha reintrodotto l’Hyper-Threading con la microarchitettura Nehalem, dopo la sua assenza sulla microarchitettura Core.

La microarchitetturaAMD Bulldozer FlexFPU e la cache L2 condivisa sono multithreaded ma i core interi nel modulo sono single threaded, quindi è solo un’implementazione SMT parziale.

La microarchitettura AMD Zen ha SMT a 2 vie.

L’architetturaVISC usa il Virtual Software Layer (livello di traduzione) per inviare un singolo thread di istruzioni al Global Front End che divide le istruzioni in threadlet hardware virtuali che vengono poi inviati a core virtuali separati. Questi core virtuali possono poi inviarli alle risorse disponibili su uno qualsiasi dei core fisici. Più core virtuali possono spingere i threadlet nel buffer di riordino di un singolo core fisico, che può dividere istruzioni parziali e dati da più threadlet attraverso le porte di esecuzione allo stesso tempo. Ogni core virtuale tiene traccia della posizione dell’uscita relativa. Questa forma di multithreading può aumentare le prestazioni di un singolo thread consentendo a un singolo thread di utilizzare tutte le risorse della CPU.L’allocazione delle risorse è dinamica a livello di latenza quasi a singolo ciclo (1-4 cicli a seconda del cambiamento di allocazione in base alle esigenze delle singole applicazioni. Pertanto, se due core virtuali sono in competizione per le risorse, ci sono algoritmi appropriati in atto per determinare quali risorse devono essere allocate dove.