NVIDIA GeForce GTX 1080 Founders Edition: la nuova top di gamma

Presto in vendita la nuova scheda video NVIDIA per i videogiocatori più esigenti, basata su architettura Pascal. Potenza di calcolo elevatissima che si abbina a un funzionamento silenzioso e con consumo contenuto, merito sia del chip GP104 sia del design della scheda curato da NVIDIA
di Rosario Grasso , Paolo Corsini pubblicato il 17 Maggio 2016 nel canale Schede VideoNVIDIAGeForcePascal
Asynchronous Compute
Questo passaggio è fondamentale per le prestazioni dei giochi in DirectX 12 e dei giochi su Windows 10. GTX 1080 supporta in maniera esaustiva Asynchronous Compute e gestisce il bilanciamento di carichi di lavoro (ovvero il concetto alla base delle API di nuova generazione, Vulkan e Mantle compresi) in hardware, così come la preemption (prelazione di risorse) a livello dei pixel e delle istruzioni.
Unità di questo tipo in hardware sono ormai cruciali per gli hardware di ultima generazione dedicati ai videogiochi perché questi ultimi stanno diventando sempre più complessi richiedendo al sistema una vasta moltitudine di calcoli, indirizzati a differenti tipi di esigenze. Sfruttare le disponibilità hardware in maniera quanto più parallelizzata e impedire che la GPU rimanga inoperosa, quindi, diventa cruciale: è un compito che si può svolgere al meglio solamente in presenza di un'unità di Async Compute in hardware che si occupi di bilanciare il carico di lavoro tra le risorse di calcolo della GPU. Queste devono lavorare in maniera dipendente, "asincrona" per l'appunto, in modo da contribuire al rendering dell'immagine finale senza "pestarsi i piedi tra di loro" e senza dover aspettare che un'altra risorsa porti al termine il proprio lavoro.
Fra i tipi di lavori assegnati alle risorse della scheda video potremmo trovare la fisica basata sulla GPU ed elaborazione dell'audio tridimensionale, così come il post-processing degli effetti visivi dei frame già renderizzati e il cosiddetto Asynchronous timewarp, una tecnica utilizzata per la grafica in VR di cui parleremo diffusamente più avanti.
Si parla, quindi, della capacità per la GPU di elaborare istruzioni provenienti dalla CPU in maniera parallela senza dover rispettare una pipeline troppo rigorosa. Il bilanciamento dinamico delle risorse della GPU mantiene la GPU sempre attiva e riduce i tempi di calcolo rispetto all'approccio dello Static Partitioning utilizzato da Maxwell. La precedente architettura di NVIDIA, infatti, si limitava semplicemente a suddividere i tipi di carichi di lavoro tra quelli necessari per l'elaborazione della grafica e quelli necessari per i calcoli generici. Il che poteva essere efficiente solamente in quei casi in cui i due tipi di operazioni si presentassero nella stessa quantità. Se, invece, i calcoli generici richiedevano più tempo, la parte di risorse assegnate a quelli più prettamente grafici andava in idle e risultava momentaneamente sprecata.
Il bilanciamento dinamico in hardware tenta, invece, di distribuire ogni esigenza di calcolo a tutte le risorse disponibili in quel momento. Il ragionamento fatto finora, d'altronde, vale per quei casi in cui non ci sia un'esigenza più impellente di altre, mentre ci possono essere situazioni di gioco per cui un aspetto grafico deve risultare pronto prima degli altri o prima del refresh dello schermo nella condizione di V-Sync attivato, perché in caso contrario si perderà un frame. In questi frangenti è fondamentale l'unità di preemption.
Per ogni comando di rendering impartito dal motore grafico del gioco ci possono essere potenzialmente centinaia di draw call al sistema video e ognuna di esse può contenere centinaia di triangoli. Ogni triangolo, a sua volta, contiene solitamente centinaia di pixel a cui devono essere applicati effetti di shading e infine renderizzati nella forma finale. Una GPU che lavora senza logiche di Async Compute porta a termine in ordine tutte queste operazioni prima di passare a task successivi, e questo può comportare ritardi importanti nel rendering.
Per superare questo problema, Pascal implementa un'unità di Pixel Level Preemption. Questa serve a tenere traccia dei progressi intermedi fatti nel lavoro di rendering: quindi, nel momento in cui viene richiesta una prelazione perché un elemento della grafica serve prima degli altri, si può fermare il lavoro precedente, salvarne lo stato in un buffer e spostarsi momentaneamente su altro.
Per far capire bene come funziona il meccanismo, NVIDIA porta il seguente esempio. Nel buffer dei comandi tre draw call sono già state eseguite, una è attualmente in elaborazione e due sono in attesa. La draw call in elaborazione si compone di sei triangoli, tre dei quali sono già stati processati, uno è in rasterizzazione e due in attesa. La scheda video è a metà del processo di rasterizzazione del quarto triangolo quando sopraggiunge una richiesta di elaborazione. In questo frangente, quindi, rasterizzatore, shading del triangolo e buffer dei comandi vengono contemporaneamente bloccati e il loro stato viene salvato. I pixel che sono già stati rasterizzati vengono spediti all'unità di pixel shading e processati parallelamente, mentre le risorse della GPU assegnate all'incarico più urgente.
Come detto, parallelamente alla Pixel Level Preemption, Pascal gestisce anche la Thread Level Preemption, la quale funziona in maniera del tutto speculare alla precedente, ma si occupa di operazioni di tipo General Purpose piuttosto che della rasterizzazione di pixel e che quindi consente un miglioramento sensibile delle elaborazioni anche con i task di elaborazione relativi a CUDA. Per le esigenze di calcolo della grafica dei giochi, Pascal riesce a interrompere in qualunque momento i processi di calcolo relativi a pixel e a thread per focalizzarsi sulle esigenze più impellenti. Un approccio del genere ovviamente richiede la memorizzazione di un maggior numero di registri e quindi di una consistente quantità di stati, visto che il lavoro già svolto ovviamente non deve essere perduto.
Uno degli esempi più calzanti quando si parla di prelazione è il già citato Asynchronous Timewarp. Il sistema di prelazione tradizionale agisce in maniera molto conservativa, interrompendo il flusso di lavoro con grande margine rispetto al momento in cui la GPU deve "consegnare" al video il frame per il refresh successivo. Con un doppio sistema di prelazione per i pixel e per i thread come quello in dote di Pascal, invece, la GPU è in grado di "fermarsi" più tardi e in maniera più deterministica e di sfruttare il tempo di calcolo così guadagnato per renderizzare più oggetti nella schermata di gioco.