dlaczego połączenia losowe są drogie?

Zakładając, że Tekstura, wierzchołek i dane shadera są już na karcie graficznej, nie musisz wysyłać zbyt wielu danych na kartę. jest kilka bajtów do identyfikacji danych, i prawdopodobnie macierz 4x4, i kilka innych parametrów.

Więc skąd się biorą wszystkie koszty? czy operacje wymagają uścisku dłoni z gpu?

Dlaczego wysyłanie pojedynczej siatki zawierającej kilka małych modeli, obliczonych na CPU, często jest szybsze niż wysyłanie wierzchołka macierze id i transformacja? (druga opcja wygląda na to, że powinno być mniej danych wysyłanych, chyba że modele są mniejsze niż matryca 4x4)

Author: notallama, 2011-01-31

3 answers

Po pierwsze, zakładam, że z "draw calls" masz na myśli polecenie, które mówi GPU, aby renderował określony zestaw wierzchołków jako Trójkąty z określonym stanem (shadery, stan mieszania i tak dalej).

Wywołania losowania niekoniecznie są drogie. W starszych wersjach Direct3D wiele połączeń wymagało przełącznika kontekstowego, co było drogie, ale nie jest to prawdą w nowszych wersjach.

Głównym powodem mniejszej liczby wywołań rysowania jest to, że sprzęt graficzny może przekształcać i renderować Trójkąty znacznie szybciej niż można je złożyć. Jeśli podasz kilka trójkątów przy każdym wywołaniu, będziesz całkowicie związany przez procesor, a GPU będzie w większości bezczynny. Procesor nie będzie w stanie wystarczająco szybko zasilać GPU.

Wykonanie pojedynczego połączenia rysunkowego z dwoma trójkątami jest tanie, ale jeśli przesyłasz za mało danych przy każdym połączeniu, nie będziesz miał wystarczająco dużo czasu procesora, aby przesłać tyle geometrii do GPU, ile możesz mieć.

Są pewne realne koszty z wykonywaniem połączeń losowania, wymaga skonfigurowanie kilku stanów (który zestaw wierzchołków użyć, jaki shader użyć itd.), a zmiany stanu mają koszt zarówno po stronie sprzętu (aktualizacja kilku rejestrów), jak i po stronie sterownika (Walidacja i tłumaczenie wywołań tego ustawionego stanu).

Ale główny koszt wywołania draw ma zastosowanie tylko wtedy, gdy każde wywołanie przesyła zbyt mało danych , ponieważ spowoduje to, że będziesz związany z CPU i powstrzyma cię od pełnego wykorzystania sprzętu.

Tak jak Josh powiedział, draw calls can powoduje również spłukanie bufora poleceń, ale z mojego doświadczenia wynika, że zwykle dzieje się to podczas wywoływania SwapBuffers, a nie podczas przesyłania geometrii. Sterowniki wideo na ogół starają się buforować tyle, ile się da (czasami kilka klatek!), aby wycisnąć jak najwięcej równoległości z GPU.

Powinieneś przeczytać prezentację Nvidii Batch Batch Batch!, jest dość stary, ale obejmuje dokładnie ten temat.

 50
Author: Joakim Hårsman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 12:54:14

Graficzne interfejsy API, takie jak Direct3D, tłumaczą wywołania na poziomie API na polecenia niezależne od urządzeń i ustawiają je w kolejce w buforze. Spłukiwanie tego bufora, aby wykonać rzeczywistą pracę, jest kosztowne - zarówno dlatego, że oznacza to, że rzeczywista praca jest teraz wykonywana, jak i dlatego, że może spowodować przejście z trybu użytkownika do trybu jądra na chipie( i z powrotem), co nie jest takie tanie.

Dopóki bufor nie zostanie spłukany, GPU może wykonywać pewne prace przygotowawcze równolegle z procesorem, o ile procesor nie wykonaj żądanie blokowania (takie jak mapowanie danych z powrotem do procesora). Ale GPU nie będzie-i nie może-przygotować wszystkiego, dopóki nie będzie musiał faktycznie rysować. Tylko dlatego, że niektóre dane wierzchołków lub tekstur są na karcie, nie oznacza to, że są jeszcze odpowiednio ułożone i mogą nie być układane, dopóki nie zostaną ustawione układy wierzchołków lub shadery są powiązane, itd. Większość rzeczywistej pracy dzieje się podczas polecenia flush I draw call.

DirectX SDK posiada sekcję dotyczącą dokładnego profilowania D3D wydajność , która, choć nie jest bezpośrednio związana z twoim pytaniem, może dostarczyć wskazówek, co jest i nie jest drogie i (w niektórych przypadkach) dlaczego.

Bardziej istotne jest ten post na blogu (oraz posty następcze tutaj i tutaj ), które zapewniają dobry przegląd logicznego, niskiego poziomu procesu operacyjnego GPU.

Ale zasadniczo (aby spróbować odpowiedzieć bezpośrednio na twoje pytania), powodem, dla którego połączenia są drogie, nie jest to, że jest koniecznie dużo danych do przeniesienia, ale raczej, że istnieje duża praca poza po prostu wysyłanie danych przez magistralę, która jest odroczona do czasu opróżnienia bufora poleceń.

 11
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-31 18:04:37

Krótka odpowiedź: sterownik buforuje część lub całość rzeczywistej pracy, dopóki nie zadzwonisz do draw. Pojawi się to jako stosunkowo przewidywalna ilość czasu spędzonego w wywołaniu losowania, w zależności od tego, jak bardzo stan się zmienił.

Robi się to z kilku powodów:

  • aby uniknąć niepotrzebnej pracy: jeśli (niepotrzebnie) ustawisz ten sam stan wiele razy przed rysowaniem, możesz uniknąć kosztownej pracy za każdym razem, gdy to nastąpi. To faktycznie staje się dość częstym zjawiskiem w duża baza kodowa, powiedzmy silnik gry produkcyjnej.
  • aby móc pogodzić to, co wewnętrznie są współzależnymi Stanami, zamiast przetwarzać je natychmiast z niekompletną informacją

Alternatywna odpowiedź (y):

  • bufor używany przez sterownik do przechowywania poleceń renderowania jest pełny, a aplikacja skutecznie czeka na procesor GPU do przetworzenia niektórych wcześniejszych prac. To zazwyczaj pojawi się jako bardzo duże kawałki czasu blokowania w losowe losowanie połączenia w ciągu rama.
  • osiągnięto liczbę ramek, które sterownik może buforować, a aplikacja czeka na procesor GPU, aby przetworzyć jedną z nich. Zazwyczaj pojawia się to jako blokada dużej części czasu w pierwszym wywołaniu losowania w obrębie klatki lub na obecnym na końcu poprzedniej klatki.
 2
Author: Zoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-20 22:28:19