2013-05-28 7 views
6

Czytałem dużo o renderowaniu wielowątkowym. Ludzie proponują różne dziwne i cudowne schematy przesyłania prac do procesora graficznego z wątkami, aby przyspieszyć ich liczbę klatek na sekundę i uzyskać więcej materiałów, ale mam z tym problem koncepcyjny. myślałem, że poprowadzę to tutaj przez guru, żeby zobaczyć, co myślisz.Renderowanie wielowątkowe D3D/OpenGL/Cokolwiek

O ile mi wiadomo, podstawową jednostką współbieżności na GPU jest osnowa. Oznacza to, że jest on mniejszy na poziomie piksela, niż wyższy na poziomie przesyłania geometrii. Biorąc pod uwagę, że jednostką współbieżności na GPU jest osnowa, sterownik musi być zablokowany dość ciasno za pomocą muteksów, aby zapobiec zerwaniu nawzajem wielu wątków. W takim przypadku nie widzę korzyści, jakie przynosi kodowanie wielowymiarowych prymitywów D3D lub OpenGL.

Z pewnością najskuteczniejsza metoda wykorzystania procesora graficznego w scenariuszu wielowątkowym znajduje się na wyższym, abstrakcyjnym poziomie, na którym zbierasz razem zadania do wykonania przed ich przesłaniem? Mam na myśli raczej niż losowe przeplatanie poleceń z wielu wątków, pomyślałbym, że pojedynczy blok akceptuje pracę z wielu wątków, ale z niewielką inteligencją wewnątrz, aby upewnić się, że rzeczy są zamówione dla lepszej wydajności przed przesłaniem do renderera przed, byłoby znacznie większym zyskiem, gdybyś chciał pracować z wieloma wątkami.

Więc, gdzie wielowątkowe renderowanie D3D/OpenGL obsługuje interfejs API?

Pomóż mi z moim zmieszaniem!

+1

Co masz na myśli przez "renderowanie wielowątkowe"?Ponieważ żaden interfejs API nie zezwala na wielowątkowe * renderowanie *. –

+0

Listy poleceń D3D11 na różnych wątkach i "współbieżnych obiektach na różnych wątkach", w OpenGL niezliczone blogi i posty z osobami próbującymi "zrobić ich rendery wielowątkowe" - za dużo do zliczenia :). – Robinson

Odpowiedz

8

Twoje pytanie pochodzi z niezrozumienia różnicy między "renderowaniem wielowątkowych" i "renderowaniem wielowątkowym".

"Moduł renderujący", a dokładniej "system renderowania", nie ogranicza się do wysyłania poleceń do interfejsu API. Musi tasować pamięć wokół. Może być konieczne dynamiczne ładowanie tekstur do pamięci grafiki i poza nią. Po pewnym procesie renderowania może być konieczne odczytanie danych. I tak dalej.

Aby wielowątkowe renderowanie oznacza dokładnie: aby system renderowania korzystał z wielu wątków. Może to być wątkowanie zadań zarządzania wykresami scen, takich jak tworzenie listy obiektów do renderowania (usuwanie ciał stada, BSP, portale itp.). Może to dotyczyć wątku dedykowanego do zarządzania pamięcią tekstur, która w razie potrzeby zamienia i usuwa tekstury, ładowanie z dysku i tym podobne. Może to być tak, jak w przypadku listy komend D3D11, gdzie budujesz szereg poleceń renderowania równolegle z innymi zadaniami.

Proces renderowania, składanie zasadniczej modyfikacji poleceń API jest nie gwintowany. Zwykle masz jeden wątek, który jest odpowiedzialny za podstawową pracę glDraw* lub ::DrawIndexedPrimitive. Listy poleceń D3D11 pozwalają budować sekwencje tych poleceń, ale nie są wykonywane równolegle z innymi poleceniami renderowania. Jest to wątek renderujący i główny kontekst odpowiedzialny za faktyczne wydanie listy poleceń; lista poleceń jest właśnie po to, aby uczynić tę listę bardziej przyjazną dla wątków.

+0

gratulacje na 100 000;) –

1

W Direct3D 11 generalnie tworzone są odroczone konteksty, z których wykonywane są wywołania rysunkowe z wątków roboczych. Po zakończeniu pracy i gotowości do renderowania generujesz listę poleceń z każdego odroczonego kontekstu i wykonujesz ją w bezpośrednim kontekście (wątek przedni). Dzięki temu wywołania remisów mogą składać się z wielu wątków, przy jednoczesnym zachowaniu prawidłowej kolejności wywołań itp.

+0

Aha. Widzę. Naprawdę, wszystko to jest lista poleceń fancy-pants. – Robinson