Perché un singolo thread è distribuito tra le CPU?


24

Sono solo curioso di sapere perché lo scheduler sposta costantemente un'app tra le CPU, anziché tenerla su una. Sembra un po 'sciocco avere 4 core al 25% anziché uno al 100%.

Ha a che fare con il calore o è più efficiente in qualche modo? Gli altri sistemi operativi lo fanno diversamente?

Approfondimenti o collegamenti ad approfondimenti sarebbero utili. (Non sono riuscito a trovare molto me stesso.)

Aggiornare:

Con "diffusione" non intendo che si esegua su più CPU contemporaneamente, ma viene spostato dall'una all'altra più volte al secondo, rendendo l'effetto che si diffonde.


3
Anche quando "nient'altro è in esecuzione", ci sono sempre thread di sistema in competizione per CPU. Ad esempio, l'O / S ha un thread per azzerare le pagine di memoria recuperate, quindi quando è necessaria la memoria, avrà alcune pagine pronte per l'uso. Quando il thread verrà eseguito nuovamente, la CPU in cui ti trovi potrebbe essere in uso da uno di questi thread. Cosa dovrebbe fare il sistema operativo? Aspettare o spostarti in una nuova CPU? Qualunque cosa faccia, si finisce con comportamenti indesiderati in alcuni casi.
Tony Lee,

È un goomba. SMB, non LBP. :)
Macke,

Nella mia "risposta", ho mostrato che un singolo programma di thread si comportava esattamente come descrivi tu, cioè "essere spostato l'uno dall'altro più volte al secondo, facendo apparire l'effetto".
Evan Rosica,

Risposte:


8

Penso che wierobabbia descritto abbastanza bene il punto.
Ecco un vecchio articolo che parla delle processor affinityimpostazioni con un QX6800 quad-core .
(il link punta alla seconda pagina di quell'articolo).

Se non forzate l'affinità di processo con un core perdete le prestazioni ?

  • Mentre lo scheduler di Windows deve decidere tale affinità per evitare il thrashing con le cache, anche
    il design del processore stesso considera tali cose.
  • Il quad-core Intel QX6800 (da quando lo rimando in precedenza in questa risposta)
    ha una cache da 8 L3MB condivisa tra i suoi 4 core .

Va notato che mentre potresti aver scelto di eseguire solo questo processo a thread singolo sul sistema, il sistema operativo stesso avrebbe in esecuzione diverse altre attività che devono anche essere pianificate. Lo scheduler bilancia tutta questa attività nel pool di processori (o core) disponibili.


In futuro, con l' architettura Nehalem e NUMA , i
processori su più socket saranno anche in grado di affrontare meglio il thrash di accesso.
Ecco una breve foto da una pagina ArsTechnica su NUMA .

inserisci qui la descrizione dell'immagine

Se Nehalem e i7ti interessano, ho qualche altro link a questa risposta .


Cosa ti fa pensare che "Andando avanti, con l'architettura Nehalem e NUMA, i processori su più socket saranno anche in grado di affrontare meglio il thrash di accesso". ? A mio avviso, NUMA rende la memoria ancora più locale e relativa al processore, peggiorando quindi gli effetti del cestino.
Roland Pihlakas,

@RolandPihlakas, è passato un po 'di tempo da questa risposta, ma guardando l'articolo di arstechnica e questi punti penso che stavo spiegando la capacità delle nuove piattaforme di avere una migliore connettività di memoria e il software di trarne vantaggio (oltre a non avere quell'opzione con più configurazioni socket in quel momento; cioè prima di Nehalem).
Nik

6

Lo scheduler esegue solo il thread successivo che è pronto per l'esecuzione su un core / CPU "libero".

È possibile assegnare un processo a una CPU specifica tramite il task manager di Windows.

Avere 4 core al 25% significa che 4 thread vengono eseguiti contemporaneamente. Considerando che un core in x% significa che viene eseguito solo un thread. Quindi il primo è più efficiente in alcuni casi.

Ma durante la sua esecuzione la cache della CPU viene riempita con i dati a cui accede il thread. Quindi, se il thread viene eseguito su un'altra CPU, si verificheranno più errori nella cache, che sono costosi, poiché i dati non si trovano nella cache di questa CPU.

Cosa fa la tua discussione? Se il thread "dorme" per un tempo molto breve, il core su cui è stato eseguito in precedenza potrebbe essere occupato da un'altra minaccia e quindi il thread verrà eseguito sul prossimo core disponibile. Cosa succede se si specifica un solo core da utilizzare nel processo (ad es. Ia task manager)?


3
afaik lo scheduler di Windows fa un ottimo lavoro nel mantenere i thread sullo stesso cpu / core per la sua durata per evitare quel problema.
Paxxi,

@Pär: il mio thread sembra essere in esecuzione su ogni core in realtà.
Macke,

Sì, probabilmente è il proc del sistema operativo che fa saltare il mio thread. Come accettare due risposte? :)
Macke,

@ PärBjörklund dalla mia esperienza almeno Windows XP no. Penso che il problema "rimbalzo della cache" sia stato risolto in Vista o versioni successive
Waxhead,

1
"Avere 4 core al 25% significa che 4 thread vengono eseguiti contemporaneamente." No, significa che viene eseguito un thread, un po 'su un core, quindi su un altro e così via. Poiché Task Manager mostra un utilizzo medio, mostrerà il 25% (su un sistema a 4 core, su un core a due core mostrerebbe il 50%) per ciascun core. Significa che il core è stato completamente utilizzato per un quarto di tempo ed è rimasto inattivo per il tempo.
David Balažic,

0

Non è. Un thread può essere eseguito solo su un processore. Tuttavia, alcuni processi hanno più thread, che possono essere distribuiti.

Il ragionamento, che ci crediate o no, non ha mai considerato come appare. Il sistema tenta di distribuire i thread perché non ha modo di sapere quando si spike.


1
Vedi il mio chiarimento aggiunto. Questo è un thread, che funziona a tutto gas, che viene rapidamente spostato in modo che, nel tempo, ogni core (fuori campo) sia occupato al 25%. (Tutti gli altri processi / thread sono neglible)
Macke

0

Il sistema operativo migra il thread tra i core della CPU (rapidamente, più volte al secondo). È più efficiente eseguirlo sempre sullo stesso core. Questo può essere applicato dalla voce di menu contestuale "Imposta affinità" in Task Manager.

Si noti che di solito (uso domestico tipico) la differenza è nell'intervallo di alcune percentuali.

I "4 core ciascuno al 25% di utilizzo" indicano, come Task Manager mostra un utilizzo medio, che ogni core è stato completamente utilizzato per un quarto di tempo e libero il resto del tempo.

La descrizione è per Windows, ma è simile anche su altri sistemi operativi.


-1

Se qualcuno sta ancora leggendo questo, ho notato anche questo ed eseguito diversi test per vedere se non è solo un colpo di fortuna. Si scopre che non lo è! Credo che la diffusione di un singolo thread su tutti i core sia più efficiente per diversi motivi:

  1. Distribuire un thread su tutti i core consente un consumo di energia inferiore. La maggior parte dei processori abbassa le loro frequenze e, soprattutto, la tensione in base al carico, quindi un Core 2 Quad, ad esempio, consumerà molta meno energia e produrrà meno calore diffondendo un thread su tutti e 4 i core anziché utilizzare un core (che porta ad un aumento della tensione su TUTTI i core, poiché esiste un solo regolatore di tensione * - è piuttosto inefficace).
  2. Assicura che il filo passi sempre alla velocità massima / costante. Se il thread richiede improvvisamente più potenza di elaborazione, un core potrebbe sovraccaricarsi e ci sarà un ritardo nell'esecuzione. Spargendolo sui nuclei, qualsiasi picco improvviso verrà gestito senza intoppi senza ritardi e ritardi.

Inoltre, a causa delle due osservazioni precedenti, sono arrivato a credere che Turbo Boost e IDA siano inefficaci. Potrebbero essere utili su sistemi operativi meno recenti, ma Linux e Windows 7 diffondono tutto in modo abbastanza efficiente su tutti i core. Quindi, un Core 2 Quad q9100 @ 2,26 GHz sarà quasi (ci sono sempre delle eccezioni :-) sempre più veloce di un Core 2 Duo X9100 @ 3.06GHz, e raramente l'ho visto usare IDA (fondamentalmente il predecessore di Turbo boost, aumenta la frequenza su uno o due core solo per app a thread singolo).

  • Il Core 2 Quad ha due domini di clock grazie al fatto che ci sono due die fisici, quindi due core possono funzionare alla massima frequenza, mentre due sono alla frequenza più bassa. Non so se ci sono due regolatori di tensione, però - ho notato che la tensione è uniforme su tutti e 4 i core, quindi deve esserci un solo regolatore per l'intero pacchetto.

3
Sembra dubbia per diversi motivi. Fornisci riferimenti ai tuoi "fatti". Innanzitutto, perché il calcolo del 25% su quattro core consuma meno energia del 100% su uno? (Sono d'accordo sul fatto che il calore sia distribuito in modo più uniforme, ma ...) Inoltre, il thread nella mia domanda sta funzionando alla massima inclinazione (100%), quindi non "richiederà più potenza di elaborazione", perché sta già facendo per quanto possibile.
Macke,

Bene, questo è solo dalle mie stesse osservazioni: sono stato incuriosito da IDA e TurboBoost, ho deciso di fare alcuni test. È stato un po 'di tempo fa, ma sono arrivato alle conclusioni di cui sopra. Il processore consuma meno energia, poiché tutti i core funzionano a una tensione inferiore: una riduzione di 0,1 V consente di risparmiare circa 6-10 Watt nel consumo di energia (se un core viene caricato al 100%, tutti i core funzionano a una tensione più elevata, indipendentemente dal fatto che siano inattivi o no). Ciò è particolarmente vero in Core2Duo con modalità SLFM. Hai ragione sul fatto che il thread venga eseguito alla massima inclinazione non richiedendo ulteriori tatto del processore, ma ci sono app che lo fanno davvero.
JakL,

Non esiste "spargere un filo" (no, neanche 5 anni dopo). C'è un singolo thread, eseguito su un core. E poi più tardi un altro. E così via. In ogni momento un core funziona al 100% e gli altri sono inattivi. Quindi non c'è risparmio. Soprattutto quando menzioni quando tutti i core sono sempre in piena tensione (come hai detto, condividono la tensione). Inoltre, come già indicato, lo stesso core assicura che il thread ottenga tutta la potenza di elaborazione disponibile. Poiché tale core è già utilizzato al 100%, il sistema operativo pianificherà altri thread su altri core meno utilizzati.
David Balažic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.