Il ruolo della CPU – Sotto la Scocca

Condividi l'articolo

Ad ogni nuova console che si affaccia sul mercato, iniziano come di consueto le discussioni sui sogni e sulle speranze che i giocatori ripongono nella nuova macchina. Sempre più negli ultimi anni si stanno diffondendo discorsi di natura tecnica, con gente che desidera questa o quella potenza senza però avere un’idea ben precisa di come tutto funziona all’interno della console. Con questa serie voglio provare a fare luce su alcuni dei misteri e dei meccanismi di funzionamento dell’hardware e come questo viene sfruttato per portare alla luce le esperienze che tutti amiamo o odiamo.
L’elemento più importante di un videogioco è l’esperienza. Questa deriva dalla somma di tutti gli elementi che normalmente vediamo divisi, come il gameplay, l’audio, la storia, la grafica, il level design e via dicendo. Tutte queste cose però non esistono nel vuoto, ma vengono eseguite da macchine, che hanno determinate caratteristiche hardware che influenzano direttamente tutti gli elementi che possono essere generati. Ma qual è il legame tra hardware e videogioco? Io lo vedo un po’ come quello che lega un compositore agli strumenti musicali. Più note ho a disposizione, più capacità di espressione ho. Posso sì creare una grande melodia anche con un controfagotto che va da 30 a 200Hz, ma se ho un pianoforte, che va da 27,5 a 4100Hz ho semplicemente più possibilità e posso esprimermi in modo più complesso, più completo.

blockdia_wiiu_full
Il diagramma a blocchi dei componenti del Wii U e come sono collegati. La CPU è solo “Espresso”

In una console da gioco ci sono due elementi fondamentali che svolgono i calcoli matematici e logici necessari a dare la vita ai videogiochi: la CPU e la GPU. In questo primo articolo punterò l’attenzione sull’elemento forse meno considerato in tutti i discorsi del web: la CPU, l’unità di calcolo centrale, cosa ben strana a mio avviso, in quanto la CPU è la vera anima di una console ed è grazie alla sua evoluzione che è possibile fare un salto generazionale. Questa è la visione di Mark Cerny, il capo architettura della Playstation 4, che collega un salto generazionale al miglioramento del processore e ad un aumento massivo della capacità di memoria.
Questo perché? La risposta è molto semplice: il processore governa ogni aspetto del gioco che non sia il disegno diretto dell’immagine ed in un videogioco questo carico di lavoro è molto. Quando noi giocatori premiamo il tasto A per far saltare Mario su un nemico, il processore deve andare a trovare l’animazione del salto, fare i calcoli della fisica del salto e dell’impatto con il nemico, gestire l’intelligenza artificiale nel nemico, trovare tutti i file audio necessari e dire all’unità grafica cosa deve andare a disegnare. Immaginate questo processo in un Mario Kart invece, dove da tenere sott’occhio ci sono tutti i piloti, ognuno dei quali può usare un oggetto. È facile capire come maggiore è la complessità, maggiore è la richiesta della CPU ed ovviamente è vero l’opposto: maggiore potenza ha la nostra CPU, più possiamo permetterci complessità in un mondo di gioco.
multitreaded-rendering
Carico di lavoro su 6 core. I riquadri arancioni indicano lavori legati alla grafica, quelli grigi sono IA, Fisica e Logica

Ovviamente una CPU non esiste nel vuoto ma deve lavorare insieme alla GPU. Ci sono due elementi che vincolano le due componenti. Il primo tassello sono le Draw Call, le chiamate al disegno. Praticamente, la GPU non ha la più pallida idea di cosa c’è sulla scena. La CPU deve recuperare tutte le informazioni sui modelli, su quante texture sono ad esso applicate, come sono gestiti i punti luce ed altro ancora. Come sono effettivamente organizzati i dati dipende dal motore grafico in uso, ma in generale più oggetti ci sono sulla scena e più istruzioni la CPU dovrà preparare per la GPU. L’idea nella programmazione sta nell’ottimizzare il flusso delle Call così da non spendere troppo tempo con il processore che prepara e manda istruzioni, e con la GPU che non sa cosa fare mentre aspetta i comandi.
L’altro elemento che lega i due componenti è il framerate obiettivo del progetto. Avere un gioco che va a 60 frame al secondo vuol dire che ogni immagine deve essere preparata entro 16 millisecondi, altrimenti il framerate diminuisce. Sia il processore che la scheda grafica devono fare tutti i calcoli entro questo lasso di tempo. L’equilibrio tra i componenti diventa essenziale, così come una programmazione in grado di aggirare i cosiddetti colli di bottiglia. Prendiamo l’esempio del New Nintendo 3DS. Si passa da 2 core a 268Mhz del vecchio modello a 4 core a 804Mhz. Un aumento di 6 volte. La scheda grafica non è stata toccata e riceve solo 4MB in più di memoria, ma la quantità di dati che può processare rimane la stessa. Hyrule Warriors Legends è forse il migliore esempio. Sul modello precedente infatti ci sono meno nemici a schermo, ma nonostante questo il framerate supera a fatica i 20fps. Su New ci troviamo sui 30 fissi. Questo accade perché la scheda grafica del 3DS non è adeguatamente alimentata dal processore, che deve farsi carico di gestire tutti i nemici su schermo, la loro posizione, come il giocatore interagisce con essi: tutto questo è decisamente troppo e la GPU è costretta ad andare alla velocità del componente più scarso, ad aspettare i comodi del processore. Quindi avere più core ed averli più veloci è sempre meglio?
ubisoft-cloth-simulation-ps4-vs-ps3
Come si può vedere, per eseguire questo codice di calcolo di danzatrici, la CPU della PS3 è più veloce di quella della PS4!

In linea di massima sì, anche se ogni processore ha un suo ciclo di istruzione, ovvero un parametro che indica quanti cicli ci vogliono per eseguire effettivamente un’istruzione, quindi confrontare direttamente le frequenze non è la cosa più corretta da fare. Esistono tanti tipi di processori e la tipologia cambia la logica di programmazione. Si parla spesso di ARM, X86 e per le console anche di PowerPC, ma cosa cambia effettivamente tra essi? Gli elementi che fanno 1+1 sono sempre gli stessi per tutti i processori, il problema è come arrivare a fare 1+1. Dove mettere i dati, come pescarli e muoverli all’interno dei numerosi transistor è ciò che differenzia le architetture. Ci sono in generale due modi per classificare le architetture. Una guarda a che tipo di istruzioni essa esegue e l’altra guarda all’ordine di esecuzione.
Per le istruzioni si distinguono due famiglie: la CISC e la RISC, acronimi inglesi che vogliono dire Complex Instruction Set Computing e Reduced Instruction Set Computing, con X86 facente parte della prima ed ARM della seconda. I processori costruiti per istruzioni CISC hanno un numero molto elevato di transistor e di memorie interne che servono a spostare i dati di continuo per permettere al programmatore di poter chiedere di fare un calcolo complesso con una singola riga di codice, con una sola istruzione. I RISC invece hanno istruzioni molto più vicine alla macchina e questo si traduce nel dover andare a dire cosa fare usando tante micro operazioni, scrivendo quindi più codice. L’aspetto positivo è che dovendo saper fare meno cose, l’architettura è più efficiente. Per questo ARM ha avuto molto successo in ambito mobile. Ora, in linea teorica un discorso del genere vede i processori RISC ottenere performance migliori in quanto possono ottimizzare meglio i singoli processi, mentre con i CISC non posso andare a fondo, anche se l’ottimizzazione richiede più tempo per un programmatore.
in-order-vs-out-of-order
Un esempio grafico della differenza di efficienza tra In Order e Out of Order

Un altro fattore di differenza tra le CPU è l’ordine di esecuzione, che viene distinto in Out of Order e In order. Questo concetto è molto semplice da metabolizzare. L’In Order esegue le operazioni nell’ordine nel quale sono state inviate. In un’esecuzione Out of Order, il processore da solo si rende conto che alcune operazioni sono indipendenti o che sono più lente o veloci e cambia l’ordine di esecuzione al volo per compiere il lavoro nel modo più efficiente. Nel primo caso c’è la possibilità di incontrare stalli perché diversi processi veloci dovranno stare in attesa di altri lenti e questo può portare ritardi. Nel secondo questo problema non c’è, ma il processore deve essere più complesso e più energivoro per funzionare in questo modo.
Tutta bella teoria, ma in pratica? Le differenze tra le architetture che gestiscono la logica sono la causa dei problemi del porting, perché occorre ripensare a come gestire il flusso di dati e la logica del motore di gioco. La grafica è un problema secondario e per certi versi meno importante. Xbox 360 e  Playstation 3 hanno processori RISC ed In Order, a frequenze molto elevate così da sopperire a possibili stalli e la loro velocità permette di eseguire la logica di gioco ad alta velocità. La famiglia Gamecube/Wii/Wii U invece ha sempre fatto uso di processori RISC ma Out of Order, quindi più efficienti a parità di frequenza. Passare dal Nintendo Wii U al Nintendo Switch, che monterà con tutta probabilità un ARM, non è un salto così drammatico per Nintendo, perché è vero che cambiano tutte le istruzioni, ma la logica di programmazione, come dover pensare per superare i problemi nella costruzione di un motore grafico, non cambia molto, passando da un RISC OoO ad un altro RISC OoO. Completamente diverso, invece, il salto da Playstation 3 a Playstation 4, dove cambiano sia logica di istruzione che logica di esecuzione.
final-fantasy-xv-uso-processore
La versione finale di FFXV ha più elementi su schermo della prima demo e performance migliori, grazie allo sfruttamento della CPU

È più facile vedere gli effetti di un “grosso” processore in titoli complessi, con tanti elementi. Nintendo ne ha pochi, quindi è difficile prenderli come esempio. È più facile chiamare in causa un gioco AAA come Assassin’s Creed Unity: nuovo motore di gioco, nuove piattaforme, Parigi riprodotta nei minimi dettagli, folla dinamica e dettagliata, e un’IA di navigazione di massa e non solo individuale che, stando ad alcune dichiarazioni, richiedevano troppe draw call dal processore, con conseguente crollo del framerate. La folla metteva sotto duro stress il processore ma meno su Xbox One che su PS4, merito di quei 175Mhz in più per core. Con il gioco successivo, Syndicate, Ubisoft ha creato una Londra forse meno popolata rispetto alla gigantesca folla parigina di Unity. Il gioco ha performance migliori, ma si è dovuti scendere a compromessi, a dover forse attenuare una visione.
Dovremmo sognare ed immaginare queste possibilità quando “vogliamo” un processore più performante da una nuova console. Mondi più complessi, più vivi, distanze visive maggiori, schermi con più “roba”, per farla breve. Io sono un appassionato di giochi strategici, e adoro gli scontri di massa tra tantissime unità e certe cose sono possibili in modo grandioso solo se sotto la scocca c’è un processore adeguato, in grado di stare dietro a tutte le singole unità con i loro movimenti, i loro effetti, la loro logica, la loro fisica. Volete più Pikmin su schermo, con intelligenza più dinamica e maggiore interazione con l’ambiente? Meglio avere una CPU potente sotto la scocca.

Potrebbero interessarti