Czy są jakieś znane problemy / algorytmy w obliczeniach naukowych, których nie można przyspieszyć przez równoległość? Podczas czytania książek na temat CUDA wydaje mi się, że większość rzeczy może być.
Czy są jakieś znane problemy / algorytmy w obliczeniach naukowych, których nie można przyspieszyć przez równoległość? Podczas czytania książek na temat CUDA wydaje mi się, że większość rzeczy może być.
Odpowiedzi:
Zacznij od pooglądania Prawa Amdahla . Zasadniczo wszystko, co ma dużą liczbę kroków szeregowych, nieznacznie skorzysta na równoległości. Kilka przykładów obejmuje parsowanie, wyrażenia regularne i większość kompresji o wysokim współczynniku.
Poza tym kluczowym problemem jest często wąskie gardło w przepustowości pamięci. W szczególności w przypadku większości procesorów graficznych twoje teoretyczne klapy znacznie przewyższają liczbę liczb zmiennoprzecinkowych, które możesz dostać się do ALU, ponieważ takie algorytmy o niskiej intensywności arytmetycznej (flops / miss cache) spędzą większość czasu na pamięci RAM.
Wreszcie, za każdym razem, gdy fragment kodu wymaga rozgałęzienia, jest mało prawdopodobne, aby uzyskać dobrą wydajność, ponieważ logika ALU zwykle przewyższa liczbę.
Podsumowując, bardzo prostym przykładem czegoś, co byłoby trudne do uzyskania przyspieszenia z GPU, jest po prostu zliczanie zera w szeregu liczb całkowitych, ponieważ może być konieczne rozgałęzienie, co najwyżej wykonanie 1 operacji (przyrost o jeden) w przypadku znalezienia zera i wykonania co najmniej jednej operacji pobierania pamięci na operację.
Przykładem wolnym od problemu rozgałęziania jest obliczenie wektora, który jest skumulowaną sumą innego wektora. ([1,2,1] -> [1,3,4])
Nie wiem, czy zaliczają się one do „sławnych”, ale z pewnością istnieje wiele problemów, z którymi równoległe przetwarzanie nie pomoże.
(Słynna) metoda szybkiego marszu rozwiązywania równania Eikonal nie może zostać przyspieszona przez równoległość. Istnieją inne metody rozwiązywania równania Eikonal (na przykład metody szybkiego zamiatania), które są bardziej podatne na równoległość, ale nawet tutaj potencjał (równoległego) przyspieszenia jest ograniczony.
Problem z równaniem Eikonal polega na tym, że przepływ informacji zależy od samego rozwiązania. Luźno mówiąc, informacja przepływa wzdłuż charakterystyk (tj. Promieni świetlnych w optyce), ale charakterystyki zależą od samego rozwiązania. A przepływ informacji dla dyskretnego równania Eikonal jest jeszcze gorszy, wymagając dodatkowych przybliżeń (jak domyślnie obecne w metodach szybkiego zamiatania), jeśli pożądane jest jakiekolwiek równoległe przyspieszenie.
Aby zobaczyć trudności z równoległością, wyobraź sobie ładny labirynt, jak w niektórych przykładach na stronie Sethiana . Liczba komórek na najkrótszej ścieżce przez labirynt (prawdopodobnie) jest dolną granicą minimalnej liczby kroków / iteracji dowolnego (równoległego) algorytmu rozwiązującego odpowiedni problem.
(Piszę „(prawdopodobnie) jest”, ponieważ dolne granice są niezwykle trudne do udowodnienia i często wymagają pewnych rozsądnych założeń dotyczących operacji używanych przez algorytm.)
Inną klasą problemów, które trudno jest zrównoważyć w praktyce, są problemy wrażliwe na błędy zaokrąglania, w których stabilność numeryczną osiąga się przez serializację.
Rozważmy na przykład proces Gram – Schmidta i jego szeregową modyfikację. Algorytm działa z wektorami, więc możesz użyć równoległych operacji wektorowych, ale to nie jest dobrze skalowane. Jeśli liczba wektorów jest duża, a rozmiar wektora jest niewielki, zastosowanie równoległego klasycznego Gram-Schmidta i reorthogonalizacji może być stabilne i szybsze niż pojedynczego zmodyfikowanego Gram-Schmidta, chociaż wymaga to kilkakrotnie większej pracy.