Quante code Direct / Compute / Copy sono significative?


11

DirectX 12 espone le code dei comandi per le attività grafiche (chiamate "Dirette"), di calcolo o di copia. In termini di funzionalità fornita, ognuna è una super serie di quella seguente. Le specifiche indicano che le code dei comandi possono essere eseguite contemporaneamente dal dispositivo. Tuttavia, l'API non limita il numero di code di comandi in alcun modo (almeno non sono a conoscenza di alcuna limitazione).

Apparentemente, diversi fornitori gestiscono questo molto diverso:

  • Intel afferma in una recente presentazione (diapositiva 23) che attualmente le loro GPU non sono in grado di gestire grafica e calcolo in parallelo e che il motore di copia ha un throughput debole. Sconsigliano l'uso di più code grafiche / di elaborazione.
  • AMD ha iniziato molto tempo fa a pubblicizzare l'uso di code / "shader asincroni" a partire da Mantle e dalle attuali console gen. Ci sono anche alcuni sviluppatori ( esempio ) che confermano significativi miglioramenti delle prestazioni eseguendo attività di elaborazione e grafica in parallelo.
  • Recentemente c'è stato un po 'di confusione su Nvidia che non supporta lo shader asincrono nell'hardware: l'uso di una coda di grafica e calcolo separata sembra rendere le cose più lente, il che indica l'emulazione del driver. Le operazioni di copia parallela, d'altra parte, sono supportate da CUDA da molto tempo, il che rende evidente che il motore DMA può funzionare in modo indipendente.

Esiste un modo per decidere in fase di esecuzione se è significativo affidare CommandList a più CommandQueues anziché a una sola? (dato che il primo caso non comporta molte spese generali di progettazione)

Mentre posso facilmente vedere come sia utile eseguire operazioni di memoria parallele a operazioni di calcolo / grafica, mi sembra inutilmente complicato eseguire più processi di calcolo e grafica in parallelo (a meno che non ci sia un grande vantaggio in termini di prestazioni). Inoltre, non mi è chiaro come questo possa portare a prestazioni significativamente migliori; ad eccezione dei casi patologici in cui molte piccole attività sequenziali non sono in grado di generare un carico sufficiente della GPU.


1
Non credo che ci sia un modo significativo per chiamare quel tipo di giudizio al momento, oltre a controllare chi fa la GPU. In definitiva, ci sono più fattori oltre a "l'hardware può eseguire comandi da più code contemporaneamente" e D3D12 estrae quei dettagli. In effetti D3D12 non fa nemmeno distinzioni tra hardware che potrebbe eseguire le code contemporaneamente e quelle che potrebbero farlo in sequenza, i documenti dicono semplicemente che la loro astrazione consente l' esecuzione simultanea.
MJP,

1
buona domanda ! Sento anche che sarebbe speciale ottenere perf per eseguire simultaneamente il calcolo e l'ombreggiatura. forse i guadagni possono accadere grazie agli stessi fatti che rendono l'hyperthreading in qualche modo più veloce. operazioni di interlacciamento quando alcune unità sono occupate per l'altra coda. come gli shader che intasano le unità di trama, che non sono utilizzate dalla fase di calcolo, che a sua volta ostruisce la FPU o la DPU.
v.oddou,

Peccato. Forse allora "a parte controllare chi produce la GPU, no" conta già come risposta se non c'è altro. Dopo aver letto tutte quelle cose di marketing di AMD, sono felice di sapere che non sono solo con la mia confusione.
Wumpf,

1
Sai solo per sollevare un po 'di peso nell'importanza (in realtà UNIMPORTANCE) di questa questione. L'SDK di PS4 ha un bug che non consente l'emissione in alcuna coda diversa dalla coda 0. Penso che se fosse così cruciale sarebbe stato risolto più velocemente.
v.oddou,

Risposte:


1

Spedisci la tua applicazione con una sequenza di benchmarking che collauda la piattaforma attuale. (Possibile risposta a molte domande immagino ...)

Sospetto che le prestazioni dipendono fortemente dal modo in cui usi l'hardware. Poiché è improbabile che l'hardware possa in qualche modo strumentare la tua applicazione all'indietro, dicendoti cosa fare, andrei con qualsiasi cosa vada bene nel tuo design.

"... le code dei comandi possono essere eseguite contemporaneamente dal dispositivo ..."

La parola chiave è CAN. Non vedo alcun motivo per cui un fornitore potrebbe rovinare tutto. Alla fine è il fornitore della piattaforma (Intel / AMD / Nvidia) che è responsabile di renderti un driver abbastanza buono da non considerare la possibilità di cambiare fornitore. Se hanno un "problema noto" con questa funzionalità (che tra l'altro non ha alcun significato funzionale, solo prestazioni), dovrebbero anche risolverlo usando ciò che sanno. Intendo per gridare forte, il fallback è qualcosa che hanno già implementato; esecuzione sincronica.

L'hardware è abbastanza voodoo come lo è per noi sviluppatori.


Il GCN di AMD eseguirà la grafica e calcolerà contemporaneamente anche quando entrambi vengono emessi sulla coda grafica, ma generalmente non su più buffer di comando (più chiamate di disegno potrebbero anche essere imprecise). Il driver (o l'applicazione - penso in DX12 o Vulkan) deve verificare la dipendenza dei dati e bloccare tra disegno (grafica) e spedizione (calcolo) se necessario. Più code di comandi sarebbero probabilmente utili se si dispone di un calcolo veramente asincrono rispetto alla grafica (come la fisica per il fotogramma successivo), ma non ho esperienza diretta con questo.
Daniel M Gessel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.