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.