Asynchronous Shaders nelle DirectX 12, AMD promette miglioramenti prestazionali

Gli Asynchronous Shaders permettono di usare la GPU in modo più efficiente, a tutto vantaggio di esperienze come la realtà virtuale. Sono una parte delle DirectX 12, ma anche dell'API Vulkan e di Mantle.

Avatar di Manolo De Agostini

a cura di Manolo De Agostini

AMD ha lavorato a stretto contatto con Microsoft sull'API DirectX 12 integrata in Windows 10 e per questo ha deciso di offrire qualche dettaglio su come le schede video Radeon supporteranno le novità contenute in questa libreria. L'azienda ha parlato di "Asynchronous Shaders", un modo differente e più efficiente di gestire code di operazioni (task) rispetto a quanto possibile con le vecchie API.

Con le DirectX 11 sono due le modalità principali per sincronizzare lo scheduling delle operazioni: multi-threaded graphics e multi-threaded graphics con pre-emption (prelazione) e prioritization (priorizzazione), ognuna con i propri vantaggi e svantaggi. Prima di proseguire è bene soffermarsi su alcuni termini.

asynchronous shaders directx 12 amd 02

Gli shader della GPU si occupano di disegnare l'immagine, calcolare la fisica dei giochi, eseguire il post-processing e altro, e fanno ciò sulla base di varie operazioni che sono state assegnate loro da un "command stream", un flusso di comando, che è la coda principale dei comandi, quella con i compiti che gli shader devono svolgere. Il command stream viene generato dalla fusione di singole code di comandi, che consistono di più compiti e spazi vuoti, che possono essere viste anche come delle "pause".

Questi spazi vuoti nella coda esistono perché nella grafica multi-threaded le operazioni in una singola coda non sono generate una dopo l'altra; le operazioni in una coda a volte sono generate solamente dopo quelle in un'altra coda. A causa di questi spazi, una singola coda non può usare gli shader al massimo del loro potenziale.

asynchronous shaders directx 12 amd 05

In genere ci sono tre code di comandi: la coda grafica, la coda di calcolo e la coda di copia. Il modo più semplice per descrivere come funziona la grafica multi-threaded sincrona è che vederla come code dei comandi che vengono fuse passando tra loro a intervalli di tempo - una coda entra nel flusso di comandi principali per poco tempo, poi tocca alla successiva e così via. Perciò, gli spazi di cui scrivevamo prima sono ancora presenti nella coda dei comandi centrale, il che significa che la GPU non funzionerà mai effettivamente al 100%.

Inoltre, se arriva un'operazione urgente, deve fondersi con la coda comandi e attendere che il resto delle code di comando terminino l'esecuzione. Un altro modo di pensare a tutto questo è fare un esempio di vita reale, con più code di automobili davanti a un semaforo e che poi si fondono in una sola corsia.

asynchronous shaders directx 12 amd 06

Questo porta alla nascita di pre-emption (prelazione) e prioritization (priorizzazione), che lavorano esattamente nello stesso modo della grafica multi-thread sincrona, salvo per il fatto che il punto di fusione darà priorità ai compiti urgenti. Inoltre, la coda centrale dei comandi può essere messa in pausa per dare spazio a un'operazione urgente, permettendoli di essere eseguita con la latenza minore possibile.

Il problema però è che tutte le altre operazioni devono essere messe in pausa, e questo può portare a problemi prestazionali legati allo "switching overhead". Inoltre, il problema con gli spazi rimane, perciò c'è ancora spazio per miglioramenti prestazionali. Potete idealizzare tutto questo come il semaforo citato prima, ma con la possibilità di creare un passaggio di emergenza per delle ambulanze.

asynchronous shaders directx 12 amd 07

Nelle DirectX 12, invece, è disponibile un nuovo metodo di fusione chiamato Asynchronous Shaders, che fondamentalmente è grafica multi-threaded asincrona con pre-emption (prelazione) e prioritization (priorizzazione). Ciò che avviene in questo caso è che gli ACE (Asynchronous Compute Engine) delle GPU Graphics Core Next di AMD eseguono l'interforgliamento (interleave) delle operazioni, chiudendo gli spazi in una coda con le operazioni di un'altra, un po' come fondere due file di auto su un'autostrada.

Questa operazione, utilissima, permette comunque spostare la coda dei comandi principale lateralmente per lasciare strada ai compiti prioritari - se necessario. Tutto questo, ovviamente, porta a un miglioramento delle prestazioni.

Sapphire R9 285 Sapphire R9 285

Sulle GPU Graphics Core Next di AMD ogni ACE può gestire fino a otto code e ogni ACE può indirizzare la propria quota di shader. Le GPU di fascia più bassa hanno due ACE, quelle di fascia alta ne contengono otto. Per rendere queste parole tecniche più chiare, AMD ci ha mostrato un sample di tecnologia LiquidVR, che funzionava a 245 FPS con Asynchronous Shaders e post-processing disattivati. Con post-processing abilitato, il frame rate è sceso a 158 FPS, ma abilitando Asynchronous Shaders e post-processing il framerate è salito a 230 FPS, quasi alla pari con l'originario. Probabilmente AMD ci ha illustrato lo scenario migliore, ma significa che potete avere effetti di post-processing quasi senza impatto prestazionale.

###65144###

In ogni caso, la ragione per cui Asynchronous Shaders sono interessanti riguarda il miglioramento prestazionale. Non solo consentono di chiudere tutti gli spazi nella coda per migliorare le prestazioni, ma riducono anche timing e latenza, grazie al modo in cui gli ACE riempiono la coda e gestiscono le operazioni.

Il maggiore parallelismo e il margine nuovamente disponibile permetteranno ai frame di arrivare a schermo persino più velocemente, il che può essere molto interessante per una tecnologia come la realtà virtuale che richiede risoluzioni elevate con un'esperienza visiva confortevole. Il frame rate deve essere inoltre più alto per ridurre mal di testa, minimizzare la nausea e aumentare l'immersione.

asynchronous shaders directx 12 amd 10

Insomma servono GPU più potenti che mai, ma non solo: i core grafici devono essere usati anche in modo più efficiente. Questo è sia lavoro di AMD che di Microsoft. Dalla sinergia delle due dovrebbe nascere il miglior supporto possibile. Durante il briefing, un portavoce di AMD ha detto che non di aver traccia di queste informazioni legate al supporto da parte dei suoi concorrenti, ma sappiamo che Nvidia è sempre molto "silenziosa" riguardo i prodotti non annunciati.

Va fatto notare, tuttavia, che Asynchronous Shaders non è qualcosa che ritroveremo solo nelle DirectX 12: farà parte anche della nuova API Vulkan nonché di LiquidVR. Inoltre è già parte integrante dell'API Mantle.