Confronto su DirectX 12: AMD vs NVIDIA

Confronto su DirectX 12: AMD vs NVIDIA




Introduzione

dx12DirectX 12 è qui ed i primi incoraggianti risultati stanno arrivando, mostrando a tutti che quella che fino a ieri era considerata pura fantasia è invece realtà. Il rilascio su Steam in early access di Ashes Of The Singularity, il nuovo RTS di Stardock basato interamente su questa nuova API, ha dato al mondo la possibilità di vedere come questa si comporta “sul campo”. I primi benchmark sembrano conferire un vantaggio ad AMD su NVIDIA, ribaltando convinzioni e luoghi comuni e obbligandoci a riflettere. Facciamo dunque il punto della situazione, analizzando le differenze tra le architetture di entrambi i produttori sotto due diversi aspetti: GPU computing e gaming.

La sfida nel GPU computing

Una GPU non è altro che un processore specializzato nell’eseguire determinati tipi di calcoli: Per fare un esempio una CPU può eseguire calcoli in virgola mobile, ma non è specializzata per eseguire trasformazioni che coinvolgono matrici multi-dimensionali. Operazioni di questo tipo comportano l’esecuzione parallela di migliaia di calcoli. Una CPU possiede un numero ristretto di core complessi, mentre una GPU possiede un numero molto maggiore di unità parallele, ma più semplici, in grado di svolgere efficientemente questo tipo di calcoli. Questo fantastico video vi offre una spiegazione visuale ed immediata di come lavora una GPU rispetto ad una GPU. Guardandolo, potete farvi un idea del perché, nell’eseguire operazioni di elaborazione grafica (e altri compiti assimilabili a quest’ultima) una GPU è centinaia o migliaia di volte più efficiente di una GPU.

gpgpuLa GPGPU (General-Purpose computing on Graphics Processing Units) è branca dell’informatica che si occupa dell’utilizzo del processore della scheda grafica, vale a dire la GPU, per scopi diversi dalla tradizionale creazione di un immagine tridimensionale. Sia AMD che NVIDIA hanno supportato il GPGPU con differenti approcci. Attualmente AMD supporta il GPU Computing tramite la sua architettura GCN mentre Nvidia tramite la tecnologia denominata CUDA. Vediamo di cosa di tratta.

GCN/OPENCL

GCN (Graphic Core Next) è il nome in codice di una famiglia di micro-architetture GPU sviluppate da AMD a partire dal 2011, introdotte con la serie Radeon HD 2000. Questa tecnologia rientra nel campo RISC/SIMD. L’acronimo RISC (Reduced Instruction Set Computing) indica che il processore riconosce un limitato set di istruzioni di basso livello piuttosto che un ampio set di istruzioni di alto livello (CISC), mentre SIMD (Single Instruction-Multiple Data) è un modello di computazione parallelo, definito anche parallelismo a livello dati, in cui processori multipli eseguono le stesse istruzioni ma su differenti porzioni di dati.

Ma a cosa può servire eseguire contemporaneamente le stesse istruzioni su differenti set di dati? Ad esempio, modificare la luminosità di un immagine richiede la modifica dei 3 valori di colore R, G e B che compongono un singolo pixel. L’operazione (la somma di un valore) è la stessa ma può velocizzata eseguendola simultaneamente su 3 parti diverse (le componenti colore) dello stesso

Il SIMD è dunque diverso dal parallelismo comunemente inteso, ovvero quello offerto dalla CPU o SMT (Simultaneous Multiple Threads), in cui abbiamo processori diversi che eseguono istruzioni diverse su dati diversi. Come è facile intuire, non tutti gli algoritmi possono essere adattati facilmente per trarre vantaggio da questo tipo di computazioni, ma quelli riguardanti l’elaborazione delle immagini vi si prestano particolarmente (pensiamo ad applicazioni di grafico o video editing, come Adobe Photoshop e Adobe Premiere). L’uso di GPU multiple nello stesso PC aggiunge poi un ulteriore livello di parallelismo a questo modello, aumentandone le prestazioni. Per l’implementazione del GPGPU AMD ha inoltre offerto pieno supporto alla libreria OpenCL, uno standard aperto al pari di OpenGL e OpenAL.

CUDA

Con lo stesso obiettivo del GPGPU, Nvidia ha sviluppato la piattaforma CUDA (Compute Unified Device Architecture). CUDA consiste in API sia di basso livello che di alto livello che consentono di demandare alla GPU calcoli svolti dalla CPU come ad esempio quelli relativi alla fisica (la API PhysX ne è appunto un esempio). La prima implementazione di CUDA risale al 2007. Cosa differenzia CUDA da GCN? La principale differenza è il modello computazionale offerto da CUDA che NVIDIA chiama SIMT (Single Instruction Multiple Threads). Una descrizione dettagliata dei modelli SIMD, SIMT e SMT è ben oltre lo scopo di questo articolo e quindi vi demando a questo link . Ci basti qui dire che il SIMT è un compromesso tra l’efficienza del SIMD e la flessibilità del SMT ed essendo una soluzione di compromesso sacrifica dunque l’efficienza per la flessibilità. CUDA è dunque una tecnologia proprietaria. Per rimediare a questo anche Nvidia ha offerto supporto ad OpenCL a partire dal 2010, ma l’implementazione non sembra essere particolarmente efficiente come la controparte AMD, essendo difatti solo un layer intermedio basato su CUDA.

La sfida nel Gaming

Ma perché ho parlato di GPGPU ancor prima di parlare di gaming? Il motivo esiste. Anzitutto il GPGPU non è soltanto un argomento legato all’accelerazione di applicazioni di grafica e video editing ma riguarda anche il gaming (abbiamo ad esempio parlato di fisica). L’aspetto più rilevante che mi ha indotto a parlarne è però un altro: sembra infatti che, con l’arrivo delle DirectX 12 il vantaggio architetturale di AMD emerso in alcuni tipi di applicazioni GPGPU stia per rivelare una potenza finora celata anche in ambito gaming. Questo perché la nuova API è progettata per trarre il massimo vantaggio sia dall’architettura parallela della CPU che da quella della GPU: vediamo in che modo.

DirectX 12 e Asynchronous Compute

ashesI primi benchmark di Ashes Of The Singularity avevano mostrato un risultato per molti sorprendente: grazie alle DirectX 12 le VGA AMD guadagnavano un importante boost rispetto alle NVIDIA facendo segnare aumenti prestazionali fino al 46%. Questo risultato, davvero troppo eclatante per essere attendibile, è stato poi ridimensionato dopo aggiornamenti dei driver da parte sia di AMD che di NVIDIA. Tuttavia, anche nei test successivi è comunque emersa una perdita prestazionale da parte di Nvidia nel passaggio da DX 11 a DX 12, rispetto ad un guadagno di AMD. Cerchiamo adesso di analizzarne le cause.

In DirectX 11 la pipeline di rendering era sostanzialmente un processo di tipo sequenziale. Con Directx 12 il discorso cambia. Nella modalità sincrona di DX 11 tutti i task di rendering venivano eseguiti dalla GPU uno dopo l’altro in un ordine prestabilito. In DX 12 invece la GPU può eseguire più task contemporaneamente. Con l’esecuzione simultanea, la GPU ha inoltre la responsabilità di schedulare i task di esecuzione nella maniera più efficiente possibile. Il processo di parallelizzazione delle operazioni demandate alla GPU viene indicato con termini come Asynchronous Compute e Asynchronous Shading. Se per “Shading” ci si riferisce al tradizionale processo di definizione delle superfici tridimensionali, “Compute” si riferisce alla più generica possibilità di demandare alla GPU compiti che non hanno a che vedere con il rendering puro e semplice, come ad es. il calcolo della fisica. Le architetture AMD ed NVIDIA, come scopriremo, supportano l’esecuzione asincrona in maniere diverse.

AMD chiama Asynchronous Shaders la capacità hardware della GCN di “iniettare” task computazionali durante la pipeline di rendering, eseguendo gli shader in maniera concorrente piuttosto che sequenziale.

dx11 vs dx12Vediamo di capire meglio come la GCN lavori: avete presente l’Hyperthreading delle CPU Intel? Come forse già sapete nell’Hyperthreading un singolo core fisico della CPU viene diviso in due core “virtuali” in modo tale che un CPU con un certo numero di core fisici risulta al sistema operativo come se ne avesse il doppio. Sdoppiare un core fisico in due virtuali serve a ottimizzare lo sfruttamento del core stesso riducendo i tempi in cui lo esso resta inattivo (idle). Allo stesso modo, nell’asynchronous shading di AMD la GCN ha un minimo di 8 unità fisiche dette ACE (Asycnchronous Compute Engine) ciascuna delle quali è in grado di gestire fino a 8 code di comandi contemporaneamente, per un totale di 64 code. In altre parole, se l’Hypertreading raddoppia il numero dei core fisici di una CPU, la GCN moltiplica per 8 il numero delle ACE. AMD ha offerto ACE multiple fin dalla prima implementazione di GCN nel 2011 con l’architettura Tahiti dando dunque pieno supporto all’asynchronous shading.

ACE SupportSebbene una iniziale disinformazione abbia creato il falso mito che l’achitettura Maxwell di Nvidia non potesse supportare l’asynchronous shading, la realtà è che anch’essa può eseguire shaders concorrenti ma limitando le code simultanee a 31 (si veda questo link). GCN supporta invece fino a 128 code simultanee, sebbene sembri provato che i benefici prestazionali siano fortemente limitati quando si superano le 64 code simultanee. Tornando all’analogia dell’Hyperthreading, possiamo pensare a Maxwell come un’architettura che, al contrario di GCN, non ne è dotata. A parte il numero simultaneo di shaders, sembra comunque che lo scheduler di AMD sia più efficiente rispetto a quello NVIDIA. Date un’occhiata a questo video per capire come AMD descrive il suo supporto agli Asynchronous Shaders, affermando che è in grado di migliorare le performance fino al 46%. Resta da vedere se Nvidia potrà porre rimedio a tali debolezze architetturali anche se, trattandosi di hardware, la cosa sembra improbabile. Ricordiamo che AMD aveva già offerto con le API Mantle un esempio di come fosse possibile ottenere prestazioni migliori sfruttando a pieno la GCN ma, nei fatti, il miglioramento mostrato da Mantle in giochi come Battlefield 4, intorno al 4-5% su DX11, era ben lontano dal 46% declamato da AMD.

Explicit Multi-Adapter : il Multi-GPU (anche ibrido)

ashes_afrLe DirectX 12 mettono a disposizione sostanzialmente due diversi sistemi per implementare il multi-GPU chiamati Implicit Multi-Adapter (IMA) e Explicit multi-Adapter (EMA). Quest’ultimo può coinvolgere adattatori grafici di tipo omogeneo (modalità linked) o eterogeneo (modalità unlinked). L’IMA è sostanzialmente il perfezionamento di quanto già avveniva con DirectX 11 e implica che la gestione del supporto multi-gpu viene sostanzialmente demandata alla libreria con limitate possibilità di intervenire nel processo di rendering da parte degli sviluppatori. Questa modalità è quella che dovrebbe sempre funzionare, ma non è quella che consente di raggiungere le prestazioni ottimali. Con l’Explicit Multi-Adapter invece, i giochi potranno trarre il massimo vantaggio da tutte le GPU presenti nel sistema, anche da quelle eventualmente integrate nelle CPU, andando persino a sfruttare (leggi: sommare) tutta la VRAM presente. L’implementazione di questa modalità è però sostanzialmente a carico dello sviluppatore. Ciò vuol dire che troveremo in-game l’opzione per abilitarla o disabilitarla, se disponibile. L’unlinked EMA consente dunque anche l’ibridazione delle GPU ovvero, per la prima volta, si possono far lavorare insieme GPU AMD e Nvidia insieme nello stesso PC. Se tutto questo fino a ieri sembrava fantascienza adesso è già realtà: Ashes Of The Singularity è stato già dotato della possibilità di sfruttare GPU ibride ed i primi benchmark hanno mostrato ottimi risultati. Il test eseguito da Anandtech riguarda un ibrido tra R9 Fury X e GTX980Ti. Il timori riguardo all’implementazione dell’unlinked EMA riguardavano soprattutto il fatto che, essendo demandato agli sviluppatori, questi possano considerarne non vantaggiosa l’implementazione in quanto gli utenti dotati di multi-gpu sono una piccola percentuale della totalità. Ci sono però due elementi da considerare: anzitutto, la possibilità di migliorare le prestazioni sfruttando le GPU integrate può consentire un abbassamento dei requisiti hardware e, secondo, il fatto che già in fase iniziale gli sviluppatori siano riusciti ad implementare l’unlinked EMA in un gioco fa ben sperare per il futuro. Quel che è certo è che l’ibridazione apre una serie di nuove possibilità, ad esempio combinare AMD e NVIDIA in modo da sfruttare al meglio le caratteristiche di ciascuna architettura.

Dalle parole ai fatti…

apitestA supporto di tutta questa teoria al momento però non c’è molto. A parte i benchmark delle versioni beta di Ashes of Singularitytest eseguiti su Fable Legends di Microsoft (da prendere naturalmente con le pinze in quanto ancora in via di sviluppo) confermerebbero una sostanziale parità tra FuryX e GTX 980Ti. Quel che più colpisce, però, è che da questi emergerebbe una sorprendente supremazia della serie 300 AMD sulle rivali NVIDIA della serie 900. Da prendere ancora con le pinze sono i risultati del 3DMark API Overhead Feature Test benchmark progettato proprio per misurare gli incrementi prestazionali da DX 11 a DX 12, che mostra addirittura una quasi parità tra Titan X e 290X in termini di numero di draw calls. Per draw calls si intende, semplificando, le “richieste” inviate dalla CPU alla GPU per ciascun oggetto da renderizzare (Per capire più in dettaglio cosa si intenda per draw calls potete leggere qui). Più la scena è complessa più draw calls la CPU deve generare per renderizzarla.

Il benchmark mette alla prova sia la CPU che la GPU generando una scena di complessità crescente fermandosi soltanto quando il framerate scende al di sotto dei 30 FPS. In questo test DirectX 12 si mostra in grado di generare un numero di draw calls veramente enorme rispetto a quanto possibile con DirectX 11, andando a sfruttare sia l’architettura multi-core della CPU che quella parallela della GPU. Da notare, a questo proposito, che DirectX 12 ridefinirà molto probabilmente anche il concetto di bottleneck della CPU alla GPU cosi come siamo abituati a pensarlo, in quanto, con DirectX 11 la generazione delle draw calls era tipicamente un processo sequenziale, vale a dire dipendeva sostanzialmente dalla performance single-core della CPU.

And the winner is…

vsAlla luce delle DirectX 12, l’architettura GCN di AMD sembra davvero essere stata pensata guardando “più lontano” rispetto alla Maxwell di Nvidia. Quest’ ultima ha sempre sfoggiato prestazioni superiori nei processi sequenziali tipici delle DirectX 11, ma adesso la nuova API sta cambiando le regole del gioco, mostrando di poter “sbloccare” potenzialità delle GPU AMD finora rimaste “latenti” per il semplice fatto che le DirectX 11 non consentivano di sfruttarle.

Siamo chiaramente ben lungi dall’affermare che potete buttar via le 980Ti e Titan X per acquistare delle 290X ma occorre ammettere che vedere le schede Nvidia subire cali prestazionali nel passaggio da DX 11 a DX 12 mentre le AMD guadagnano terreno, è una cosa che va misurata anche in termini relativi. Vale a dire se una Nvidia perdesse il 5% e contemporaneamente una concorrente AMD guadagnasse il 5%, questo si tradurrebbe di un vantaggio del 10% di quest’ultima sulla prima.

Al momento dunque non è possibile dichiarare vincitori o vinti: se sia questa la “riscossa” di AMD su NVIDIA si vedrà. Con tutta probabilità possiamo prevedere che chi ha investito sulla serie 200 e 300 e Fury di AMD si troverà in futuro ad essere ripagato della scelta vedendo benefici prestazionali. Siamo sicuri comunque che NVIDIA non starà a guardare ed andrà nella direzione di ottimizzare le proprie architetture per DirectX 12. Naturalmente, nell’optare per una Nvidia piuttosto che per una AMD ci sono decine di altri fattori da considerare che non la pura e semplice potenza in DX 12.

Ricordiamo infine che DirectX 12 è una API di più basso livello rispetto a DX 11 e questo implica che mentre in DX 11 le ottimizzazioni possibili a livello di driver potevano essere molteplici, in DX 12 il driver diverrà sempre più ininfluente e la performance dipenderà sostanzialmente da quanto gli sviluppatori si sforzeranno di ottimizzare i giochi.

– Carlo Iovino –