Zauważyłem, że wiele programów 3d zwykle wykonuje obliczenia wektorowe / macierzowe, a także przekształcenia geometryczne na procesorze. Czy ktoś znalazł przewagę w przenoszeniu tych obliczeń do shaderów wierzchołków na GPU?
źródło
Zauważyłem, że wiele programów 3d zwykle wykonuje obliczenia wektorowe / macierzowe, a także przekształcenia geometryczne na procesorze. Czy ktoś znalazł przewagę w przenoszeniu tych obliczeń do shaderów wierzchołków na GPU?
Ogólnie: transformacje siatki są wykonywane na GPU. Wysyłasz macierz transformacji do GPU, a moduł cieniujący stosuje ją do wszystkich wierzchołków siatki.
Użycie GPU do obliczenia samej macierzy jest inną sprawą i jest w rzeczywistości wolniejsze na GPU, ponieważ istnieje tak wiele przechowywanych wartości, które zmieniają się z ramki na ramę, które są niezbędne, aby pomóc w ustaleniu ostatecznej macierzy transformacji. Wysyłanie tych danych do iz procesora - procesor graficzny działa wolno. Również na CPU obliczenia są wykonywane raz, podczas gdy na GPU byłyby wykonywane dla każdego wierzchołka.
Wiele procesorów geometrycznych można wykonać na procesorach innych niż GPU, jednak należy wziąć pod uwagę platformę docelową. Twój przebieg będzie się różnić w zależności od platformy, na którą celujesz, i wąskich gardeł tej platformy.
Jedną z kwestii jest przepustowość magistrali między urządzeniem generującym geometrię a urządzeniem renderującym geometrię.
W typowym nowoczesnym systemie komputerowym procesor znajduje się po jednej stronie magistrali PCIe (http://en.wikipedia.org/wiki/PCI_Express), a GPU po drugiej. Jedynym sposobem przesyłania danych generowanych dla poszczególnych klatek z procesora do GPU (i odwrotnie) jest ta magistrala. Oznacza to, że możesz być ograniczony prędkością transferu tej magistrali. Jeśli twoja platforma docelowa ma PCIe 2.xi 16 linii, masz przepustowość 8 GB / s. W praktyce transfery przez PCIe nie są w 100% wydajne, ponieważ część przepustowości jest zużywana na protokół podczas transferów. W zależności od wielkości przelewów możesz stracić 5–10% przepustowości tylko narzut na pakiet.
na przykład. Biorąc pod uwagę platformę PC z systemem PCIe 2.xi 16 liniami, ile danych można wygenerować na ramkę do zasilania GPU? Zakładając, że chcesz uruchomić w 60 klatkach na sekundę, przekłada się to na 8 GB / 60 = 136 MB na ramkę dla PCIe 2.x. Po pomnożeniu przez pewien (przyjęty) współczynnik 90% w celu uwzględnienia narzutu na komunikację ze sterownikiem i narzutu na protokół przesyłania PCIe, można wygenerować około 120 Mb danych na ramkę bez ograniczenia przepustowości PCIe 2.x.
Kolejne pytanie, na które musisz odpowiedzieć: czy wygenerowanie 120 MB danych będzie łatwo osiągalne w docelowym procesorze w 1/60 sekundy? Pamiętając, że musisz wykonać szereg innych zadań gry na swoim CPU, możesz zabraknąć czasu na wygenerowanie przetworzonych danych. Pod względem samej przepustowości ALU może to ograniczyć procesor. Jeśli chodzi o procesor do magistrali sysmem, możesz być także ograniczony przez przepustowość (która jest różna, ale w przypadku najnowszych procesorów wynosi około 8,5 GB / s).
W porządku, więc jakie czynniki sprawiają, że jest to bardziej opłacalne na GPU? Jednym z czynników jest przepustowość pamięci GPU, czyli przepustowość między GPU a jego lokalną pamięcią wideo. We współczesnych układach GPU średniej klasy przepustowość pamięci wideo może wynosić nawet 200 GB / s (tak, to 25x przepustowości PCIe 2.x). Innym czynnikiem jest to, że procesor graficzny jest masowo równoległy, ma setki jednostek ALU i jest w stanie ukryć opóźnienie dostępu do pamięci, uruchamiając jednocześnie tysiące wątków.
Wszystkie te czynniki mogą przyczynić się do oczywistej wygranej polegającej na przesunięciu większej ilości pracy na procesor graficzny, ale ponownie YMMV w zależności od platformy docelowej.
źródło
Co rozumiesz przez „transformacje siatki”? Przekształcanie geometrii za pomocą jakiegoś zestawu matryc? Większość gier w dzisiejszych czasach pozwoli GPU obsługiwać proste transformacje, skórki itp. I większość z nich będzie używać do tego celu shaderów wierzchołków. Na niektórych platformach albo nie masz shaderów, albo masz inne zalety robienia tych rzeczy na CPU. Na przykład na PS3 możesz odciążyć RSX, pozwalając SPU obsługić skórowania i transformacji. Jeśli wykonujesz oświetlenie wieloprzebiegowe, skórowanie procesora może być korzystne, ponieważ musisz to zrobić tylko raz i przesłać wyniki do narysowania dla każdego przejścia renderowania. Są więc wyjątki, ale generalnie większość gier robi to na GPU i w shaderach.
A może miałeś na myśli coś bardziej wymyślnego, na przykład użycie GPU do ogólnej matematyki wektorowej? Obecnie mamy procesory graficzne ogólnego przeznaczenia, które mogą obsługiwać dość ogólny kod C za pośrednictwem systemów takich jak CUDA. Można to wykorzystać do matematyki ciężkich wektorów i wiem, że istnieją programy, które to robią. Nie mam z tym jednak żadnego doświadczenia.
źródło
Są sytuacje, w których wszystko na renderowanym GPU może mieć sens, ale nie można ustawić stałych wewnątrz modułu cieniującego i tak naprawdę nie ma innego miejsca, aby je ustawić, oprócz strony CPU przed wywołaniem losowania.
Nawet gdybyś mógł obliczyć swoje stałe, takie jak macierze transformacji kości, na GPU za pomocą niestandardowego programu inicjującego, prawdopodobnie nie chciałbyś. GPU jest naprawdę dobry w równoległym wykonywaniu, ale ma znacznie wolniejszą częstotliwość taktowania.
Transformacja hierarchii nie jest łatwa do zrównoleglenia, ponieważ węzły potomne zależą od rodziców, ale transformacja wszystkich wierzchołków w siatce jest taka, ponieważ wierzchołki są obliczeniowo niezależne od siebie.
Ogólna zasada brzmi:
źródło