Analisi dei fotogrammi con acquisizioni GPU
GPU (o frame) acquisisce i record di tutte le chiamate API Direct3D 12 effettuate dall'applicazione, in genere in un singolo fotogramma (vedere Acquisire una GPU). PIX può riprodurre queste chiamate API per visualizzare informazioni sui parametri di chiamata API, gli stati della pipeline e delle risorse, il contenuto delle risorse e altro ancora.
Suggerimento
Non è sempre possibile che PIX acquisisca correttamente un'acquisizione GPU se un gioco chiama Direct3D 12 in modi non validi. PIX fa il massimo sforzo per essere robusto anche nel caso di modelli di utilizzo non corretti, ma questo è inevitabilmente un caso di garbage in, garbage out. Se si verificano difficoltà a acquisire GPU, provare a usare il livello di debug D3D12 e la convalida basata su GPU per trovare e correggere eventuali chiamate API non corrette.
Acquisire una GPU
Dalla visualizzazione Connessione avviare o collegare al processo desiderato (verificando che sia selezionata l'opzione Pertinente per l'acquisizione GPU).
Configurare le opzioni di acquisizione GPU in base alle esigenze. Per acquisire l'acquisizione, fare clic sul pulsante Acquisisci GPU in PIX o premere ALT+Stampa schermo (o F11, configurabile nelle impostazioni PIX). Verrà visualizzata un'anteprima dell'acquisizione nell'interfaccia utente PIX. A questo punto è possibile terminare l'applicazione, se necessario. Fare clic sull'anteprima per aprire l'acquisizione.
Acquisizioni a livello di codice
È possibile acquisire un'acquisizione a livello di codice usando WinPixEventRuntime. Per informazioni dettagliate, vedere il post di blog Acquisizione a livello di codice.
Visualizzare le chiamate API con la visualizzazione degli eventi
La visualizzazione Eventi mostra tutte le chiamate API registrate in un'acquisizione GPU. Esiste un elenco separato per ogni coda Direct3D 12 (grafica, calcolo o copia) usata dal gioco.
L'elenco di eventi può essere filtrato, facoltativamente usando espressioni regolari (fare clic sul pulsante con etichetta .*). Per impostazione predefinita, mostra solo gli eventi che hanno comportato il lavoro di rendering effettivo per l'hardware GPU, invece di preparare semplicemente lo stato per l'uso da parte di operazioni successive. Per includere eventi non GPU, fare clic sul pulsante con etichetta ! G.
Altre informazioni su ogni evento, ad esempio il set completo di parametri di chiamata API, sono disponibili nella visualizzazione Dettagli evento. Tale visualizzazione è inclusa per impostazione predefinita nella scheda Pipeline , ma può anche essere aggiunta al layout corrente tramite il pulsante Modalità progettazione layout nell'angolo superiore destro della finestra PRINCIPALE PIX.
Profilatura dei frame
Con un'acquisizione GPU aperta, passare alla scheda Panoramica. Qui verranno visualizzati alcuni dettagli di base sull'acquisizione.
Per avviare la profilatura, è necessario raccogliere i dati di intervallo. A tale scopo, fare clic sul pulsante Raccogli dati di intervallo in alto a destra nella visualizzazione Eventi oppure fare clic su Fare clic qui per avviare l'analisi e raccogliere il testo dei dati temporali nella visualizzazione Sequenza temporale. Che riproduce il lavoro della GPU nell'acquisizione e raccoglie dati di intervallo di base, ad esempio Durate di esecuzione (annotate con PixEvents, se l'applicazione li contiene). Al termine, è possibile raccogliere dati aggiuntivi da grafo in corsie Sequenza temporale, ad esempio informazioni sull'occupazione e altri contatori specifici della GPU.
Suggerimento
Per ottenere risultati ottimali, non interagire con il computer mentre PIX sta raccogliendo dati di intervallo; e chiudere tutte le altre applicazioni che potrebbero usare la GPU.
È anche possibile visualizzare i contatori suddivisi per chiamata API nella visualizzazione Eventi . Per abilitare/disabilitare i contatori, fare clic sul pulsante Contatori elenco eventi (in alto a destra nella visualizzazione Eventi ).
Dati di intervallo
Esistono due origini di informazioni sulla tempistica GPU:
- I timestamp di avvio della pipe segnalano quando la GPU avvia l'elaborazione di ogni parte di lavoro. Si noti che questi dati sono disponibili solo quando si esegue Windows 10, build 14393 (o versione successiva) con un driver di grafica appropriato (vedere il post di blog Requisiti). La raccolta dei dati temporali richiede più tempo se i timestamp di inizio della pipe non sono disponibili.
- Report timestamp end-of-pipe (EOP) al termine dell'elaborazione di ogni parte del lavoro da parte della GPU.
Poiché le GPU sono molto parallele e con pipeline profonde, è comune che più di un componente di lavoro venga eseguito contemporaneamente e che le operazioni adiacenti si sovrappongano. PIX misura il tempo in due modi diversi che possono offrire informazioni dettagliate sul modello di esecuzione parallela dell'hardware:
- La durata dell'esecuzione viene misurata dall'inizio della pipe al timestamp end-of-pipe di ogni parte di lavoro separata. Se misurato in questo modo, gli elementi di lavoro GPU eseguiti in parallelo con gli elementi precedenti potrebbero apparire più lunghi rispetto a quelli eseguiti in isolamento, a causa della contesa sulla GPU.
- La durata EOP viene misurata dal timestamp end-of-pipe (EOP) dell'elemento precedente al timestamp EOP di questo elemento. Gli elementi di lavoro eseguiti in parallelo con gli elementi precedenti verranno pertanto visualizzati più brevi rispetto a quelli eseguiti in isolamento e alcuni elementi potrebbero anche essere segnalati come durata zero se completati interamente in parallelo con l'elemento precedente.
La visualizzazione Sequenza temporale visualizza una o più corsie che mostrano la tempistica di ogni operazione GPU. Esiste una corsia separata contenente i dati di durata EOP per ogni coda (grafica, calcolo o copia) usata dal gioco, oltre a una singola corsia che mostra i dati durata esecuzione (se disponibili) combinati in tutte le code.
Suggerimento
PIX in Windows attualmente non sovrappone il funzionamento della GPU in code diverse durante l'analisi dei tempi nelle acquisizioni GPU. Prendere in considerazione un'acquisizione di intervallo se si vogliono visualizzare dati di temporizzazione di calcolo asincroni sovrapposti. In Acquisizioni GPU, se un gioco usa il calcolo asincrono per eseguire il rendering e il lavoro di calcolo contemporaneamente, PIX misurerà prima uno e poi l'altro. Questo può comportare durate segnalate più brevi per ogni parte del lavoro rispetto alla modalità di esecuzione all'interno del gioco originale (a causa di una contesa ridotta sulla GPU), ma un tempo totale più lungo (a causa della riduzione della parallelizzazione).
Contatori GPU e occupazione
PIX espone contatori delle prestazioni specifici dell'hardware forniti da IHV tramite un plug-in GPU. Questi contatori possono essere abilitati e raccolti nella visualizzazione Contatori elenco eventi (pulsante per abilitare in alto a destra della visualizzazione Eventi) o nella visualizzazione Contatori sequenza temporale (pulsante per abilitare in alto a destra della visualizzazione Sequenza temporale).
In alcune GPU, PIX può anche raccogliere informazioni sull'occupazione. Le GPU vengono in genere costruite come gerarchia di blocchi ripetuti, in cui ogni livello può condividere una risorsa. Ad esempio, una GPU immaginaria potrebbe essere strutturata come questa
Le GPU eseguono shader suddividendo il lavoro dello shader in onde (dette anche warp o fronti d'onda). Nel diagramma precedente ogni blocco blu è in grado di eseguire un'onda. Ogni blocco verde può essere eseguito fino a quattro onde.
Poiché tutti i blues condividono un singolo set di registri, se un carico di lavoro necessita di tutti i registri, è possibile eseguire solo un'onda alla volta nel blocco verde. In tal caso l'occupazione del blocco verde sarebbe 1, su un totale di occupazione possibile di 4.
In qualsiasi momento, tutti i blocchi verdi potrebbero eseguire un numero diverso di onde. Dei quattro blocchi verdi sopra, uno potrebbe eseguire 3 onde, un'altra 2 onde e l'altra 1 onda rimanente. PIX riduce tutti i dati a un singolo valore, ovvero il numero massimo di occupazione, che in questo esempio sarebbe 3.
Questo è presentato in PIX nella corsia Occupancy , che mostra la massima occupazione, separata dalla fase shader. Si tratta di un'indicazione della quantità di lavoro che la GPU è in grado di eseguire in parallelo. Le barre superiori mostrano un utilizzo migliore della GPU.
Problemi di rendering del debug
Con un'acquisizione GPU aperta, passare alla scheda Pipeline . Tale scheda contiene una visualizzazione Eventi , diverse viste di controllo dello stato e delle risorse e una visualizzazione Pipeline .
La selezione di un evento nella visualizzazione Eventi popola varie visualizzazioni, in particolare la visualizzazione Pipeline, che può essere usata per esaminare le firme radice e lo stato della pipeline e le risorse associate. La visualizzazione Pipeline è anche il punto di ingresso nel debug dello shader.
Suggerimento
Per eseguire la maggior parte delle funzionalità, è necessario avviare l'analisi. L'analisi è il modo in cui PIX raccoglie dati di intervallo, informazioni sullo stato e risorse. Esistono molti modi per avviare l'analisi, ma il modo globale è tramite il pulsante Avvia analisi play in alto a destra dell'applicazione. Assicurarsi che la GPU desiderata sia selezionata.
Visualizzare oggetti, parametri e stato Direct3D 12
Dopo aver selezionato un evento nella visualizzazione Eventi, le visualizzazioni Stato e Pipeline (disponibili nella scheda Pipeline) mostrano i dettagli dello stato Direct3D al momento dell'evento. È possibile visualizzare le risorse associate alla pipeline, al codice dello shader, agli input, agli output e ai rendertarget attualmente associati.
Debug dello shader
Dopo aver selezionato un evento appropriato ed eseguire l'analisi, è possibile eseguire il debug degli shader. Nella visualizzazione Pipeline esistono diversi modi per avviare il debug dello shader:
- Selezionare la voce shader nella fase dello shader desiderata e fare clic sul pulsante di riproduzione verde. Prima di avviare la sessione di debug, assicurarsi di configurare i parametri dello shader appropriati( ad esempio, id di istanza e vertici per vertex shader o coordinate pixel per pixel shader).
- Fare clic con il pulsante destro del mouse in un visualizzatore di risorse, ad esempio Output VS o SRV/UAV/RTV, e selezionare l'opzione Debug appropriata.
- Fare clic sul pulsante Debug pixel nella visualizzazione Dettagli pixel quando si visualizza una risorsa appropriata, ad esempio SRV/UAV/RTV.
Suggerimento
Se non è possibile visualizzare l'origine shader durante il debug, è probabile che manchino informazioni di debug. Assicurarsi di generare i PDB shader per l'applicazione e di aver configurato PIX per caricare tali PDB.
Modifica shader e continuazione
Il codice dello shader HLSL può essere modificato direttamente all'interno di PIX, consentendo di visualizzare immediatamente l'effetto delle modifiche sui risultati o sulle prestazioni di rendering. Ciò può essere utile per la creazione di prototipi e l'ottimizzazione degli shader, perché può ridurre notevolmente il tempo di turnaround quando si provano idee diverse.
Dopo aver selezionato uno shader, è possibile modificare il codice desiderato, quindi fare clic su Modifica>applica. Altre visualizzazioni (ad esempio OM RTV 0) verranno aggiornate per visualizzare l'effetto della modifica. Potrebbe risultare utile ancorare più istanze della visualizzazione Pipeline accanto all'altra per visualizzare i risultati di rendering contemporaneamente alla modifica del codice dello shader.
Se perdi traccia esattamente di ciò che hai cambiato, fai clic con il pulsante destro del mouse sul codice dello shader e scegli Diff con Originale.
Suggerimento
PIX in Windows non supporta ancora il salvataggio degli shader modificati nel file di acquisizione.
Visualizzatori di debug
I visualizzatori rendertarget sono disponibili nella visualizzazione Pipeline quando si esamina il contenuto di un oggetto rendertarget. Il visualizzatore di immagini predefinito mostra semplicemente l'immagine come di consueto e può essere modificata selezionando una visualizzazione diversa nella visualizzazione Visualizzazione .
Cronologia pixel
Per qualsiasi risorsa simile a pixel (ad esempio, RTV, UAV o buffer di profondità), è possibile visualizzare tutte le operazioni che hanno interessato un determinato pixel usando La cronologia pixel. È possibile accedere facendo clic con il pulsante destro del mouse sul pixel desiderato e scegliendo Mostra cronologia pixel oppure facendo clic sul pulsante Cronologia pixel nella visualizzazione Dettaglipixel.
Avvertenze e note varie
- Non è sempre possibile che PIX acquisisca correttamente una GPU se un gioco chiama Direct3D 12 in modi non validi. PIX fa il massimo sforzo per essere robusto anche nel caso di modelli di utilizzo non corretti, ma questo è inevitabilmente un caso di garbage in, garbage out. Se si verificano difficoltà a acquisire GPU, provare a usare il livello di debug D3D12 e la convalida basata su GPU per trovare e correggere eventuali chiamate API non corrette.
- Le acquisizioni di Windows GPU non sono, in generale, portabili in diverse versioni di hardware e driver GPU. Nella maggior parte dei casi, un'acquisizione acquisita in un computer verrà riprodotta correttamente su altre GPU simili della stessa famiglia hardware e le acquisizioni di alcuni giochi possono anche funzionare tra GPU di produttori completamente diversi, ma è anche possibile che un aggiornamento del driver possa interrompere la compatibilità con le acquisizioni meno recenti. PIX può garantire che la riproduzione abbia esito positivo solo quando la GPU e il driver sono esattamente uguali, quindi PIX avvisa prima di iniziare l'analisi se non esiste una corrispondenza perfetta. Procedere oltre l'avviso a proprio rischio.
- PIX ha un supporto limitato per più GPU. Verrà sempre riprodotta l'acquisizione GPU in una singola scheda, indipendentemente dal numero di schede usate dall'applicazione. PIX consente di selezionare l'adattatore di riproduzione da un'offerta a discesa sulla barra degli strumenti PIX. PIX tenterà di selezionare automaticamente l'adattatore di riproduzione se l'applicazione usava una sola scheda.
- Per i carichi di lavoro ExecuteIndirect non deterministici, è possibile abilitare l'impostazione Usa buffer di argomenti ExecuteIndirect in fase di riproduzione.