NVAPI: misurare l'uso del bandwidth della memoria grafica

Nel mondo della tecnologia circolano costantemente dei miti. In questa seconda parte di una serie di articoli ci occuperemo di quelli che riguardano le prestazioni delle schede video.

Avatar di Tom's Hardware

a cura di Tom's Hardware

Sperimentare con NVAPI di Nvidia

Nvidia, attraverso i driver GeForce, espone un'interfaccia di programmazione ("NVAPI") che, tra le altre cose, permette di collezionare rilevazioni prestazionali. Per quelli che amano i tecnicismi ecco una sezione rilevante dell'header del file nvapi.h:

FUNCTION NAME: NvAPI_GPU_GetDynamicPstatesInfoEx

DESCRIPTION: This API retrieves the NV_GPU_DYNAMIC_PSTATES_INFO_EX structure for the specified physical GPU. Each domain's info is indexed in the array. For example:

- pDynamicPstatesInfo->utilization[NVAPI_GPU_UTILIZATION_DOMAIN_GPU] holds the info for the GPU domain. There are currently four domains for which GPU utilization and dynamic P-state thresholds can be retrieved: graphic engine (GPU), frame buffer (FB), video engine (VID), and bus interface (BUS).

Oltre al commento, la funzionalità specifica di questa API non è stata documentata. Quanto segue è la nostra migliore interpretazione del suo funzionamento anche se si basa molto su congetture.

  • Il parametro graphic engine ("GPU") dovrebbe rappresentare il vostro collo di bottiglia nella maggior parte dei giochi. Se non lo vedete al 100% o prossimo a tale livello, qualcos'altro – come la CPU o il sottosistema di memoria - sta limitando le prestazioni.
  • Il frame buffer ("FB") è interessante se funziona come previsto. Dal nome vi aspettereste che misuri l'uso della memoria grafica – la percentuale di memoria usata. Non è ciò che fa. Piuttosto fa riferimento all'uso (in percentuale) del controller di memoria. Se ciò è corretto, dovrebbe misurare la larghezza di banda effettiva usata dal controller, che altrimenti non è disponibile come misura in qualsiasi altro modo.
  • Non siamo interessati al video engine ("VID"); non è generalmente usato nei giochi e registra solitamente uno 0%. Vedrete cambiare il parametro solo se codificate video tramite ShadowPlay o se effettuate lo streaming verso un prodotto Shield.
  • Il parametro bus interface ("BUS") si riferisce all'uso del controller PCIe, ancora una volta sotto forma di percentuale. La misura corrispondente, che potete tracciare in EVGA PrecisionX e MSI Afterburner, è chiamata "GPU BUS Usage".

Abbiamo chiesto a Nvidia di fare maggiore luce sul funzionamento di NVAPI. L'azienda ha confermato che il parametro FB misura l'uso del bandwidth della memoria grafica, ma Nvidia ha sottolineato che il parametro BUS è "considerato inaffidabile e così non è usato internamente".

Abbiamo chiesto ad AMD se aveva qualche API o funzione che permetteva misure simili. Dopo una verifica interna i rappresentanti dell'azienda ci hanno confermato che non ne avevano. Quindi non possiamo condurre test simili su hardware AMD.

Passiamo ai test…

Mito: l'uso del bandwidth della memoria grafica e quello del bus PCIe sono impossibili da misurare direttamente.

La quantità di dati spostati tra la memoria grafica e la GPU e viceversa è enorme. Questo è il motivo per cui le schede video hanno controller di memoria così complessi. Nel caso della Radeon R9 290X di AMD si parla di un massimo di 320 GB/s mentre la GTX 780 Ti è attestata a 336 GB/s. Il throughput PCIe massimo non è così impressionante (15,75 GB/s tramite un collegamento 3.0 a 16 linee), anche se non è una domanda così alta. Quanto ne viene usato in ogni momento? Rappresenta un collo di bottiglia? Finora è stato difficile rispondere a queste domande, ma speriamo che l'architettura Kepler e NVAPI permettano di rispondere con maggiore precisione.

Iniziamo la nostra indagine guardando al parametro BUS su una GeForce GTX 690. Nvidia afferma che è inaffidabile, ma ci siamo comunque chiesti cosa avremmo potuto raccogliere dai risultati di test. Nel rilevare le letture, tuttavia, abbiamo incontrato un'altra complicazione: le due GPU GK104 della scheda non sono direttamente collegate al bus PCIe principale, bensì sono indirizzate attraverso il PLX PEX 8747. Quindi non importa quale impostazione usi la motherboard, le GPU operano sempre con una velocità di signaling PCI Express 3.0, eccetto quando sono in modalità di risparmio energetico. Questo è il motivo per cui GPU-Z mostra che le GPU operano in PCIe 3.0, anche su piattaforme limitate a PCIe 2.0. Lo switch PEX 8747 è ciò che impone le velocità di precedente generazione sul lato host.

Con ogni bus controller della GPU che opera a PCIe 3.0 su un collegamento a 16 linee, l'uso al 100% dovrebbe essere a 15,75 GB/s. Quella singola informazione però non aiuta molto. È impossibile dire quanto traffico è diretto all'host e quanto va all'altra GPU. E sfortunatamente lo switch PLX non dà accesso a un dato più preciso. Per ora, rimaniamo con lo scenario peggiore: che ogni GPU sta ricevendo tutto il suo traffico dall'host e nessuno è distribuito.

Con quella spiegazione controllate il grafico qui sopra. È una sessione da 200 secondi di BioShock: Infinite con impostazione di qualità personalizzata, con risoluzione a 3840x2160 pixel e una prestazione media di 80 FPS. L'uso del bus PCIe è nell'intervallo è di circa il 15% per ognuna delle due GPU GK104. Anche nella situazione peggiore descritta sopra, usiamo circa il 30% di un collegamento PCIe 3.0 a 16 linee, o circa il 60% di linee di seconda generazione. E si tratta di uno scenario brutale, dove 663,6 milioni di pixel al secondo sono stati renderizzati (3840x2160 * 80 FPS) tramite due GPU in SLI su una singola scheda. Per confronto, 1920x1080 * 60 FPS è pari a 124,4 milioni di pixel al secondo.

Date le carenze della nostra selezione hardware, non andiamo avanti con la GeForce GTX 690. Invece, procediamo con test più significativi condotti su una GeForce GTX 750 Ti e una GeForce GTX 650 Ti. I sette grafici che seguono possono sembrare colmi di dati ma devono essere considerati nel loro complesso. Nei benchmark vedrete il test di Metro: Last Light sulle due schede in funzione sulla medesima piattaforma.

Partendo dal primo grafico, in ordine, abbiamo: uso della GPU (%), uso della memoria grafica (MB), temperatura della GPU (Celsius), frame al secondo, tempo di rendering del frame (millisecondi), uso "FB" (%) e uso "BUS" (%). Omettiamo le frequenze di core e memoria; sono state fissate ai rispettivi valori di GPU Boost per ambedue le schede.

L'uso della GPU mostra che il processore grafico su entrambi i prodotti è il collo di bottiglia di sistema principale. È vicino al 100% per la maggior parte del tempo. Questo è come ce lo aspetteremmo, ed è semplice di spiegare. La GPU è il componente che vi attendereste che un gioco tassi più pesantemente.

L'uso di memoria grafica appare stabile sotto 1 GB, ovvero quanto troviamo a bordo della GeForce GTX 650 Ti. Non c'è niente di speciale da segnalare, in generale.

Le GPU prevedibilmente si riscaldano con l'uso. Entrambi i soggetti del test rimangono comunque piuttosto freschi rispetto alle schede di fascia alta.

I frame rate sono solitamente ciò a cui guardano i giocatori, e possiamo vedere che la GeForce GTX 750 Ti è più veloce della 650 Ti. Non siamo necessariamente interessati agli FPS medi in questo esperimento, ma avremo bisogno del frame rate relativo come misura del throughput per un adeguamento che faremo successivamente.

I picchi nei tempi di frame aumentano la variabilità del tempo di frame. Questi picchi coincidono con il frame rate più alto (e non più basso) e con un uso della GPU inferiore (non più elevato). Questa potrebbe essere la prova di un collo di bottiglia della piattaforma - anche se in questo caso, non uno di quelli principali, dato che l'uso della GPU rimane nell'intervallo del 95%; se il collo di bottiglia della piattaforma fosse severo, l'uso sarebbe sceso molto di più. Comunque, anche se tutto ciò è interessante, non siamo arrivati dove vogliamo essere con il nostro esperimento.

Questo è uno dei nuovi parametri abilitati dalle query NVAPI: "FB" o "Framebuffer" Utilization. È espresso come una percentuale e in realtà è chiamato in modo fuorviante. Ciò che realmente misura è la percentuale di tempo in cui il controller di memoria di ogni GPU è occupato e, di conseguenza, l'uso del bandwidth.

Non abbiamo scelto queste due schede a caso bensì le abbiamo selezionate perché erano dotate con la stessa interfaccia a 128 bit a 1350 MHz, fornendo fino a 86,4 GB/s. Con un throughput uguale (FPS), il loro uso del bandwidth dovrebbe essere direttamente comparabile. Il loro frame rate però non è lo stesso. La GeForce GTX 750 Ti raggiunge prestazioni più alte, come evidenziato nella classifica del frame rate. Perciò normalizziamo il parametro per la scheda GM107 usando le prestazioni della GeForce GTX 650 Ti. Si tratta della terza linea blu che vedete nella classifica.

I risultati sono impressionanti. Una GPU Maxwell sembra fornire il 25% di FPS in più rispetto alla GPU Kepler nella stessa fascia di prezzo, mentre allo stesso tempo riduce il bandwidth di memoria usato del 33%. Insomma, su una base per frame, la GeForce GTX 750 Ti ha bisogno di metà del bandwidth di memoria nel benchmark Metro: Last Light.

Questo fatto potrebbe avere profonde implicazioni per la GeForce GTX 980 e 970. L'area dell'interfaccia di memoria può essere sacrificata per un'area SMM aggiuntiva, portando più potenza dove è maggiormente necessario o a riducendo la dimensione del die, abbattendo i costi.

Il nostro grafico finale mostra per la prima volta direttamente - piuttosto che indirettamente tramite la misura degli FPS - quanto straordinariamente ridotti siano i requisiti di bandwidth PCIe per le moderne schede (assumendo che le letture siano rilevanti e non inaffidabili come dice Nvidia). Il PCI Express 2.0 ci offre un throughput bidirezionale di 8 GB/s con collegamenti a 16 linee. Entrambe le schede non riescono a raggiungere il 10% di tale risultato, richiedendo un dato sostenuto inferiore allo 0,8 GB/s. Si tratta di un semplice 5% di quanto che avete disponibile con una singola su piattaforma Haswell.

Conclusioni sul bandwidth di memoria grafico

I nostri test confermano due cose:

Il bandwidth della memoria grafica non è un collo di bottiglia - almeno in Metro con una GeForce GTX 750 Ti/650 Ti.

I miglioramenti nell'uso della memoria grafica collegati all'architettura Maxwell sono più che impressionanti – i requisiti del bandwidth di memoria grafici sono essenzialmente dimezzati da Maxwell. Quest'ultima scoperta è stata confermata da Nvidia.

L'enorme riduzione nelle richieste di bandwidth di memoria ha implicazioni architetturali diffuse, crediamo. Ci aspettiamo di vedere controller di memoria grafici meno complessi – rispetto ad altri – e un'area del die recuperata usata bene grazie sotto forma di SMM aggiuntivi, aumentando ulteriormente l'efficienza e miglioramenti prestazionali di Maxwell rispetto a Kepler.

Ci piacerebbe fare confronti simili su schede AMD in futuro, semmai l'azienda dovesse abilitare una funzionalità simile nei suoi driver.