2013-04-07 15 views

Odpowiedz

47

W przeciwieństwie do innych typów shaderów OpenGL, shadery obliczeniowe nie są bezpośrednio związane z grafiką komputerową i zapewniają znacznie bardziej bezpośrednią abstrakcję podstawowego sprzętu, podobną do CUDA i OpenCL. Zapewnia dostosowywalną wielkość grupy roboczej, pamięć współdzieloną, synchronizację wewnątrz grupy oraz wszystkie znane i lubiane rzeczy z CUDA i OpenCL.

główne różnice są w zasadzie:

  • Wykorzystuje GLSL zamiast OpenCL C. Chociaż nie jest taka ogromna różnica bewteen tych języków programowania, można jednak wykorzystać wszystkie funkcje związane z grafiką GLSL nie dostępne dla OpenCL, takie jak zaawansowane typy tekstur (np. tablice z mapami sześcianów), zaawansowane filtrowanie (np. mipmapping, dobrze Ok, prawdopodobnie będziesz musiał sam obliczyć poziom mip) i małe wygody, takie jak macierze 4x4 lub funkcje geometryczne.
  • Jest to program cieniujący OpenGL, jak każdy inny moduł cieniujący GLSL. Oznacza to, że dostęp do danych OpenGL (takich jak bufory, tekstury, obrazy) jest po prostu trywialny, podczas gdy połączenie między OpenGL i OpenCL/CUDA może stać się uciążliwe, z możliwą ręczną synchronizacją z twojej strony. W ten sam sposób integracja go z istniejącym przepływem pracy OpenGL jest również banalna, podczas gdy konfiguracja OpenCL jest samodzielną książką, nie mówiąc już o jej integracji z istniejącym potokiem graficznym.

Więc co to sprowadza się do tego, że shadery obliczeniowe są rzeczywiście przeznaczone są do stosowania w istniejących aplikacjach OpenGL, choć wykazujące zwykle (OpenCL/CUDA-like) obliczeniowo podejścia do programowania GPU, w przeciwieństwie do grafiki - podejście do innych etapów cieniowania, które nie miały elastyczności obliczeniowej OpenCL/CUDA (oczywiście oferując inne zalety). Tak więc wykonywanie zadań obliczeniowych jest bardziej elastyczne, bezpośrednie i łatwiejsze niż wyciskanie ich na inne etapy cieniowania, które nie są przeznaczone do ogólnych obliczeń lub wprowadzanie dodatkowej struktury obliczeniowej, z którą należy się synchronizować.

Procesory obliczeniowe powinny być w stanie wykonać prawie wszystko, co można osiągnąć za pomocą OpenCL z taką samą elastycznością i kontrolą nad zasobami sprzętowymi iz takim samym podejściem programistycznym. Więc jeśli masz dobry algorytm odpowiedni dla GPU (który dobrze by działał w CUDA lub OpenCL) dla zadania, które chcesz wykonać, to tak, możesz to zrobić także za pomocą shaderów Compute. Ale nie ma sensu korzystanie z OpenGL (który nadal jest i prawdopodobnie będzie zawsze ramową grafiką komputerową w czasie rzeczywistym) tylko z powodu shaderów Compute. Do tego możesz po prostu użyć OpenCL lub CUDA. Prawdziwa siła shaderów Compute wchodzi w grę podczas mieszania funkcji graficznych i obliczeniowych.

+9

Nie zapomnij o gwarancjach precyzji, które OpenCL zapewnia, że ​​GLSL wyraźnie * nie *. –

+0

@NicolBolas Masz na myśli operacje arytmetyczne i funkcje? –

+1

Tak. Dokładność zmiennoprzecinkowa różni się bardzo między tymi dwoma. –

2

Szukaj here dla innej perspektywy. Podsumowując:

Tak, OpenCL już istniały, ale skierowany aplikacje heavyweight (myślę CFD, MES itp), a to jest o wiele bardziej uniwersalny niż OpenGL (myślę poza GPU ... Xeon Phi architektura Intela obsługuje> 50 x86 rdzenie).

Również dzielenie buforów między OpenGL/CUDA i OpenCL nie jest zabawne.

+0

W praktyce, procesor graficzny High-end jest >> 40 razy bardziej wydajny niż procesor High-end, aby rozwiązać problem zrównoleglany, w macierzowym przetwarzaniu, aby był bardziej szczegółowy. Na razie nie dbam o możliwości procesora. Więc wracając do mojego pytania, czy możemy powiedzieć "Matrix Inversion" za pomocą shaderów obliczeniowych? A ile pracy potrzeba w porównaniu do OpenCL? – Maiss

+0

AFAIK, algorytmy równoległe istnieją tylko dla odwracania * rzadkich * macierzy i są one wystarczająco złożone, że prawdopodobnie chcesz je zapisać w C99 (język jądra OpenCL). –

+1

Można wykonywać wiele typów obliczeń w shaderów obliczeniowych OpenGL, które byłyby podobne do OpenCL, z główną różnicą, że OpenGL używa _GLSL_ (języka cieniowania OpenGL) jako języka jądra, w porównaniu do dialektu Open C99 C99. Nie ma ograniczeń do wykonywania obliczeń macierzowych (np. Praca tylko z rzadkimi macierzami), aw szczególnych przypadkach może być możliwe stosowanie algorytmów macierzowych opartych na blokach, które wykorzystują niektóre z macierzystych operacji macierzy GLSL. – radical7

Powiązane problemy