Quando si parla di sistemi operativi il concetto di concorrenza è importante perché fa riferimento all’abilità di eseguire contemporaneamente un insiemi di processi o sottoprocessi (thread).
Un tempo i processori utilizzati nei computer utilizzavano un singolo core ovvero una sola unità computazionale.
Nell’articolo in cui spieghiamo in breve come funziona un processore abbiamo visto che la CPU, unità centrale di elaborazione, è formata da un insieme di componenti: ALU (unità aritmetica e logica), registri, cache e così via.
Le moderne CPU multi-core non integrano più un solo core ma ne abbinano diversi: cioè significa che le unità fondamentali che costituiscono il processore sono “replicate” in più entità fisiche, i core appunto.
Ogni core che gestisce uno specifico compito lo fa in maniera indipendente rispetto agli altri core che possono lavorare su compiti diversi. Più core permettono alla CPU di lavorare su più compiti senza soluzione di continuità.
I core di un processore sono di per sé unità di elaborazione individuali. Essi condividono alcune risorse come la cache L3 (in un altro articolo vediamo cos’è e come funziona la cache del processore), i controller di memoria e l’interfaccia di sistema che si collega ad altri dispositivi; tuttavia l’ALU, l’unità di controllo e la cache L1/L2 sono disponibili in ogni singolo core.
Per anni i produttori di processori hanno fatto a gara sfidandosi a colpi di MHz per fare in modo che la CPU più potente fosse contraddistinta anche dalla frequenza di clock più elevata. Il quadro è cambiato è l’attenzione è stata spostata sulla progettazione e realizzazione di processori multi-core.
I core di un processore e i thread: differenze
Con i processori single-core e i vecchi sistemi operativi in qualsiasi momento c’era solo un singolo processo in esecuzione.
Con l’aggiunta della parallelizzazione i compiti che devono essere eseguiti nell’ambito di un processo sono suddivisi in sottoparti e più CPU (alcune schede madri, soprattutto destinate a sistemi server, dispongono di più socket capaci di accogliere più di una CPU) o più core elaborano ogni “sottocompito” in contemporanea.
Un singolo core può essere suddiviso in unità di elaborazione virtuale note come thread o processori logici: i core aumentano la quantità di lavoro svolto nell’unità di tempo mentre i thread migliorano il throughput, la velocità di calcolo.
I core sono un componente hardware reale mentre i thread sono un componente virtuale che gestisce i compiti assegnati.
Grazie al multithreading (HyperThreading nel caso di Intel; SMT, Simultaneous multithreading per AMD) il lavoro svolto da ogni singolo core può essere ulteriormente suddiviso. Le sottounità di elaborazione “thread” permettono ai singoli core di lavorare essenzialmente su due compiti alla volta.
Ogni processo che la CPU esegue viene assegnato a un thread e ogni core può avere due thread con il multithreading abilitato. Questo significa che una CPU a quattro core con il multithreading abilitato avrà otto thread.
Il multitasking è un concetto fondamentale nei computer moderni: grazie ad esso si può lavorare contemporaneamente su più applicazioni mantenute aperte in simultanea, avere più schede del browser aperte, guardare video e molto altro ancora.
In background vengono inoltre mantenuti in esecuzione un’ampia schiera di applicazioni e servizi che devono comunque essere gestiti dalla CPU.
Processi cruciali in ambito professionale come la codifica dei dati, il rendering, l’apprendimento automatico o le elaborazioni su grosse moli di informazioni richiedono molti core capaci di svolgere i calcoli contemporaneamente.
Un numero maggiore di core permette di eseguire più applicazioni contemporaneamente, poiché ogni core gestisce un diverso flusso di dati sui suoi thread.
Nei processore single-core gli algoritmi di scheduling fanno apparire un computer come in grado di supportare il multitasking ma si tratta di un artificio che permette alla CPU di gestire più processi “quasi contemporaneamente” passando dall’uno all’altro in modo molto veloce.
Accennavamo in precedenza alla sfida da produttori che non facevano che aumentare la velocità di clock da una generazione all’altra dei loro processori.
Man mano che la velocità di clock diventava sempre più alta crescevano i consumi energetici e la necessità di usare soluzioni per la dissipazione del calore ancora più efficaci.
Con l’aumentare della concorrenza tra processi a livello di sistema operativo il problema del Context Switch Overhead, ovvero il ritardo che viene introdotto quando la CPU deve passare da un compito ad un altro, cominciava a diventare sempre più rilevante.
L’approccio multi-core, che permette di suddividere i compiti in maniera efficiente, ha permesso di risolvere il problema.
Se utilizziamo processori a più core perché le prestazioni in single-core sono importanti?
L’utilizzo di più core nello stesso chip ha permesso di ottimizzare il concetto di multitasking e migliorare significativamente le prestazioni dei moderni computer.
Ma se si parla ormai di CPU multi-core perché le prestazioni in single-core continuano a essere importanti e perché vengono sempre citate nei benchmark?
Le prestazioni in single-core sono comunque molto importanti ancor oggi perché sono tante le applicazioni che utilizzano pesantemente un singolo core e non si adattano alla distribuzione dei compiti tra più core.
Le performance in single-core sono quindi la spia del comportamento di un singolo core che compone il processore.
Spesso si guarda alla frequenza di clock (espressa in GHz) del singolo core come misura delle sue prestazioni. In realtà le prestazioni individuali dei core della CPU dipendono da una miriade di fattori che vanno ben oltre la velocità di clock: il design del core, l’architettura usata, la dimensione dei transistor, la memoria cache e molto altro.
Le prestazioni in multi-core, viceversa, indicano come si comportano i core del processore quando lavorano insieme.
Anche se un software utilizzasse un singolo core sui nostri computer abbiamo talmente tante applicazioni contemporaneamente in esecuzione che l’utilizzo di un’architettura multi-core offrirà comunque benefici tangibili in termini prestazionali.
Attività come la modellazione e il rendering 3D richiedono una mole enorme di calcoli in parallelo. La stessa cosa vale per la virtualizzazione, la simulazione, l’editing e la codifica video. In questi contesti l’utilizzo di processori a più core si fa sentire in modo più incisivo.
La progettazione di un chip che funziona a frequenze di lavoro molto elevate e che allo stesso tempo consta di un elevato numero di core è tecnicamente fattibile ma si tradurrebbe in un processore con un TDP (Thermal Design Power) e un consumo enormi. Un dispositivo che richiederebbe un sistema di dissipazione molto costoso, contraddistinto da un consumo energetico elevatissimo che raccoglierebbe scarsissimo interesse sul mercato.
Dove trovare il numero di core e thread in Windows
Accedendo al Task Manager di Windows (si può premere la combinazione di tasti CTRL+MAIUSC+ESC
e cliccare eventualmente su Più dettagli) è possibile verificare da quanti core fisici e logici è formata la CPU che si utilizza.
Con un clic sulla scheda Prestazioni quindi su CPU nella colonna di sinistra, in basso è possibile trovare l’informazione Cores e Processori logici.
I primi sono appunto i core di cui dispone il processore installato sulla macchina, i secondi sono i thread ovvero le unità logiche che permettono di meglio gestire i compiti assegnati.
Se il valore di Cores e Processori logici fosse lo stesso significa che il processore in uso sulla macchina non supporta il multithreading.
La voce Thread nel Task Manager non ha nulla a che vedere con il numero di processori logici. Tale informazione fa riferimento alle porzioni di codice dei processi in esecuzione alle quali il sistema operativo assegna una parte delle risorse computazionali del processore installato nel computer. Dal punto di vista del sistema operativo un thread può eseguire qualsiasi parte del codice del processo, incluse le parti attualmente eseguite da un altro thread.
L’indicazione Thread del Task Manager dà un’idea di quante porzioni di codice sono contemporaneamente in esecuzione e attendono via via di essere gestite da parte del processore.
In un altro articolo abbiamo visto come scegliere il miglior processore per notebook mentre le sigle dei processori già descrivono molto delle caratteristiche di ciascun prodotto.
Per confrontare le prestazioni e le caratteristiche dei processori suggeriamo la classifica di PassMark aggiornata quotidianamente. Si parte dai processori di fascia più alta, compresi quelli destinati ai sistemi server, per arrivare ai modelli per i dispositivi più economici.
Come si vede processori che spingono al limite le frequenze di clock non sono necessariamente più performanti di prodotti basati su un’architettura più recente.
Interessantissimo anche il grafico che mostra i processori migliori per rapporto prezzo-prestazioni attualmente disponibili sul mercato.
Valutare le prestazioni di un processore senza usare software di terze parti
Sin dai tempi del lancio di Windows 7 Microsoft ha introdotto nel suo sistema operativo un software chiamato Strumento di valutazione sistema Windows.
Ne già parlato nell’articolo contenente le indicazioni su come misurare le prestazioni del computer Windows e nel successivo approfondimento dedicato al recupero e alla rivitalizzazione di un vecchio PC.
Anche in Windows 10 e in Windows 11 è possibile generare una valutazione complessiva della configurazione del sistema: basta premere Windows+R
quindi digitare winsat formal -restart
nel campo Apri.
Si aprirà una finestra a sfondo nero all’interno della quale verranno avviati una serie di test su tutte le componenti del sistema in uso, processore compreso.
Le prestazioni del processore vengono valutate richiedendo in sequenza una serie di attività di codifica e compressione dei dati.
Per accedere al responso finale si può premere Windows+R
e digitare powershell Get-CimInstance Win32_WinSAT;pause
.
Accanto a CPUScore si leggerà la valutazione assegnata al processore dallo strumento integrato in Windows.
Premendo Windows+X
, selezionando Windows PowerShell in Windows 10 oppure Terminale Windows in Windows 11 e incollando quanto segue si potranno leggere i dati elaborati in MB/s nelle varie fasi di compressione e cifratura dal processore:
$path = Get-ChildItem -Path 'C:\Windows\Performance\WinSAT\DataStore\*Formal.*.xml' | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 -ExpandProperty FullName
$xml = [xml]::new()
$xml.Load($Path)
clear
$xml.WinSAT.Metrics.CPUMetrics.CompressionMetric
$xml.WinSAT.Metrics.CPUMetrics.EncryptionMetric
$xml.WinSAT.Metrics.CPUMetrics.CPUCompression2Metric
$xml.WinSAT.Metrics.CPUMetrics.Encryption2Metric
$xml.WinSAT.Metrics.CPUMetrics.CompressionMetricUP
$xml.WinSAT.Metrics.CPUMetrics.EncryptionMetricUP
$xml.WinSAT.Metrics.CPUMetrics.CPUCompression2MetricUP
$xml.WinSAT.Metrics.CPUMetrics.Encryption2MetricUP