GPGPU kontra Multicore?

Jakie są najważniejsze praktyczne różnice pomiędzy GPGPU a zwykłym programowaniem wielordzeniowym / wielowątkowym CPU z punktu widzenia programisty? Konkretnie:

  • Jakie typy problemów są lepiej dopasowane do zwykłego wielordzeniowego i jakie typy są lepiej dopasowane do GPGPU?

  • Jakie są główne różnice w modelu programowania?

  • Jakie są kluczowe różnice sprzętowe, które wymagają jakichkolwiek różnic w programowaniu modelka?

  • Który z nich jest zazwyczaj łatwiejszy w użyciu i o ile?

  • Czy jest to praktyczne, w dłuższej perspektywie, zaimplementować biblioteki równoległości wysokiego poziomu dla GPU, takie jak Microsoft 's task parallel library lub d' s std.paralelizm ?

  • Jeśli procesory graficzne są tak spektakularnie wydajne, dlaczego Procesory nie są zaprojektowane bardziej jak GPU?

Author: dsimcha, 2011-05-07

2 answers

Ciekawe pytanie. Zbadałem ten problem, więc moja odpowiedź opiera się na pewnych referencjach i osobistych doświadczeniach.

Jakie typy problemów są lepiej dopasowane do zwykłego wielordzeniowego i jakie typy są lepiej dopasowane do GPGPU?

Jak wspomniał @ Jared. GPGPU są zbudowane dla bardzo regularnych obciążeń przepustowości, np. grafika, gęsta matryca-mnożenie macierzy, Proste filtry photoshop, itp. Są dobrzy w tolerowaniu długich opóźnień, ponieważ są z natury zaprojektowany, aby tolerować próbkowanie tekstur, ponad 1000 cykli pracy. Rdzenie GPU mają wiele wątków: gdy jeden wątek uruchomi operację z długim opóźnieniem (powiedzmy dostęp do pamięci), wątek ten zostanie uśpiony (a inne wątki będą działać), dopóki operacja z długim opóźnieniem się nie zakończy. Dzięki temu procesory GPU mogą zajmować jednostki wykonawcze znacznie więcej niż tradycyjne rdzenie.

GPU nie radzą sobie z gałęziami, bo GPU lubią wsadzać "wątki" (SIMD, jeśli nie nVidia) do warpów i wysyłać je w dół potoku razem, aby zaoszczędzić na instrukcji pobierania / dekodowania mocy. Jeśli wątki napotkają gałąź, mogą się różnić, np. 2 wątki w osnowie 8-nitkowej mogą wziąć gałąź, podczas gdy pozostałe 6 może jej nie wziąć. Teraz warp musi być podzielony na dwie warpy wielkości 2 i 6. Jeśli twój rdzeń ma 8 pasów SIMD (dlatego oryginalny warp pakował 8 wątków), teraz Twoje dwa nowo utworzone warpy będą działać nieefektywnie. Osnowa 2-nitkowa będzie działać z wydajnością 25%, A osnowa 6-nitkowa będzie działać z wydajnością 75% wydajność. Można sobie wyobrazić, że jeśli GPU nadal napotyka zagnieżdżone gałęzie, jego wydajność staje się bardzo niska. Dlatego GPU nie są dobre w obsłudze gałęzi i dlatego kod z gałęziami nie powinien być uruchamiany na GPU.

GPU są również złe współpracy wątków. Jeśli wątki muszą ze sobą rozmawiać, to GPU nie będzie działać dobrze, ponieważ synchronizacja nie jest dobrze obsługiwana na GPU (ale nVidia jest na nim).

Dlatego najgorszym kodem dla GPU jest kod o mniejszej równoległości lub kod z dużą ilością gałęzi lub synchronizacji.

Jakie są główne różnice w modelu programowania?

GPU nie obsługują przerwań i WYJĄTKÓW. Dla mnie to największa różnica. Poza tym CUDA nie różni się zbytnio od C. możesz napisać program CUDA, w którym wysyłasz kod do GPU i uruchamiasz go tam. Masz dostęp do pamięci w CUDA trochę inaczej, ale znowu to nie jest fundamentalne dla naszej dyskusji.

Jakie są kluczowe elementy sprzętowe różnice, które wymagają jakichkolwiek różnic w modelu programowania?

Już o nich wspomniałem. Największy jest charakter SIMD GPU, który wymaga kodu do pisania w bardzo regularny sposób, bez gałęzi i komunikacji między wątkami. Jest to część tego, dlaczego np. CUDA ogranicza liczbę zagnieżdżonych gałęzi w kodzie.

Który z nich jest zazwyczaj łatwiejszy w użyciu i o ile?

Zależy od tego, co kodujesz i jaki jest twój cel.

Łatwo wektoryzowalny kod: procesor jest łatwiejszy w kodowaniu, ale o niskiej wydajności. GPU jest nieco trudniejsze do zakodowania, ale zapewnia wielki wybuch dla kasy. Dla wszystkich innych procesor jest łatwiejszy i często lepsza wydajność.

Czy jest to praktyczne, w dłuższej perspektywie, zaimplementować biblioteki równoległości wysokiego poziomu dla GPU, takie jak Microsoft 's task parallel library lub D' s std.paralelizm?

Task-paralelizm, z definicji, wymaga komunikacji wątkowej i ma również gałęzie. Idea zadań polega na tym, że różne wątki robią różne rzeczy. GPU są przeznaczone dla wielu wątków, które robią identyczne rzeczy. Nie budowałbym bibliotek paralelizmu zadań dla GPU.

Jeśli procesory graficzne są tak spektakularnie wydajne, dlaczego Procesory nie są zaprojektowane bardziej jak GPU?

Wiele problemów na świecie jest rozgałęzionych i nieregularnych. 1000 przykładów. Algorytmy wyszukiwania wykresów, systemy operacyjne, przeglądarki internetowe itp. Dodam tylko, że nawet grafika staje się bardziej i bardziej rozgałęzione i ogólnego przeznaczenia, jak każda generacja, więc GPU będzie coraz bardziej podobny do procesorów. Nie mówię, że staną się tak samo jak procesory, ale staną się bardziej programowalne. Odpowiedni model znajduje się gdzieś pomiędzy nieefektywnymi procesorami a bardzo wyspecjalizowanymi procesorami graficznymi.

 38
Author: Aater Suleman,
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
2011-05-09 23:49:04

Nawet w wielordzeniowym procesorze Twoje jednostki pracy będą znacznie większe niż na GPGPU. GPGPU są odpowiednie dla problemów, które skalują się bardzo dobrze, przy czym każda część pracy jest wyjątkowo mała. GPGPU ma znacznie większe opóźnienia, ponieważ musisz przenieść dane do systemu pamięci GPU, zanim będą dostępne. Jednak, gdy dane tam będą, przepustowość, jeśli problem jest odpowiednio skalowalny, będzie znacznie wyższa w przypadku GPGPU. Z mojego doświadczenia wynika, że problem z GPGPU programowanie jest opóźnieniem w pobieraniu danych z normalnej pamięci do GPGPU.

Również, GPGPU są straszne w komunikacji między procesami pracowniczymi, jeśli procesy pracownicze nie mają sfery routingu lokalizacji. Jeśli próbujesz komunikować się przez GPGPU, będziesz bardzo cierpiał. Z tego powodu standardowe biblioteki MPI słabo nadają się do programowania GPGPU.

Wszystkie komputery nie są zaprojektowane jak GPU, ponieważ GPU są fantastyczne przy dużym opóźnieniu, wysokim obliczenia przepustowości, które są z natury równoległe i można je łatwo podzielić. Większość tego, co robi procesor, nie jest z natury równoległa i nie skaluje się do tysięcy lub milionów jednoczesnych pracowników bardzo wydajnie. Na szczęście programowanie Grafiki robi i dlatego to wszystko zaczęło się w GPU. Ludzie coraz częściej znajdują problemy, które mogą wyglądać jak problemy z Grafiką, co doprowadziło do wzrostu programowania GPGPU. Jednak programowanie GPGPU jest naprawdę warte twój czas, jeśli jest odpowiedni do Twojej domeny problemu.

 24
Author: Jared Harding,
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
2011-05-07 05:07:03