DirectX 12 udostępnia kolejki poleceń dla zadań graficznych (zwanych „Direct”), zadań obliczeniowych lub kopiowania. Pod względem zapewnianej funkcjonalności każdy z nich jest super zestawem następnego. W specyfikacji podano , że kolejki poleceń mogą być wykonywane jednocześnie przez urządzenie. Jednak interfejs API nie ogranicza w żaden sposób liczby kolejek poleceń (przynajmniej nie znam żadnych ograniczeń).
Najwyraźniej różni dostawcy radzą sobie z tym zupełnie inaczej:
- W niedawnej prezentacji (slajd 23) Intel stwierdza, że obecnie ich procesory graficzne nie są w stanie obsługiwać grafiki i obliczeń równolegle oraz że silnik kopiowania ma słabą przepustowość. Odradzają stosowanie wielu kolejek graficznych / obliczeniowych.
- AMD już dawno zaczęło reklamować użycie kolejek / „asynchronicznych shaderów”, poczynając od Mantle i konsol obecnej generacji. Istnieje również kilku programistów ( przykład ), którzy potwierdzają znaczny wzrost wydajności, wykonując zadania obliczeniowe i graficzne równolegle.
- Ostatnio pojawiło się zamieszanie w związku z tym, że Nvidia nie obsługuje asynchronicznego modułu cieniującego w sprzęcie: użycie osobnej kolejki Graphics i Compute wydaje się spowolnić, co wskazuje na emulację sterownika. Z drugiej strony CUDA obsługuje równoległe operacje kopiowania od bardzo dawna, co wyraźnie pokazuje, że silnik DMA może działać niezależnie.
Czy jest jakiś sposób, aby zdecydować w czasie wykonywania, czy sensowne jest przypisanie CommandLists do wielu CommandQueues zamiast do jednego? (biorąc pod uwagę, że poprzedni przypadek nie wiąże się z dużymi nakładami technicznymi)
Chociaż łatwo mogę zobaczyć, jak przydatne jest wykonywanie operacji pamięci równolegle do operacji obliczeniowych / graficznych, wydaje mi się, że niepotrzebnie skomplikowane jest jednoczesne uruchamianie wielu procesów obliczeniowych i graficznych (chyba że nie ma większych korzyści). Nie jest też dla mnie jasne, w jaki sposób może to doprowadzić do znacznie lepszej wydajności; z wyjątkiem przypadków patologicznych, w których wiele małych, sekwencyjnych zadań nie jest w stanie wygenerować wystarczającego obciążenia GPU.