Multithreading: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
fix
 
(92 versioni intermedie di 56 utenti non mostrate)
Riga 1:
{{F|componenti per computer|marzo 2013}}
{{WIP|hellis}}
[[File:Single-thread.png|thumb|Un processore single thread esegue un solo thread per processo]]
Il '''multithearding''' in [[informatica]] indica il supporto [[hardware]] da parte di un [[processore]] di eseguire più [[thread]]. Questa tecnica si distingue da quella alla base dei sistemi [[Multi core|multiprocessore]] per il fatto che i singoli thread condividono lo stesso spazio d'indirizzamento, la stessa cache e lo stesso [[translation lookaside buffer]]. Il multithreading migliora le prestazioni dei programmi solamente quando questi sono stati sviluppati suddividendo il carico di lavoro su più thread che possono essere eseguiti in parallelo. I sistemi multiprocessore sono dotati di più unità di calcolo indipendenti, un sistema multithread invece è dotato di una singola unità di calcolo che si cerca di utilizzare al meglio eseguendo più theard nella stessa unità di calcolo. Le tecniche sono complementari, a volte i sistemi multiprocessore implementano anche il multithreading per migliorare le prestaaioni complessive del sistema.
[[File:Single-thread SMP.png|thumb|Un sistema multiprocessore classico esegue un solo thread per unità di calcolo]]
 
In [[informatica]] il '''multithreading''' indica il supporto [[hardware]] da parte di un [[processore]] di [[esecuzione (informatica)|eseguire]] più [[Thread (informatica)|thread]]. Questa tecnica si distingue da quella alla base dei sistemi [[Multi core|multiprocessore]] per il fatto che i singoli thread condividono lo stesso spazio d'indirizzamento, la stessa [[memoria cache|cache]] e lo stesso [[translation lookaside buffer]].
 
Il ''multithreading'' migliora le prestazioni dei [[programma (informatica)|programmi]] solamente quando questi sono stati sviluppati suddividendo il carico di lavoro su più thread che possono essere eseguiti in [[calcolo parallelo|parallelo]]. Mentre i sistemi multiprocessore sono dotati di più unità di calcolo indipendenti per le quali l'[[esecuzione (informatica)|esecuzione]] è effettivamente parallela, un sistema multithread invece è dotato di una singola unità di calcolo che si cerca di utilizzare al meglio eseguendo più thread nella stessa unità di calcolo. Le due tecniche sono complementari: a volte i sistemi multiprocessore implementano anche il multithreading per migliorare le prestazioni complessive del sistema.
 
== Panoramica ==
Il paradigma del '''multitheardingmultithreading''' è diventato molto popolare verso la fine degli [[anni 1990|anni novanta]] quando le ricerche sull'incremento dell'[[instruction level parallelism]] si sono bloccate. Allora si è spostata l'attenzione dall'eseguire un singolo programma alla massima velocità all'occupare con la massima efficienza possibile le unità di calcolo. Si è appurato che molti programmi erano composti da più threadflussi paralleli o potevano essere scomposti in più thread paralleli con lievi modifiche al [[codice sorgente]]. Quindi miglioranddomigliorando l'esecuzione di theardthread parappeliparalleli si poteva migliorare l'esecuzione complessiva dei programmi. Questo ha spinto lo sviluppo dei sistemi multithreading e dei sistemi multiprocessore.
 
Questo filone di ricerca ha portato anche delle critiche, le principali sono:
* Più theardthread condividono le stesse risorse come [[CPU cache|cache]] o translation lookaside buffer e quindi possono interferire a vicenda rallentandosi.
* Le prestazioni dei singoli thread non migliorano, ma anzi possono degradare all'aumento dei thread concorrenti.
* Il supporto hardware del multitheardingmultithreading e dei sistemi multiprocessori richiede anche un contributo del [[software]], i programmi e i [[sistema operativo|sistemi operativi]] devono essere adattati per gestire questa nuova possibilità.
 
== Clustered Multi-Thread ==
Il ''Clustered Multi-Thread'' è una tecnica che consente la progettazione di processori superscalari senza sacrificare tempo di ciclo, ma a costo di latenze di comunicazione maggiori.<ref>[https://cseweb.ucsd.edu/~tullsen/ipdps04.pdf Clustered Multithreaded Architectures – Pursuing Both IPC and Cycle Time]</ref>
 
=== Esempi ===
Uno dei maggiori esponenti di questa architettura sono i processori Bulldozer di AMD<ref>{{Cita web |url=http://www.tomshw.it/news/amd-vuole-mettere-paura-a-intel-e-nvidia-i-piani-per-il-futuro-66025 |titolo=AMD vuole mettere paura a Intel e Nvidia: i piani per il futuro |accesso=6 maggio 2015 |dataarchivio=9 maggio 2015 |urlarchivio=https://web.archive.org/web/20150509004827/http://www.tomshw.it/news/amd-vuole-mettere-paura-a-intel-e-nvidia-i-piani-per-il-futuro-66025 |urlmorto=sì }}</ref>
 
== Coarse-grained multithreading ==
=== Idea di base ===
Il multithreading ''coarse-grained'' (a grana grossa) prevede che il processore esegua un singolo thread fino a quando questo non viene bloccato da un evento che normalmente ha una elevata latenza (per esempio un [[cache miss]]), in questo caso il processore provvede a eseguire un altro thread che era pronto per l'esecuzione. Il thread di rimpiazzo rimane in esecuzioniesecuzione fino a quando il primo thread non è pronto per l'esecuzione.
 
Per esempio:
# Ciclo i : l'[[istruzione (informatica)|istruzione]] j del thread A viene caricata
# Ciclo i+1 : l'istruzione j+1 del thread A viene caricata
# Ciclo i+2 : l'istruzione j+2 del thread A viene caricata, il caricamento provoca un cache miss con corrispondente richiesta nella [[memoria centrale]]
# Ciclo i+3 : il processore avvia l'esecuzione del thread B
# Ciclo i+4 : l'istruzione k del thread B viene caricata
# Ciclo i+5 : l'istruzione k+1 del thread B viene caricata
 
Concettualmente è una tecnica simile a quella presente nel [[multitasking]] cooperativo dei sistemi [[RTOS]], in questi sistemi operativi quando un programma deve attendere un evento volontariamente cede la priorità a un altro programma pronto all'esecuzione.
 
=== Terminologia ===
Oltre che ''Coarse-grained'' multithreading viene definito ''Block'' oro ''Cooperative'' multithreading.
 
=== Costo hardware ===
Il multithreading parte dal presupposto che il passaggio tra thread avvenga in modo rapido, questa tecnica effettua il passaggio in un ciclo di clock. Al fine di ottenere questo il processore deve replicare alcune componenti per i due thread come i [[registro (informatica)|registri]] interni, il [[program counter]] e alcuni registri di stato. Anche gli adattamenti a livello software sono relativamente modesti dato che il sistema operativo deve gestire un numero modesto di thread in esecuzione contemporanea.
 
=== Esempi ===
Molte famiglie di [[microcontrollore|microcontrollori]] e di processori [[sistema embedded|embedded]] implementano una gestione di più banchi di registri al fine di consentire un veloce [[context switch]] per la gestione degli [[interruprinterrupt]]. Questo può essere considerato un tipo multithreading.
* [[Intel]] [[Super-threading]]
* Intel [[Itanium 2]]
 
== Fine-grained multithreading ==
[[File:Hyper-threaded CPU.png|thumb|Un sistema Fine-grained multithreading schedula più thread e ne esegue in contemporaneo le istruzioni al fine di occupare al meglio le unità d'elaborazione]]
''See article: [[barrel processor]]''
=== Idea di base ===
 
Una tipologia di multithreading molto spinto prevede che il processore scambi il thread in esecuzione a ogni ciclo di clock.
== Idea di base ==
Una tipologia di mutithreading molti spinto prevede che il processore scambi il thread in esecuzione a ogni ciclo di clock.
 
Per esempio:
# Ciclo i : l'istruzione j del thread A viene caricata
# Ciclo i+1 : l'istruzione k del thread B viene caricata
# Ciclo i+2 : l'istruzione h del thread C viene caricata
 
Questa tipologia di mutithreadingmultithreading dovrebbe rimuovere la dipendenza dai dati dei singoli thread e quindi dovrebbe azzerare o comunque ridurre gli stalli della [[pipeline dati|pipeline]] dovuta alla dipendenza dai dati. Dato che ogni thread dovrebbe funzionare in modo indipendente i singoli thread eseguiranno programmi non correlati e quindi vi saranno poche probabilità che le istruzioni di un thread necessitino dei risultati elaborati da un'istruzione di un altro thread in esecuzione in quel momento.
Concettualmente questa tecnica è simile al multitasking preemptive presente in molti sistemi operativi. Questa analogia parte dal presupposto che ogni slot di tempo dei programmi sia posto uguale a un ciclo di clock del processore.
 
==== Terminologia= ===
Questa tecnica di multithreading inizialmente venne chiamata ''barrel processing'' ma attualmente la terminologia moderna definisce questa tecnica come ''pre-emptive'' o ''interleaved'' o ''time-sliced'' o ''fine-grained'' multithreading.
This type of multithreading was first called ''Barrel processing'', in which the staves
of a barrel represent the pipeline stages and their executing threads. ''Interleaved'' or ''Pre-emptive'' or ''Fine-grained'' or ''time-sliced'' multithreading are more modern terminology.
 
====Hardware costs=Costo hardware ===
In aggiunta alle componenti indicate precedentemente questa tecnica di multithreading richiede delle componenti aggiuntive che assegnino a ogni istruzione in esecuzione un'ID che permetta di identificare il thread proprietario. Questa tecnica richiede che lo scambio tra i thread avvenga senza cicli di clock di stallo e quindi richiede hardware più sofisticato; inoltre la presenza di molti thread in esecuzione in parallelo richiede generalmente cache e TLB più capienti al fine di poter servire i vari thread in modo efficiente.
 
In addition to the hardware costs discussed in the ''Block'' type of multithreading, ''interleaved'' multithreading has an additional cost of each pipeline stage tracking the thread ID of the instruction it is processing. Also, since there are more threads being executed concurrently in the pipeline, shared resources such as caches and TLBs need to be larger to avoid thrashing between the different threads.
 
====Examples====
 
=== Esempi ===
* Denelcor [[Heterogeneous Element Processor]]
* [[Sun Microsystems]] [[UltraSPARC T1]]
* [[Lexra]] NetVortex
* [[MIPSArchitettura architectureMIPS|MIPS]] 34K core which34K che implementsimplementa thela Multi-Threaded ASE
* [[Raza Microelectronics Inc]] XLR
 
=== Simultaneous multiMulti-threading=Threading ==
[[File:Superthreaded CPU.png|thumb|Un sistema Simultaneous Multi-Threading schedula più thread ma ne esegue uno solo per ciclo di clock]]
=== Idea di base ===
I moderni processori hanno più unità di calcolo che vengono utilizzate eseguendo le istruzioni dei singoli thread in parallelo. Gli attuali processori sono in grado di eseguire solamente poche istruzioni in parallelo di un singolo thread per via del ridotto parallelismo a livello di istruzioni che normalmente i thread possiedono. Quindi spesso alcune unità di elaborazione rimangono inutilizzate durante le elaborazioni. Per evitare questo il Simultaneous Multi-threading (SMT) esegue più thread in contemporanea e utilizza le istruzioni dei singoli thread per mantenere le unità di elaborazione sempre operative.
 
Per esempio:
''See main article [[Simultaneous multithreading]]''
# Ciclo i: istruzione j e j+1 dal thread A, istruzione k dal thread B, tutte eseguite in simultanea
# Ciclo i+1: istruzione j+2 dal thread A, istruzione k+1 dal thread B, istruzione m dal thread C, eseguite in simultanea
# Ciclo i+2: istruzione j+3 dal thread A, istruzione m+1 e m+2 dal thread C, eseguite in simultanea.
 
====Concept= Terminologia ===
Per distinguerlo dagli altri tipi di multithreading il termine [[temporal multithreading]] indica un tipo di multithreading che permette il completamento di istruzioni di un solo thread per ciclo di clock.
The most advanced type of multi-threading applies to [[superscalar]] processors. A normal superscalar processor issues multiple instructions from a single thread every CPU cycle. In Simultaneous Multi-threading (SMT), the superscalar processor can issue instructions from multiple threads every CPU cycle. Recognizing that any single thread has a limited amount of [[instruction level parallelism]], this type of multithreading is trying to exploit parallelism available across multiple threads to decrease the waste associated with unused issue slots.
 
=== Costo hardware ===
For example:
In aggiunta all'hardware richiesto dal precedente tipo di multithreading, questa tecnica richiede che ogni stadio della pipeline tracci il thread d'appartenenza dell'istruzione e, dato che il processore ha più unità d'esecuzione, vi sono molte istruzioni da tracciare. Inoltre la cache e la TLB devono essere molto ampie per poter gestire un numero di thread così elevato dato che, eseguendo molte più istruzioni in parallelo, si fa un uso molto intenso delle risorse suddette.
 
=== Esempi ===
# Cycle i : instructions j and j+1 from thread A; instruction k from thread B all simultaneously issued
* [[DEC Alpha]] EV8 (non terminato)
# Cycle i+1: instruction j+2 from thread A; instruction k+1 from thread B; instruction m from thread C all simultaneously issued
* [[Intel]] [[Hyper-Threading]]
# Cycle i+2: instruction j+3 from thread A; instructions m+1 and m+2 from thread C all simultaneously issued
 
====Terminology====
To distinguish the other flavors of multithreading from SMT, the term [[Temporal multithreading]] is used to denote when instructions from only one thread can be issued at a time.
 
====Hardware costs====
In addition to the hardware costs discussed for ''interleaved'' multithreading, SMT has the additional cost of each pipeline stage tracking the Thread ID of '''each''' instruction being processed. Again, shared resources such as caches and TLBs have to be sized for the large number of active threads.
 
====Examples====
* [[DEC Alpha]] EV8 (not completed)
* [[Intel]] [[Hyperthreading]]
* [[IBM]] [[POWER5]]
* Power Processing Elements withindel theprocessore [[Cell microprocessor(processore)|Cell]]
* [[Sun Microsystems]] [[UltraSPARC T2]]
 
== Ricerca ==
===Implementation specifics===
Attualmente la ricerca di settore si concentra su tecniche che permettano di scegliere rapidamente il thread da mandare in esecuzione in caso di stallo del thread in esecuzione. Un importante filone di ricerca è lo [[scheduler]] dei thread, che può essere gestito a livello hardware, a livello software o con un approccio misto.
 
Un'altra area di ricerca riguarda la tipologia di eventi che devono provocare uno scambio dei thread in esecuzione (cache miss, DMA, comunicazione inter thread, etc).
A major area of research is the thread scheduler which must quickly choose among
the list of ready-to-run threads to execute next as well as maintain the read-to-run and stalled thread lists.
An important sub-topic are the different thread priority schemes that can be used by the scheduler.
The thread scheduler might be implemented totally in software or totally in hardware or as a hw/sw combination.
 
Se il multithreading replica tutti i registri visibili a livello software è possibile utilizzare il multithreading per implementare delle [[macchina virtuale|macchine virtuali]]. Ogni thread si troverebbe a gestire una propria macchina virtuale come se fosse eseguita da un processore separato e quindi potrebbe arrivare ad eseguire anche un intero sistema operativo indipendente.
Another area of research is what type of events should cause a thread switch - cache misses, inter-thread communication,
[[Direct memory access|DMA]] completion, etc.
 
== Note ==
If the multithreading scheme replicates '''all''' software visible state, include privileged control registers, TLBs, etc., then it enables [[virtual machine]]s to be created for each thread. This allows each thread to run its own operating system on the same processor. On the other hand, if only user-mode state is saved, less hardware is required which would allow for more threads to be active at one time for the same die-area/cost.
<references />
 
===See also=Voci correlate ==
* [[ThreadFork (computer scienceprogrammazione)]]
* [[Simultaneous multithreading]], SMT
* [[Temporal multithreading]], also known as Interleaved multi-threading
 
== Collegamenti esterni ==
Hardware techniques used to support [[thread (computer science)|multithreading]] often parallel the software techniques used
* {{FOLDOC||multithreading}}
for [[computer multitasking]] of computer programs.
* {{cita web|url = http://www.di.unito.it/~gunetti/DIDATTICA/architettureII/06-multithreading-3.pdf| titolo = Lucidi sul multithreading | formato = pdf |urlarchivio = https://web.archive.org/web/20060609173356/http://www.di.unito.it/~gunetti/DIDATTICA/architettureII/06-multithreading-3.pdf | urlmorto = no}}
* {{cita web | url = http://www.federica.unina.it/ingegneria/programmazione-2/programmazione-multi-thread/ | titolo = Programmazione multi-thread | sito = Università di Napoli | lingua = it | urlarchivio = https://web.archive.org/web/20120423065229/http://www.federica.unina.it/ingegneria/programmazione-2/programmazione-multi-thread/ | urlmorto = no}}
 
{{Portale|informatica}}
 
In [[informatica]], il '''multithreading''' è una tecnica che permette di avere più flussi di esecuzione contemporanei (''[[Processo (informatica)|thread]]'') di uno stesso programma, in esecuzione su [[CPU]] differenti o sulla stessa.
 
I thread multipli hanno origine dalla stessa [[immagine eseguibile]]. In pratica, l'inizio di un thread è la creazione di un nuovo processo usando lo stesso codice di un altro, già presente in memoria. Tutti i thread di un dato programma condividono il codice eseguibile e i dati globali. Ognuno di essi ha invece una copia distinta dei dati locali, come le variabili allocate sullo [[stack]] e la memoria allocata dinamicamente.
 
Il multithreading permette di suddividere il lavoro a più processori in modo efficiente, ma introduce una notevole complessità che può essere spesso difficile da gestire. Il problema maggiore è la ''sincronizzazione'' tra i vari thread: spesso un thread ha bisogno dei risultati di un altro, oppure deve sovrascrivere i dati di un altro ma non prima di un dato momento. Tali problemi danno spesso origine a [[loop]] infiniti o a [[deadlock]], a volte di difficile soluzione. Alcuni concetti come il [[mutex]] sono stati sviluppati appositamente per sincronizzare thread diversi.
 
[[Categoria:Microprocessore]]
[[Categoria:Calcolo parallelo]]
[[Categoria:Thread]]
 
{{Portale|Informatica}}
 
[[da:Multithreading]]
[[de:Hyper-Threading]]
[[en:Hyper-threading]]
[[es:HyperThreading]]
[[fr:Hyper-Threading]]
[[ja:マルチスレッド]]
[[nl:Hyper-Threading]]
[[pl:Hiperwątkowość]]
[[pt:Hyper-threading]]
[[simple:Multithreading]]
[[sv:Hyper Threading]]
[[zh:超執行緒]]