Quando si parla di processori per PC , è molto comune parlare del numero di core e dei thread di elaborazione o esecuzione, che sono generalmente il doppio del numero di core perché HyperThreading tecnologie nel caso di Intel e al SMT nel caso of AMD quello che fanno è che ogni core può eseguire due attività simultanee. Tuttavia, questo è un modo piuttosto semplice per spiegare come il multithreading funziona su un processore, e in questo articolo quello che faremo è spiegartelo in maggior dettaglio in modo che tu possa capirne tutti i dettagli.
Detto questo, sappiamo tutti che un processore che ha più thread che core è in grado di eseguire più attività contemporaneamente e, in effetti, il sistema operativo rileva il processore come se avesse effettivamente tanti core quanti sono i thread. Ad esempio, un Intel Core i7-8700K ha 6 core e 12 thread grazie alla tecnologia HyperThreading e Windows 10 lo riconosce come un processore a 12 core così com'è (anche se è vero che li chiama "processori logici") perché per il sistema operativo il suo funzionamento è completamente trasparente.

Cos'è l'elaborazione multi-thread?
Nell'architettura del computer, l'elaborazione multi-thread è la capacità dell'unità di elaborazione centrale (CPU) per fornire più thread di esecuzione contemporaneamente, supportati dal sistema operativo. Questo approccio è diverso dal multiprocessing e non deve essere confuso; In un'applicazione multithread, i thread condividono le risorse di uno o più core del processore, comprese le unità di calcolo, la cache e il buffer di ricerca della traduzione (TLBL).

Quando i sistemi multiprocessing includono più unità di elaborazione complete su uno o più core, il multiprocessing mira ad aumentare l'utilizzo di un singolo core utilizzando il parallelismo a livello di thread e il parallelismo a livello di istruzione. Poiché le due tecniche sono complementari, sono combinate in quasi tutte le moderne architetture di sistema con più CPU multi-thread e con CPU multi-core in grado di funzionare con più thread.
Il paradigma multi-threaded è diventato più popolare in quanto gli sforzi per sfruttare il parallelismo a livello di istruzione (ovvero, essere in grado di eseguire più istruzioni in parallelo) si sono bloccati alla fine degli anni '1990. Ciò ha consentito al concetto di performance computing di emergere dal campo più specializzato dell'elaborazione delle transazioni.
Sebbene sia molto difficile accelerare ulteriormente un singolo thread o programma, la maggior parte dei sistemi di computer è in realtà multitasking tra più thread o programmi e quindi le tecniche che migliorano le prestazioni di tutte le attività determinano miglioramenti delle prestazioni. generale. In altre parole, più istruzioni una CPU può elaborare contemporaneamente, migliori sono le prestazioni complessive dell'intero sistema.
Anche l'elaborazione multi-thread ha degli svantaggi
Oltre all'aumento delle prestazioni, uno dei vantaggi dell'elaborazione multi-thread è che se un thread ha molti errori di cache, gli altri thread possono continuare a sfruttare le risorse della CPU inutilizzate, il che può portare a un'esecuzione complessiva più rapida. poiché queste risorse sarebbero state inattive se fosse stato eseguito un solo thread. Inoltre, se un thread non può utilizzare tutte le risorse della CPU (ad esempio, perché le istruzioni dipendono dal risultato di quello precedente), l'esecuzione di un altro thread può impedire che queste risorse vadano inattive.

Tuttavia, tutto ha anche il suo lato negativo. Più thread possono interferire tra loro condividendo risorse hardware, come cache o buffer di ricerca della traduzione. Di conseguenza, i tempi di esecuzione a thread singolo non sono migliorati e possono peggiorare, anche quando è in esecuzione un solo thread, a causa delle frequenze inferiori o delle fasi della pipeline aggiuntive necessarie per adattarsi all'hardware di commutazione del processo.
L'efficienza complessiva varia; Intel afferma che la sua tecnologia HyperThreading lo migliora del 30%, mentre un programma sintetico che esegue solo un ciclo di operazioni in virgola mobile dipendenti non ottimizzate riceve effettivamente un miglioramento del 100% se eseguito in parallelo. D'altra parte, i programmi in linguaggio assembly ottimizzati manualmente che utilizzano estensioni MMX o AltiVec e la ricerca preliminare di dati (come un codificatore video) non soffrono di perdite di cache o risorse inattive, quindi non traggono alcun vantaggio da una corsa . multi-thread e potrebbero effettivamente vedere le loro prestazioni ridotte a causa di contese di condivisione.
Da un punto di vista software, il supporto hardware multi-thread è completamente visibile, richiedendo ulteriori modifiche sia ai programmi applicativi che al sistema operativo stesso. Le tecniche hardware utilizzate per supportare l'elaborazione multithread sono spesso parallele alle tecniche software utilizzate per il multitasking; Anche la pianificazione del threading è un grosso problema nel multithreading.
Tipi di elaborazione multi-thread
Come abbiamo detto all'inizio, abbiamo tutti la concezione che l'elaborazione multi-threaded sia semplicemente la parallelizzazione del processo (ovvero, l'esecuzione di più attività contemporaneamente), ma in realtà le cose sono un po 'più complicate di così e ci sono diversi tipi elaborazione multi-thread.
Filettature multiple a "grana grossa"

Il tipo più semplice di multithreading si verifica quando un thread viene eseguito fino a quando non viene bloccato da un evento che normalmente creerebbe un blocco di latenza lungo. Un tale arresto potrebbe essere dovuto alla mancanza di cache che deve accedere alla memoria fuori dal chip, il che può richiedere centinaia di cicli della CPU per il ritorno dei dati. Invece di aspettare che il crash si risolva, il processore passerà l'esecuzione a un altro thread che era già pronto per essere eseguito, e solo quando i dati dal thread precedente saranno arrivati verranno reinseriti nell'elenco dei thread pronti per l'esecuzione.
Concettualmente, questo è simile al multitasking cooperativo utilizzato nei sistemi operativi in tempo reale, in cui le attività abbandonano volontariamente il tempo di esecuzione del processore quando devono attendere che si verifichi un qualche tipo di evento. Questo tipo di multithreading è noto come "blocco" o "grana grossa".
Multithread interleaved
Lo scopo di questo tipo di elaborazione multithread è rimuovere tutti i blocchi delle dipendenze dei dati dalla pipeline di esecuzione. Poiché un thread è relativamente indipendente dagli altri, ci sono meno possibilità che un'istruzione in una fase della pipeline necessiti di un output da un'istruzione precedente nello stesso canale; Concettualmente, questo è simile al multitasking preventivo utilizzato nel sistema operativo e un'analogia sarebbe che l'intervallo di tempo assegnato a ciascun thread attivo è un ciclo della CPU.

Ovviamente, questo tipo di elaborazione multi-thread ha uno svantaggio principale e cioè che ogni fase della pipeline deve tenere traccia dell'ID thread dell'istruzione che sta elaborando, il che ne rallenta le prestazioni. Inoltre, poiché ci sono più thread in esecuzione contemporaneamente nella pipeline, le condivisioni come la cache devono essere più grandi per evitare errori.
Multithreading parallelo
Il tipo più avanzato di multithreading si applica ai processori noti come superscalari. Mentre una tipica CPU superscalare emette più istruzioni da un singolo thread su ogni ciclo della CPU, nell'elaborazione multi-threaded simultanea (SMT) un processore superscalare può emettere istruzioni da più thread in ogni ciclo. Riconoscendo che qualsiasi thread ha una quantità limitata di parallelismo a livello di istruzione, questi tentativi di multithreading di sfruttare il parallelismo disponibile su più thread per ridurre gli sprechi associati agli spazi inutilizzati.

Per distinguere gli altri tipi di elaborazione multithread SMT, il termine "multithreading temporaneo" viene spesso utilizzato per indicare quando le istruzioni a thread singolo possono essere emesse contemporaneamente. Le implementazioni di questo tipo includono DEC, EV8, la tecnologia HyperThreading di Intel, IBM Power5, Sun Mycrosystems UltraSPARC T2, Cray XMT e le microarchitetture Bulldozer e Zen di AMD.