Które funkcje OpenGL nie są przyspieszane przez GPU?

Byłem zszokowany, gdy przeczytałem to (z OpenGL wiki):

GlTranslate, glRotate, glScale

Czy są one przyspieszane sprzętowo?

Nie, Nie ma znanych GPU, które wykonaj to. Kierowca oblicza matrycy na procesorze i wgrywa go do GPU.

Wszystkie pozostałe operacje macierzy są wykonane na procesorze, jak również : glPushMatrix, glPopMatrix, glLoadIdentity, glFrustum, glOrtho.

To jest powód dlaczego te funkcje są uważane za przestarzałe w GL 3.0. Powinieneś mieć własną bibliotekę matematyczną, zbuduj własną matrycę, prześlij swoją matrix do shadera.

Przez bardzo, bardzo długi czas myślałem, że większość funkcji OpenGL używa GPU do obliczeń. Nie jestem pewien, czy jest to powszechne błędne przekonanie, ale po chwili myślenia, to ma sens. Stare funkcje OpenGL (2.x i starsze) nie nadają się do rzeczywistych zastosowań, ze względu na zbyt wiele stanów przełączniki.

To uświadamia mi, że prawdopodobnie wiele funkcji OpenGL w ogóle nie korzysta z GPU.

Więc pytanie brzmi:

Które wywołania funkcji OpenGL nie używają GPU?

Wierzę, że znajomość odpowiedzi na powyższe pytanie pomoże mi stać się lepszym programistą z OpenGL. Podziel się swoimi spostrzeżeniami.

Edit:

Wiem, że to pytanie łatwo prowadzi do poziomu optymalizacji. Jest dobre, ale to nie jest intencja to pytanie.

Jeśli ktoś zna zestaw funkcji GL na pewnej popularnej implementacji (jak sugerował AshleysBrain, nVidia/ATI i ewentualnie zależny od systemu operacyjnego), które nie używają GPU, to właśnie o to mi chodzi!

Wiarygodne wskazówki optymalizacji pojawią się później. Skupmy się na funkcjach w tym temacie.

Edit2:

W tym temacie nie chodzi o to, jak działają transformacje macierzy. Są Inne Tematy do tego.

Author: Community, 2010-04-26

5 answers

Chłopcze, czy to duży temat?

Najpierw zacznę od oczywistego: ponieważ wywołujesz funkcję (dowolną funkcję) z procesora, musi ona działać przynajmniej częściowo na procesorze. Więc pytanie naprawdę brzmi, ile pracy jest wykonywana na CPU, a ile na GPU.

Po drugie, aby GPU mógł wykonać jakieś polecenie, procesor musi przygotować opis polecenia do przekazania. Minimalnym zestawem jest tutaj token polecenia opisujący co robić, a także dane dla operacji do wykonania. Nieco ważne jest również to, jak procesor wyzwala GPU do wykonania polecenia. Ponieważ przez większość czasu jest to drogie, procesor nie robi tego często, ale raczej wsadza polecenia w bufory poleceń i po prostu wysyła cały bufor do obsługi przez GPU.

Wszystko po to, aby powiedzieć, że przekazywanie pracy do GPU nie jest darmowym ćwiczeniem. Ten koszt musi być obarczony tylko uruchomieniem funkcji na procesorze (bez względu na to, o czym mówimy).

Biorąc cofnij się, musisz zadać sobie pytanie, dlaczego w ogóle potrzebujesz GPU. Faktem jest, że czysta implementacja CPU robi to zadanie (jak wspomina AshleysBrain). Moc GPU pochodzi z jego konstrukcji do obsługi:

  • specjalistyczne zadania (rasteryzacja, mieszanie, filtrowanie tekstur, blitting, ...)
  • silnie równoległe obciążenia (DeadMG wskazuje na to w swojej odpowiedzi), gdy procesor jest bardziej zaprojektowany do obsługi prac jednowątkowych.

I to są zasady przewodnie do wykonaj, aby zdecydować, co idzie w chipie. Wszystko, co może z nich skorzystać, powinno działać na GPU. Wszystko inne powinno być na procesorze.

Tak przy okazji, to ciekawe. Niektóre funkcjonalności GL (przede wszystkim przed deprecjacją) naprawdę nie są wyraźnie określone. Listy wyświetlane są prawdopodobnie najlepszym przykładem takiej funkcji. Każdy sterownik może dowolnie przesyłać ze strumienia listy wyświetlanych do GPU (zazwyczaj w formie bufora poleceń) w celu późniejszego wykonania, tak długo, jak długo semantyka list wyświetlanych GL jest zachowana (a to jest nieco twarde w ogóle). Tak więc niektóre implementacje wybierają tylko wypchnięcie ograniczonego podzbioru wywołań z listy do formatu obliczonego i po prostu odtwarzają resztę strumienia poleceń na procesorze.

Wybór jest kolejnym, w którym nie jest jasne, czy istnieje wartość do wykonania na GPU.

Na koniec muszę powiedzieć, że ogólnie rzecz biorąc, istnieje niewielka korelacja między wywołaniami API i ilość pracy na CPU lub GPU. API ustawień stanu ma tendencję do modyfikowania struktury tylko gdzieś w danych sterownika. Jego efekt jest widoczny tylko wtedy, gdy losowanie, lub coś takiego, jest wywoływany.

Wiele API GL działa w ten sposób. W tym momencie pytanie, czy {[0] } jest wykonywane na CPU lub GPU, jest raczej bez znaczenia. Ważne jest to, czy mieszanie nastąpi na GPU po wywołaniu Draw. Więc w tym sensie, Większość punktów wejścia GL nie jest przyspieszana na wszystkie.

Mógłbym też nieco rozszerzyć transfer danych, ale Danvil dotknął tego.

Skończę z małą "ścieżką s/W". Historycznie GL musiał pracować nad spec bez względu na to, jakie były specjalne przypadki sprzętowe. Co oznaczało, że jeśli h / w nie obsługiwał określonej funkcji GL, to musiał ją emulować lub w pełni zaimplementować w oprogramowaniu. Istnieje wiele przypadków tego, ale jeden, który uderzył wiele osób jest, gdy GLSL zaczął się pojawiać.

Ponieważ nie było praktycznego aby oszacować rozmiar kodu shadera GLSL, zdecydowano, że GL ma przyjąć dowolną długość shadera jako prawidłową. Implikacja była dość jasna: albo zaimplementować h / W, które mogłyby przyjmować dowolne długości shadery-nie były w tym czasie realistyczne - albo zaimplementować emulację s / W shader (lub, jak zdecydowali się niektórzy dostawcy, po prostu nie są zgodne). Więc, jeśli uruchomiłeś ten warunek na fragment shader, szanse były cały twojego GL został wykonany na CPU, nawet gdy miałeś GPU siting bezczynny, przynajmniej dla tego losowania.

 36
Author: Bahbar,
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
2010-04-26 20:52:21

Pytanie powinno brzmieć: "jakie funkcje pochłaniają nieoczekiwanie dużą ilość czasu procesora?"

Utrzymywanie stosu macierzy do projekcji i widoku nie jest rzeczą, z którą GPU może poradzić sobie lepiej niż procesor (wręcz przeciwnie ...). Innym przykładem może być kompilacja shaderów. Dlaczego to powinno działać na GPU? Jest parser, kompilator, ..., które są zwykłymi programami CPU, takimi jak kompilator C++.

Potencjalnie "niebezpieczne" wywołania funkcji są na przykład glReadPixels, ponieważ dane może być kopiowany z pamięci hosta (=CPU) do pamięci urządzenia (=GPU)przez ograniczoną magistralę. W tej kategorii znajdują się również funkcje takie jak glTexImage_D lub glBufferData.

Więc ogólnie rzecz biorąc, jeśli chcesz wiedzieć, ile czasu procesora zjada wywołanie OpenGL, spróbuj zrozumieć jego funkcjonalność. I uważaj na wszystkie funkcje, które kopiują dane z hosta do urządzenia iz powrotem!

 7
Author: Danvil,
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
2010-04-26 13:35:57

Zazwyczaj, jeśli operacja jest za-coś, to nastąpi na GPU. Przykładem jest rzeczywista transformacja - odbywa się to raz na wierzchołek. Z drugiej strony, jeśli występuje tylko raz na dużą operację, to będzie na CPU - na przykład tworzenie macierzy transformacji, która jest wykonywana tylko raz za każdym razem, gdy zmienia się stan obiektu, lub raz na klatkę.

To tylko ogólna odpowiedź, a niektóre funkcjonalności pojawią się na odwrót - podobnie jak implementacja zależny. Jednak zazwyczaj nie powinno to mieć znaczenia dla Ciebie, programisty. Tak długo, jak pozwolisz GPU dużo czasu, aby zrobić to praca, gdy jesteś poza robieniem gry sim lub cokolwiek, lub masz solidny model wątku, nie powinieneś się tym martwić aż tak bardzo.

@ wysyłanie danych do GPU: z tego co wiem (używany tylko Direct3D) to wszystko odbywa się w-shaderze, po to są shadery.

 7
Author: Puppy,
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
2010-04-26 17:53:17

GlTranslate, glRotate i glScale zmieniają bieżącą aktywną macierz transformacji. Jest to oczywiście operacja CPU. Widok modelu i macierze projekcyjne opisują tylko, jak procesor graficzny powinien przekształcić wierzchołki po wydaniu polecenia renderowania.

Więc np. przez wywołanie glTranslate nic nie jest jeszcze przetłumaczone. Przed renderowaniem macierze bieżącej projekcji i widoku modelu są mnożone (MVP = projection * modelview), a następnie ta pojedyncza macierz jest kopiowana do GPU, a następnie do GPU czy macierz * wierzchołków mnoży ("T & L") dla każdego wierzchołka. Tak więc tłumaczenie/skalowanie / rzutowanie wierzchołków jest wykonywane przez GPU.

Również naprawdę nie powinieneś martwić się o wydajność, jeśli nie używasz tych funkcji gdzieś w wewnętrznej pętli. glTranslate daje trzy dodatki. glScale i glRotate są nieco bardziej złożone.

Moja rada jest taka, że powinieneś nauczyć się trochę więcej o algebrze liniowej. Jest to niezbędne do pracy z 3D APIs.

 4
Author: Axel Gneiting,
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
2010-04-26 18:10:25

Istnieją renderowane przez oprogramowanie implementacje OpenGL, więc możliwe jest, że nie funkcje OpenGL działają na GPU. Jest też sprzęt, który nie obsługuje pewnych stanów renderowania w sprzęcie, więc jeśli ustawisz określony stan, przełącz się na renderowanie oprogramowania i ponownie, nic nie będzie działać na GPU(nawet jeśli taki jest). Nie sądzę więc, aby było jasne rozróżnienie między "funkcjami PRZYSPIESZANYMI przez GPU" i "funkcjami nie przyspieszanymi przez GPU".

Być po bezpiecznej stronie, trzymaj rzeczy tak proste, jak to możliwe. Proste renderowanie z wierzchołkami i podstawowe funkcje, takie jak buforowanie Z, najprawdopodobniej będą przyspieszane sprzętowo, więc jeśli możesz trzymać się tego przy minimalnej zmianie stanu, najprawdopodobniej utrzymasz przyspieszanie sprzętowe. Jest to również sposób na maksymalizację wydajności renderowania przyspieszonego sprzętowo-Karty graficzne lubią pozostać w jednym stanie i po prostu chrupać kilka wierzchołków.

 2
Author: AshleysBrain,
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
2010-04-26 13:39:46