2013-05-18 15 views
36

Czy preferuję obliczanie macierzy na procesorze lub GPU?Czy należy obliczyć macierze na GPU lub na procesorze?

Załóżmy, że mam następujące macierze P * V * M, czy należy je obliczyć na procesorze, aby można było wysłać ostateczną macierz do procesora graficznego (GLSL), czy też powinienem wysłać te trzy macierze osobno do GPU, aby GLSL mógł obliczyć ostateczna matryca?

Chodzi mi o to, że w tym przypadku GLSL musiałby obliczyć macierz MVP dla każdego wierzchołka, więc prawdopodobnie jest to szybsze do wstępnego obliczenia na procesorze.

Ale powiedzmy, że GLSL musi tylko raz obliczyć macierz MVP, czy GPU wyliczy ostatnią macierz szybciej niż CPU?

+1

Czy możesz podać przykład wykonywania tych obliczeń tylko raz w GPU? – Amadeus

+2

1. Zoptymalizuj ostatni. Czy na pewno nie tylko zwlekasz? :) 2. Jeśli nie możesz zmierzyć wydajności i zidentyfikować wąskich gardeł, nie myśl o optymalizacji. –

+0

Po prostu uwaga, jeśli bezpośrednio mnożysz wektor, jak w 'projekcji * widoku * modelu * wierzchołka' Wtedy właściwie nie ma mnożenia' matrycy'. Tylko multiplikacje 'matrix * vector', ponieważ jest oceniane od prawej do lewej' (rzutowanie * (widok * (model * wierzchołek))) '. Jest to znacznie mniej uciążliwe w obliczeniach. –

Odpowiedz

50

Zasada ogólna: Jeśli można przekazać je do modułu cieniującego w postaci mundurze, zawsze precalculate na CPU; bez wyjątków. Obliczenia po stronie modułu cieniującego mają sens tylko dla wartości, które różnią się między wierzchołkami i fragmentami. Wszystko, co jest stałe w całej partii wierzchołków, jest najskuteczniej rozwiązywane na procesorze.

Procesory graficzne nie są magiczne "potrafią robić szybciej wszystko". Istnieją pewne zadania, w których procesor może z łatwością przewyższyć GPU, nawet w przypadku bardzo dużych zestawów danych. Tak więc bardzo prosta wytyczna jest następująca: Jeśli możesz przenieść ją do procesora, nie wydając więcej czasu procesora, wykonując obliczenia, niż to konieczne, aby procesor GPU zsumował go, a następnie zrób to na procesorze. Do tych zadań należy obliczenie pojedynczej macierzy.

+6

Procesory graficzne są zwykle szybsze w przypadku problemów, które są "zawstydzające" równolegle. – fluffels

+3

Czy mnożenie macierzy nie jest równoległe? Każdy element może być obliczany niezależnie. – Calmarius

+4

@ Calmarius: Tak, możesz zrównoleglić obliczenia macierzy i faktycznie większość procesorów będzie je zrównoleglić używając ich zestawów instrukcji wektorowych. Ale macierze muszą być obliczane tylko dokładnie * raz * i pozostają takie same dla wszystkich wierzchołków modelu przy użyciu tej konkretnej transformacji. Samo obciążenie tylko po to, aby GPU wykonać mnożenie macierzy 4 × 4, wymaga więcej instrukcji (i czasu) niż wykonanie tych obliczeń na procesorze. Jeśli chcesz zrównoleglić mnożenie macierzy 2k × 2k, wtedy układy GPU ładnie to zrównują. Ale dla matrycy 4 × 4 obciążenie nie jest po prostu warte. – datenwolf

13

Zależy od większości sytuacji w OpenGL.

W większości przypadków pojedyncze obliczenie można wykonać szybciej na procesorze niż na GPU. Zaletą GPU jest to, że potrafi wykonywać wiele obliczeń równolegle.

Z drugiej strony zależy to również od tego, gdzie występują wąskie gardła. Jeśli twój procesor wykonuje dużo innych prac, ale twoje shadery nie są jeszcze wąskim gardłem w systemie docelowym o najniższej mocy, to możesz łatwo zauważyć poprawę wydajności, przenosząc niektóre multiplikacje macierzy do vertex shader.

Zasadniczo powinieneś unikać wszelkich prac w module cieniującym fragmentów, które można również wykonać w module cieniującym wierzchołków lub na procesorze, ale poza tym zależy to od sytuacji. Jeśli nie masz problemów z wydajnością, po prostu zrób to, co jest dla ciebie najłatwiejsze, a jeśli masz problemy z wydajnością, wykonaj to w obie strony i zoptymalizuj wydajność, aby sprawdzić, która z nich działa lepiej.

+4

Obliczenie garstki macierzy, szczególnie MVP, nigdy nie jest wąskim gardłem w CPU. – datenwolf

+7

@ datenwolf nie, nie jest, ale też nie jest wolny. Jeśli więc program nie jest wymagający graficznie, ale ma inne części, które są wymagające obliczeniowo, pozwolenie GPU na obliczenie kilku nadmiarowych macierzy MVP może być w porządku. Jak już powiedziałem, wszystko zależy od sytuacji. – bcrist

+7

Cała obawa, że ​​procesor GPU obliczy coś, zabiera znacznie więcej cykli niż proste obliczenia macierzy. Możesz wykonać obliczenia 4 × 4 · 4 × 4 w 16 instrukcjach na temat nowoczesnych procesorów.To znacznie mniej niż to, co jest wymagane, aby wybrać program cieniujący, ustawić mundurki i uzyskać zwrotny tryb pracy GPU, wysyłając element pierwotny do renderowania. Obciążenie związane z tym, że procesor GPU rzeczywiście coś robi jest dość wysokie, dlatego starasz się grupować zadania tak duże, jak to tylko możliwe do GPU. – datenwolf