Multithreading: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
A7N8X (discussione | contributi)
Nessun oggetto della modifica
AttoBot (discussione | contributi)
m Bot: Aggiungo il tag <references /> mancante; modifiche estetiche
Riga 10:
 
Questo filone di ricerca ha portato anche delle critiche, le principali sono:
* Più thread 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 multithreading 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 ==
Riga 25:
 
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.
Riga 45:
* Intel [[Itanium 2]]
 
== Fine-grained multithreading ==
[[File:Hyper-threaded CPU.png|thumb|right|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]]
=== Idea di base ===
Riga 51:
 
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 multithreading 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.
Riga 59:
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 ''interlaved'' o ''time-sliced'' o ''fine-grained'' multithreading.
 
Riga 65:
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.
 
=== Esempi ===
* Denelcor [[Heterogeneous Element Processor]]
* [[Sun Microsystems]] [[UltraSPARC T1]]
Riga 72:
* [[Raza Microelectronics Inc]] XLR
 
== Simultaneous Multi-Threading ==
[[File:Superthreaded CPU.png|thumb|right|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.
 
Riga 83:
 
=== 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.
 
=== Costo hardware ===
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 ===
* [[DEC Alpha]] EV8 (non terminato)
* [[Intel]] [[Hyper-Threading]]
Riga 101:
 
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.
 
== Note ==
<references />
 
== Collegamenti esterni ==