PYTANIE: Przetwarzanie równoległe i rozproszone
Jaka jest (są) różnica(-e) między obliczeniami równoległymi i rozproszonymi? Jeśli chodzi o skalowalność i wydajność, bardzo często spotyka się rozwiązania dotyczące obliczeń w klastrach maszyn, a czasem nazywa się je przetwarzaniem równoległym lub przetwarzaniem rozproszonym. W pewnym sensie obliczenia wydają się zawsze równoległe, ponieważ niektóre rzeczy działają równolegle. Ale czy obliczenia rozproszone są po prostu związane z korzystaniem z więcej niż jednej maszyny, czy też są jakieś dodatkowe cechy, które odróżniają te dwa rodzaje przetwarzania? Czy nie byłoby zbędne stwierdzenie, na przykład, że obliczenia są równoległe ORAZ rozproszone?
ODPOWIEDŹ:
Mówiąc prosto, „równoległe” oznacza jednoczesne działanie na różnych zasobach (procesorach), podczas gdy „rozproszone” oznacza działanie na różnych komputerach, co wiąże się z problemami związanymi z sieciami. Obliczenia równoległe z wykorzystaniem na przykład OpenMP nie są rozproszone, podczas gdy przetwarzanie równoległe z przekazywaniem wiadomości jest często rozproszone. Ustawienie „rozproszonego, ale nie równoległego” oznaczałoby niepełne wykorzystanie zasobów, więc rzadko się go spotyka, ale jest to możliwe koncepcyjnie.
Pojęcia „przetwarzanie równoległe” i „przetwarzanie rozproszone” z pewnością w dużym stopniu się pokrywają, ale można je dalej różnicować. W rzeczywistości zrobiłeś to już w swoim pytaniu, pytając później o „przetwarzanie równoległe” i „przetwarzanie rozproszone”. „Komputer rozproszony” można uznać za bardziej ogólny termin obejmujący „przetwarzanie rozproszone”, a także na przykład „pamięć rozproszona”. Powszechny termin „rozproszony” zwykle odnosi się do pewnego rodzaju przekazu wiadomości w sieci między fizycznie oddzielonymi komputerami. Termin „przetwarzanie równoległe” jest również w trakcie dalszego definiowania, np. poprzez wyraźne rozróżnienie między terminami „równoległy” i „równoległy”, gdzie – z grubsza – pierwszy odnosi się do paralelizmu danych, a drugi do paralelizmu zadań, chociaż nie ma tak naprawdę ścisłych i wiążących definicji.
Można by tak powiedzieć
* „Przetwarzanie rozproszone” zwykle (choć niekoniecznie) oznacza, że jest to również „przetwarzanie równoległe”
* „Przetwarzanie rozproszone” jest bardziej ogólne i obejmuje również aspekty niezwiązane z równoległością
* i oczywiście „obliczanie równoległe” / „przetwarzanie równoległe” nie oznacza, że jest ono „rozproszone”
Odpowiedzi przedstawione do tej pory są bardzo miłe, ale spodziewałem się także, że położę nacisk na szczególną różnicę między przetwarzaniem równoległym a rozproszonym: wykonanym kodem. Biorąc pod uwagę procesy równoległe, wykonywany kod jest taki sam, niezależnie od poziomu równoległości (instrukcja, dane, zadanie). Piszesz pojedynczy kod, który będzie wykonywany przez różne wątki / procesory, np. podczas obliczania produktów macierzy lub generowania permutacji. Z drugiej strony przetwarzanie rozproszone obejmuje wykonywanie różnych algorytmów / programów w tym samym czasie w różnych procesorach (z jednego lub większej liczby komputerów). Takie obliczenia są następnie łączone w wyniki pośrednie / końcowe przy użyciu dostępnych środków komunikacji / synchronizacji danych (pamięć współdzielona, sieć). Ponadto przetwarzanie rozproszone jest bardzo atrakcyjne dla przetwarzania BigData, ponieważ pozwala na wykorzystanie równoległości dysków (zwykle wąskie gardło w przypadku dużych baz danych). Wreszcie, dla poziomu równoległości można go raczej traktować jako ograniczenie synchronizacji. Na przykład, w GPGPU, który jest wieloma danymi z pojedynczej instrukcji (SIMD), równoległość występuje poprzez posiadanie różnych danych wejściowych dla pojedynczej instrukcji, przy czym każda para (data_i, instrukcja) jest wykonywana przez inny wątek. Takie ograniczenie jest takie, że w przypadku rozbieżnych gałęzi konieczne jest odrzucenie wielu niepotrzebnych obliczeń, dopóki wątki się nie zbiegną. W przypadku wątków procesorów zwykle się różnią; jednak można użyć struktur synchronizacyjnych, aby zezwolić na równoczesne wykonanie określonych sekcji kodu.