Jak kontrolować, które obliczenia są wykonywane na CPU, a które na GPU?
14
Obecnie rozumiem, że wszystko, co dzieje się w pliku modułu cieniującego, jest wykonywane na GPU, a wszystko, co dzieje się w moim (Java, w moim przypadku) kodzie, jest wykonywane na CPU.
Możesz także wykonywać obliczenia na GPU za pomocą czegoś takiego jak OpenCL, który zasadniczo pozwala na uruchamianie kodu na GPU.
Soapy,
Odpowiedzi:
20
To jest sedno tego.
Zasadniczo platforma mogłaby robić wszystko, co tylko zechce. Można sobie wyobrazić zaawansowany system operacyjny, który dokonuje translacji skompilowanego kodu „just in time” z, powiedzmy, x86 na kod GPU. Podobnie sterowniki OpenGL mogą uruchamiać cokolwiek zechce na procesorze hosta.
Ale tak naprawdę to, co właśnie opisałeś, dzieje się.
IIRC, shadery są kompilowane na CPU przed wysłaniem do GPU. I to robi sterownik GPU bez systemu operacyjnego.
MSalters
Prawdziwe. Miałem do czynienia z wieloma błędami kompilacji podczas uruchamiania programu w modułach cieniujących, nawet jeśli kod Java został już skompilowany.
Bassinator,
1
Teoretyczny: Powiedzmy, że miałem program, który bardzo intensywnie wykorzystuje procesor, ale był tylko interfejsem wiersza poleceń (brak pracy graficznej). Czy mogę przenieść część pracy do GPU? Właściwie to nie planuję tego robić, interesuje mnie tylko konceptualna rzecz.
Bassinator,
2
Tak! Link opublikowany przez @return true jest przeznaczony dla biblioteki Java, która to robi. Mówiąc bardziej ogólnie, możesz napisać „moduł cieniujący” w OpenGL lub użyć OpenCL. We wszystkich przypadkach musisz wyodrębnić część kodu, który można zrównoleglać, i przekazać do niego informacje. (Procesory graficzne są w większości idealne do zadań „żenująco równoległych”).
David Van Brink
1
Jedną gwiazdką, którą należy dodać do tej odpowiedzi, jest to, że niektóre implementacje wspierają ideę „preshadera” - to znaczy kodu, który jest częścią modułu cieniującego, ale którego wynik będzie stały dla wszystkich wywołań w danym wywołaniu losowania (np. Mnożenie widoku jednolitego i matryce projekcyjne). Skompilowany moduł cieniujący może identyfikować takie fragmenty kodu i wyciągać je do wykonania po stronie procesora, w tym wynikową stałą moc wyjściową w pracy przesyłanej do GPU. To jeden z typowych przypadków, w których założenie „shader = GPU” może być wygięte, choć tylko szczegółowo.
DMGregory
7
Ogólnie tak. Java jest używana do pisania programów działających na jednostce centralnej. Języki cieniujące (cg, hlsl, i in.) Są używane do pisania programów działających na GPU.
Wyjątkiem od tej reguły byłoby użycie api innych firm, które mogą wypełnić lukę.
Bardzo interesująca wskazówka, twój link do „aparapi”. Uruchom trochę kodu JVM na GPU ... intrygujące!
David Van Brink
3
David Van Brink ogólnie odpowiedział na twoje pytanie.
Ale, jak sam mówi, sterownik OpenGL może uruchamiać procesor na procesorze, a dzieje się tak naprawdę często. Zwłaszcza w kontekstach kompatybilności, w których niektóre dziwne starsze funkcje nie mogą być zaimplementowane na kartach graficznych. Wymagają emulacji oprogramowania. Na przykład, słyszałem, zanim to stippling zostanie wykonany na CPU. Możesz również spodziewać się niespodzianek przy wyborze.
Te niespodzianki mogą się zdarzyć jeszcze bardziej na MacOS przy użyciu kontekstów 2.1, ponieważ Apple dość dobrze ujednoliciło widok OpenGL w całym zakresie sprzętu, a niektórym mniejszym sprzętom brakuje pewnych elementów, które należy emulować. Jest tak dalece, że faktycznie można w pełni wykonać specyfikację CAŁĄ specyfikację OpenGL 2.1 na CPU, jeśli kod tworzenia kontekstu wyraźnie określa urządzenie programowe.
I odwrotnie, kod wykonywany za pomocą bibliotek obliczeniowych takich jak vexcl lub boost compute, AMP firmy Microsoft lub ciąg nVidia, MOŻE być wykonywany na GPU lub CPU w zależności od flag konfiguracji API.
I na koniec, wewnątrz procesora masz również architekturę DSP, której część nazywamy SIMD. Kompilator ispc firmy Intel zapewnia pomoc w generowaniu kodu „zapewnianego” do działania na liniach SIMD z dużą ilością diagnostyki wydajności w czasie kompilacji, aby pomóc Ci w pełni go wykorzystać. Dodaj do tego OpenMP, a otrzymasz wielowątkową kartę SIMD, która zbliża się do koncepcji układów GPU. Jeśli masz wysokiej klasy procesor i niską kartę graficzną, może to być bardziej wydajne. http://ispc.github.io/
Odpowiedzi:
To jest sedno tego.
Zasadniczo platforma mogłaby robić wszystko, co tylko zechce. Można sobie wyobrazić zaawansowany system operacyjny, który dokonuje translacji skompilowanego kodu „just in time” z, powiedzmy, x86 na kod GPU. Podobnie sterowniki OpenGL mogą uruchamiać cokolwiek zechce na procesorze hosta.
Ale tak naprawdę to, co właśnie opisałeś, dzieje się.
źródło
Ogólnie tak. Java jest używana do pisania programów działających na jednostce centralnej. Języki cieniujące (cg, hlsl, i in.) Są używane do pisania programów działających na GPU.
Wyjątkiem od tej reguły byłoby użycie api innych firm, które mogą wypełnić lukę.
źródło
David Van Brink ogólnie odpowiedział na twoje pytanie.
Ale, jak sam mówi, sterownik OpenGL może uruchamiać procesor na procesorze, a dzieje się tak naprawdę często. Zwłaszcza w kontekstach kompatybilności, w których niektóre dziwne starsze funkcje nie mogą być zaimplementowane na kartach graficznych. Wymagają emulacji oprogramowania. Na przykład, słyszałem, zanim to stippling zostanie wykonany na CPU. Możesz również spodziewać się niespodzianek przy wyborze.
Te niespodzianki mogą się zdarzyć jeszcze bardziej na MacOS przy użyciu kontekstów 2.1, ponieważ Apple dość dobrze ujednoliciło widok OpenGL w całym zakresie sprzętu, a niektórym mniejszym sprzętom brakuje pewnych elementów, które należy emulować. Jest tak dalece, że faktycznie można w pełni wykonać specyfikację CAŁĄ specyfikację OpenGL 2.1 na CPU, jeśli kod tworzenia kontekstu wyraźnie określa urządzenie programowe.
I odwrotnie, kod wykonywany za pomocą bibliotek obliczeniowych takich jak vexcl lub boost compute, AMP firmy Microsoft lub ciąg nVidia, MOŻE być wykonywany na GPU lub CPU w zależności od flag konfiguracji API.
I na koniec, wewnątrz procesora masz również architekturę DSP, której część nazywamy SIMD. Kompilator ispc firmy Intel zapewnia pomoc w generowaniu kodu „zapewnianego” do działania na liniach SIMD z dużą ilością diagnostyki wydajności w czasie kompilacji, aby pomóc Ci w pełni go wykorzystać. Dodaj do tego OpenMP, a otrzymasz wielowątkową kartę SIMD, która zbliża się do koncepcji układów GPU. Jeśli masz wysokiej klasy procesor i niską kartę graficzną, może to być bardziej wydajne.
http://ispc.github.io/
źródło