Ile kolejek bezpośrednich / obliczeniowych / kopiujących ma znaczenie?

11

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.

Wumpf
źródło
1
Nie sądzę, że istnieje jakikolwiek sensowny sposób na wykonanie tego rodzaju osądu, poza sprawdzeniem, kto wytwarza GPU. Ostatecznie jest więcej czynników niż tylko „sprzęt może wykonywać polecenia z wielu kolejek jednocześnie”, a D3D12 wyodrębnia te szczegóły. W rzeczywistości D3D12 nawet nie rozróżnia między sprzętem, który może wykonywać kolejki równolegle, a tymi, które mogą to robić sekwencyjnie. Dokumenty mówią tylko, że ich abstrakcja pozwala na jednoczesne wykonywanie.
MJP,
1
dobre pytanie ! Wydaje mi się również, że byłoby szczególnie ważne, aby uzyskać perf do jednoczesnego wykonywania obliczeń i cieniowania. może zyski mogą się zdarzyć dzięki tym samym faktom, które sprawiają, że hiperwątkowanie jest w jakiś sposób szybsze. operacje przeplatania, gdy niektóre jednostki są zajęte dla drugiej kolejki. jak shadery zatykające jednostki tekstur, które nie są używane przez etap obliczeniowy, który sam zatyka FPU lub DPU.
v.oddou
Hm, źle. Może wtedy „oprócz sprawdzenia, kto wytwarza GPU, nie” już się nie liczy jako odpowiedź, jeśli nie ma nic więcej. Po przeczytaniu wszystkich materiałów marketingowych AMD cieszę się, że nie jestem sam ze swoim zamieszaniem.
Wumpf,
1
Wiesz, aby podnieść trochę wagi na znaczenie (właściwie NIEważne) tej sprawy. PS4 SDK zawiera błąd, który nie pozwala na emisję do żadnej innej kolejki niż kolejka 0. Myślę, że gdyby był tak ważny, zostałby naprawiony szybciej.
v.oddou

Odpowiedzi:

1

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.

„... kolejki poleceń mogą być wykonywane jednocześnie przez urządzenie ...”

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.

Andreas
źródło
GCN AMD będzie wykonywał grafikę i obliczał jednocześnie, nawet jeśli oba są wydawane w kolejce graficznej, ale ogólnie nie w wielu buforach poleceń (wiele wywołań rysowania może być nawet szkicowych). Sterownik (lub aplikacja - myślę, że w DX12 lub Vulkan) musi sprawdzić zależności danych i w razie potrzeby zablokować między rysowaniem (grafiką) a wysyłaniem (obliczaniem). Wiele kolejek poleceń byłoby prawdopodobnie przydatne, jeśli masz obliczenia, które są naprawdę asynchroniczne z grafiką (jak fizyka dla następnej klatki), ale nie mam z tym bezpośredniego doświadczenia.
Daniel M Gessel