PC Stuff: Cos'è il Bottleneck?


Recenti discorsi su vari lidi, mi han portato alla scrittura di questo articolo e forse di altri a scopo divulgativo. Oggi parleremo del famoso Bottleneck, termine un po' abusato senza capirne spesso le vere meccaniche. Dopo il salto, preparatevi ad un buon textwall.




Bottleneck è un termine inglese che viene tradotto nella lingua di Dante con "Collo di Bottiglia".
Il collo della bottiglia è una parte fondamentale dell'utilizzo dei contenitori di liquidi nella vita di tutti i giorni. La forma restringente permette di limitare il flusso del liquido in uscita, permettendo di avere maggior controllo sul suo dosaggio.

Il termine viene però utilizzato nel mondo del PC per esprimere in maniera concisa un altro concetto universale: un sistema è tanto veloce quanto il suo componente più lento. Se consideriamo un computer come il sistema ed il flusso di dati come viaggiante in un'unica direzione che attraversa tutti i suoi componenti, le performance sono limitate dal componente più lento.
Questo è molto semplice da intuire quando abbiamo a che fare con i caricamenti di giochi e programmi. Passare da un Hard Disk meccanico ad un SSD, velocizza incredibilmente il computer, pur lasciando inalterati tutti gli altri componenti. Questo perché l'Hard Disk è il collo di bottiglia durante i caricamenti. Quando però si va a parlare di come interagiscono Processore, Memoria di sistema e Scheda grafica, si crea parecchia confusione, quindi ho pensato di cercare di fare un po' di chiarezza.

Bisogna prima capire bene la funzione dei componenti. Per capire meglio come sono costruiti e quali sono i loro compiti, consiglio di leggere i miei articoli Sotto la Scocca che ho scritto per NintenOn. Uno per la CPU ed uno per Memoria e GPU. La versione ridotta che serve per spiegare i colli di bottiglia è la seguente.

Anche le memorie influiscono sui colli in svariati modi, ma escludiamole per semplificarci il lavoro

La CPU ha il compito di calcolare la logica di gioco e di capire cosa c'è nell'immagine da disegnare per mandare tutti i comandi necessari alla scheda grafica, eseguendo quello che sono chiamate in gergo Draw Call. Il primo punto, è generalmente indipendente dal dettaglio grafico del gioco, in quanto il gioco, sia esso a 720p al minimo che in 4k al massimo, rimane lo stesso. Il secondo punto invece può variare. Aumentare la distanza visiva degli NPC in un gioco open world porta alla presenza di più oggetti su schermo e quindi di più comandi da preparare. Ma l'impatto che si ha sulla CPU è generalmente inferiore rispetto al carico che si crea sulla scheda grafica. La GPU invece ha il compito di prendere tutti i dati base ricevuti dalla CPU e fare i calcoli necessari per disegnarli.

Il frame è l'unità di nella quale viene discretizzato il tutto ed ogni frame viene preparato uno alla volta, in sequenza. Il framerate, cioè il numero di frame che si hanno in un secondo, si riflette sul tempo che i componenti hanno a disposizione per poter eseguire le operazioni. Giocare a 60fps, vuol dire che sia il processore che la scheda grafica  hanno 16.6ms per eseguire tutte le loro operazioni. Quando uno dei due componenti non riesce a finire in questo budget temporale, il componente più veloce deve aspettare quello più lento e quindi si crea un bottleneck che porta ad un calo prestazionale.

Osservate con attenzione l'immagine sottostante. (clickateci sopra per ingrandirla) Saperne leggere i dati è fondamentale per capire il comportamento del bottleneck.




Il gioco in questione è Final Fantasy XV, del quale è disponibile una demo gratis dallo store di Steam. Il programma usato per ottenere le statistiche è Msi Afterburner. Ricordiamo che il mio computer ha un i5-2500k a frequenze stock, una gtx 970 ed 8GB di RAM 1333MT/s.

La parte di sinistra mostra cosa vuol dire avere Bottleneck da parte della CPU. Il dettaglio grafico è impostato al minimo. Come potete vedere l'utilizzo della CPU è al 100% su tutti e 4 i core, mentre l'utilizzo della scheda grafica è al 77%. Il processore raggiunge il limite massimo prima della scheda grafica e non può rifornirla in modo adeguato di istruzioni. La maggiore velocità della GPU è quindi sprecata, tenuta a freno dalla minore velocità del processore. Il gioco riesce quindi ad andare a 78fps. Attenzione perché FFXV è un gioco in grado di usare molti core bene.

 Se un gioco fa fatica ad usare più core, potete incorrere in bottleneck anche se si ha 1 solo core maxato e gli altri stanno fermi a fare nulla. 1 core al 100% su un quad core, risulterebbe in un utilizzo totale del 25%, quindi non fatevi trarre in inganno dall'utilizzo totale della CPU, ma guardate i singoli core. A volte nessuno dei core raggiunge il 100% nonstante la CPU freni la GPU ed in quel caso è da imputare al codice stesso del gioco o alla velocità della RAM che frena la CPU.

La parte destra invece mostra un Bottleneck di GPU. Qui il gioco è fatto girare a dettagli massimi e la GPU non riesce a disegnare l'immagine nei 16ms richiesti per ottenere 60fps e riesce solamente a fornire 32fps. Il processore in questo caso lavora al 59%. Non può lavorare più velocemente perché la GPU è già caricata al massimo e quindi può permettersi di lavorare di meno.

Come si possono ridurre questi Bottleneck quindi? Per la GPU basta diminuire il livello di dettaglio fino a quando non si ottiene una framerate più alto. Diminuire mano a mano il carico sulla GPU porta ad un aumento progressivo del carico sul processore. Più velocemente può una scheda grafica disegnare frame, più velocemente il processore deve prepararli. Quando non si riesce a raggiungere il giusto equilibrio, occorre migliorare il proprio hardware. RAM più veloci, overclock su CPU o GPU o componenti più performanti. Oppure è necessario imporre "bottleneck" esterni come un blocco al framerate a 30fps per esempio. In questo caso il sistema si regola per ottenere ogni frame in 33.3ms e CPU e GPU se sovradimensionate rispetto al framerate target, lavorano senza incorrere in bottleneck tra di loro.


In quest'immagine, con un limite del framerate a 30fps, né il processore né la scheda grafica raggiungono il 100% di utilizzo e nessuna delle due è frenata dall'altro. Siamo in una condizione di "equilibrio".

Ricordate che ogni gioco ed ogni motore grafico carica in modo diverso i suoi componenti e pertanto il bottleneck può variare da gioco a gioco. In FFXV per esempio il processore subisce spike elevati di utilizzo ogni qual volta si inizia a muoversi in giro perché deve gestire lo streaming degli asset e lo spostamento di grossi dati tra le memorie, cose che in un gioco lineare non sono richieste.

Se avete dubbi, curiosità o perplessità, usate pure i commenti.

Stay Classy, Internet.

Nessun commento:

Posta un commento

01 09 10