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.
Odpowiedzi:
Wyślij swoją aplikację wraz z sekwencją testową testującą rzeczywistą platformę. (Chyba możliwa odpowiedź na wiele pytań ...)
Podejrzewam, że wydajność zależy w dużym stopniu od sposobu korzystania ze sprzętu. Ponieważ jest mało prawdopodobne, aby sprzęt w jakiś sposób instrumentował twoją aplikację wstecz, mówiąc ci, co robić, wybrałbym wszystko, co wygląda dobrze w twoim projekcie.
Słowo kluczowe to CAN. Nie widzę powodu, dla którego żaden sprzedawca miałby to zepsuć. Ostatecznie to dostawca platformy (Intel / AMD / Nvidia) jest odpowiedzialny za uczynienie cię wystarczająco dobrym sterownikiem, abyś nie rozważał zmiany dostawcy. Jeśli mają „znany problem” z tą funkcjonalnością (która, nawiasem mówiąc, nie ma znaczenia funkcjonalnego, a jedynie wydajność), powinni również rozwiązać to przy użyciu tego, co wiedzą. Chodzi mi o to, by głośno płakać, awaria jest czymś, co już wdrożyli; synchroniczne wykonanie.
Sprzęt jest wystarczającą ilością voodoo, tak jak dla nas, programistów.
źródło