Po co korzystać z SIMD, jeśli mamy GPGPU?

13

Myślałem, że to pytanie jest lepiej obsługiwane w części CS programu Stack Exchange. Teraz, gdy mamy GPGPU z takimi językami jak CUDA i OpenCL, czy rozszerzenia multimediów SIMD (SSE / AVX / NEON) nadal spełniają swoje zadanie?

Niedawno przeczytałem artykuł o tym, jak można zastosować instrukcje SSE do przyspieszenia sortowania sieci. Myślałem, że to całkiem fajne, ale kiedy powiedziałem mojemu profesorowi specjalizacji, zaśmiał się i powiedział, że uruchomienie podobnego kodu na GPU zniszczy wersję SIMD. Nie wątpię w to, ponieważ SSE jest bardzo proste, a procesory graficzne to duże, bardzo złożone akceleratory z dużo większą równoległością, ale przyszło mi do głowy, czy istnieje wiele scenariuszy, w których rozszerzenia multimedialne SIMD są bardziej przydatne niż używanie GPU?

Jeśli GPGPU powodują, że SIMD jest zbędne, dlaczego Intel miałby zwiększać obsługę SIMD? SSE miało 128 bitów, teraz jest to 256 bitów z AVX, aw przyszłym roku będzie to 512 bitów. Jeśli GPGPU lepiej przetwarzają kod z równoległością danych, dlaczego Intel przesuwa te rozszerzenia SIMD? Mogą być w stanie umieścić równoważne zasoby (badania i obszar) w większej pamięci podręcznej i predyktorze gałęzi, poprawiając w ten sposób wydajność szeregową.

Dlaczego warto korzystać z SIMD zamiast GPGPU?

jonfrazen
źródło
2
Samo wyzwanie to zasilenie GPU wystarczającą ilością danych, aby był zajęty. Transfer danych między hostem a urządzeniem jest praktycznie zawsze wąskim gardłem. Niektóre operacje są lepiej obsługiwane na procesorach (np. Mnożenie bez przenoszenia; patrz PCLMULQDQ).
Juho
2
@Juho Czy nowe urządzenia, takie jak APU AMD, nie mają procesora graficznego i procesora na tej samej kostce? Czy to eliminuje wąskie gardło?
jonfrazen
1
Kiedy wszystko jest powiedziane i zrobione, instrukcja wektorowa jest nadal pojedynczą instrukcją, a koszt zaplanowania i wykonania jest taki sam, jak każdej innej pojedynczej instrukcji. Uruchamianie zadań na GPU ma sens tylko wtedy, gdy korzyść przewyższa koszt. Weź również pod uwagę, że dostajesz jedną jednostkę SIMD na rdzeń, ale zwykle tylko jeden GPU na obudowę, a GPU jest obecnie zasobem współdzielonym. Ogranicza to liczbę zadań, które można uruchomić na GPU. (Liczba rdzeni cały czas rośnie, ale liczba procesorów graficznych nie.)
Pseudonim
Intel nie robi wiele pod względem układów GPU (poza Larrabee / Knights Landing :)), więc myślę, że to naturalne, że zamiast tego próbują wypchnąć AVX. Chociaż intensywne korzystanie z AVX może być bardzo wydajne, teraz skutkuje obniżeniem częstotliwości na ich nowszych procesorach, więc mogą z czymś przekraczać granice.
nsandersen

Odpowiedzi:

16

Nic nie jest darmowe. GPGPU SIMD. Instrukcje SIMD na GPGPU są zwykle szersze niż instrukcje SIMD na procesorach. GPGPU mają tendencję do drobnoziarnistej wielowątkowości (i mają znacznie więcej kontekstów sprzętowych niż procesory). GPGPU są zoptymalizowane do przesyłania strumieniowego . Zwykle poświęcają większy procent powierzchni jednostkom zmiennoprzecinkowym, niższy procent powierzchni do pamięci podręcznej i niższy procent powierzchni do wydajności całkowitej.

Zróbmy porównanie. Rdzeń Intela i7-5960x ma 8 rdzeni, każdy z 4-calowym (podwójna precyzja) SIMD, działającym z 3 GHz (3,5 GHz turbo), 20 MB pamięci podręcznej L3, zużywa 356 mm ^ 2 i 140 W i kosztuje 1000 USD. Więc 8 * 4 * 3 * 4 = 384 GFlops o podwójnej precyzji. (Dodatkowe 4x wynika z tego, że można wykonać dwa stopione-wielokrotne-dodania na ścieżkę wektorową na cykl). Może wykonać 768 pojedynczych precyzyjnych GFlopów. To około 1,08 DP GFlops / mm ^ 2 i 2,75 DP GFlops / Watt. Istnieje również około 57,5 ​​KB / mm ^ 2 pamięci podręcznej na chipie.

GeForce GTX Titan Black firmy NVidia ma 15 SMX, każdy z 32-calową podwójną precyzją SIMD, działającą z 890 MHz (980 MHz turbo), 3,5 M pamięci podręcznej L1 + L2, zużywa 561 mm ^ 2, 250 W i kosztuje 1000 USD. Więc 15 * 32 * .89 * 4 = 1709 podwójnej precyzji GFlops. (To samo 4x z dwóch stopionych-pomnożonych -dodanych na ścieżkę wektorową na cykl). Może wykonać 5126 pojedynczych precyzyjnych GFlops. To około 3,05 DP GFlops / mm ^ 2 i 6,8 DP GFlops / Watt. Zatem 3x gęstość zmiennoprzecinkowa DP na jednostkę powierzchni i 3x efektywność energetyczna zmiennoprzecinkowa DP. A kompromis? 6,4 KB / mm ^ 2 wbudowanej pamięci podręcznej. Około 9 razy mniej gęsty niż procesor.

Główną różnicą jest to, że procesor graficzny wybrał równowagę powierzchni, która zdecydowanie faworyzuje zmiennoprzecinkowe (a zwłaszcza zmiennoprzecinkowe pojedynczej precyzji) nad pamięcią podręczną. Nawet ignorując fakt, że musisz kopiować rzeczy między CPU a GPU, aby wykonać operacje wejścia / wyjścia, to jak dobrze GPU poradzi sobie z procesorem, zależy od uruchomionego programu.

Jeśli masz równoległy program zmiennoprzecinkowy danych z bardzo małą rozbieżnością sterowania (wszystkie linie wektorowe robią to samo w tym samym czasie) i twój program przesyła strumieniowo (nie może korzystać z buforowania), wtedy GPU będzie o 3x bardziej wydajna na jednostkę powierzchni lub na wat. Ale jeśli masz znaczną rozbieżną kontrolę, pracę nie równoległą do danych lub możesz skorzystać z dużych struktur danych wielokrotnie odczytywanych, procesor prawdopodobnie zrobi to lepiej.

Wędrująca logika
źródło