Który algorytm sortowania równoległego ma najlepszą średnią wydajność przypadku?

136

Sortowanie zajmuje O (n log n) w przypadku szeregowym. Jeśli mamy O (n) procesorów, liczylibyśmy na liniowe przyspieszenie. Istnieją algorytmy równoległe O (log n), ale mają one bardzo wysoką stałą. Nie mają również zastosowania na standardowym sprzęcie, który nie ma w pobliżu procesorów O (n). W przypadku procesorów p rozsądne algorytmy powinny zająć O (n / p log n) czasu.

W przypadku seryjnego sortowanie szybkie ma średnio największą złożoność w czasie wykonywania. Równoległy algorytm szybkiego sortowania jest łatwy do zaimplementowania (patrz tutaj i tutaj ). Jednak nie działa dobrze, ponieważ pierwszym krokiem jest podzielenie całej kolekcji na jeden rdzeń. Znalazłem informacje o wielu algorytmach sortowania równoległego, ale jak dotąd nie widziałem niczego, co wskazywałoby na wyraźnego zwycięzcę.

Chcę posortować listy od 1 miliona do 100 milionów elementów w języku JVM działającym na 8 do 32 rdzeniach.

Craig P. Motlin
źródło
1
Myślę, że masz o jeden za dużo n / p w swoim „należy wziąć”
Sparr
@Sparr Nie sądzę. Rozróżniam posiadanie kilku procesorów i tyle procesorów, ile jest sortowanych elementów.
Craig P. Motlin
@ CraigP.Motlin racja, ale wydaje się, że błędnie „rozprowadziłeś” / p. Powinien być tylko jeden / p.
Sparr
@Sparr Ah, zmieniłem to, dzięki.
Craig P. Motlin
@ CraigP.Motlin Myślę, że zatrzymałeś niewłaściwy :)
Sparr

Odpowiedzi:

206

Poniższy artykuł (plik PDF do pobrania) jest studium porównawczym algorytmów sortowania równoległego na różnych architekturach:

Algorytmy sortowania równoległego na różnych architekturach

Zgodnie z artykułem sortowanie próbek wydaje się być najlepsze w przypadku wielu typów architektury równoległej.

Aktualizacja w celu rozwiązania problemu wieku Marka:

Oto nowsze artykuły wprowadzające coś bardziej nowatorskiego (z 2007 roku, które przy okazji wciąż porównuje się z sortowaniem przykładowym):

Ulepszenia sortowania próbek według
AA

Krwawienie (około 2010 r., Niektóre mają zaledwie kilka miesięcy):

Wzorzec sortowania
równoległego Sortowanie równoległe oparte na wielu rdzeniach GPU
Hybrydowe sortowanie równoległe CPU / GPU
Randomized Parallel Sortowanie Algorytm z badaniem eksperymentalnym
Wysoce skalowalne sortowanie równoległe
Sortowanie N-elementów przy użyciu naturalnego porządku: nowe podejście do sortowania adaptacyjnego

Aktualizacja na rok 2013: Oto ostra sytuacja, około stycznia 2013 r. (Uwaga: niektóre linki prowadzą do artykułów w Citeseer i wymagają bezpłatnej rejestracji):

Wykłady uniwersyteckie:
Partycjonowanie równoległe do selekcji i sortowania
Algorytmy sortowania równoległego Wykład Algorytmy sortowania
równoległego Wykład 2
Algorytmy sortowania równoległego Wykład 3

Inne źródła i publikacje:
Nowatorski algorytm sortowania dla architektur wielordzeniowych oparty na adaptacyjnym sortowaniu bitonicznym
Wysoce skalowalne sortowanie
równoległe 2 Równoległe łączenie
równoległe Łączenie 2
równoległych systemów samosortowania dla obiektów
Porównanie wydajności sekwencyjnych algorytmów szybkiego sortowania i równoległych algorytmów szybkiego sortowania
Pamięć współdzielona, ​​przekazywanie wiadomości i hybrydowe sortowanie scalające dla samodzielnych i klastrowych SMP
Różne algorytmy równoległe (sortowanie i inne), w tym implementacje

Hybrydowe źródła i dokumenty GPU i CPU / GPU:
Metoda OpenCL równoległego sortowania algorytmów dla architektury GPU
Sortowanie danych z wykorzystaniem jednostek przetwarzania grafiki
Wydajne algorytmy sortowania na GPU
Projektowanie wydajnych algorytmów sortowania dla wielu procesorów graficznych
Deterministyczne sortowanie próbek dla GPU
Szybkie sortowanie na miejscu dzięki CUDA w oparciu o sortowanie bitoniczne
Szybkie równoległe sortowanie GPU przy użyciu algorytmu hybrydowego
Szybkie równoległe sortowanie algorytmów na procesorach graficznych
Szybkie sortowanie na procesorach i GPU: przypadek braku pasma Sortowanie SIMD Sortowanie
próbek
GPU GPU-ABiSort: optymalne sortowanie równoległe w architekturze strumieniowej
GPUTeraSort: wysoki wydajne sortowanie koprocesorów graficznych do zarządzania dużymi bazami danych
Wysokowydajny algorytm sortowania oparty na porównaniu na wielordzeniowych procesorach graficznych
Równoległe zewnętrzne sortowanie dla procesorów graficznych z obsługą CUDA z równoważeniem obciążenia i niskim narzutem transferu
Sortowanie na procesorach GPU dla dużych zbiorów danych: dokładne porównanie

Michael Goldshteyn
źródło
2
Jest to badanie porównawcze algorytmów sortowania równoległego na różnych architekturach obecnych w 1996 roku. Od tego czasu wiele się zmieniło w obliczeniach równoległych.
Znak wysokiej wydajności
1
Wygląda na to, że przegapiłeś to, co jest najlepsze w IMHO, wydajną implementację sortowania w wielordzeniowej architekturze SIMD. Z badań Intela, zaprezentowanych na VLDB 2008.
alecco
1
To byłaby kiedyś świetna odpowiedź. Teraz większość linków jest uszkodzona.
Tim Long,
7

Pracowałem zarówno z algorytmem Parallel Quicksort, jak i algorytmem PSRS, który zasadniczo łączy quicksort równolegle z łączeniem.

Dzięki algorytmowi Parallel Quicksort zademonstrowałem prawie liniowe przyspieszenie do 4 rdzeni (dwurdzeniowy z hiperwątkowością), co jest oczekiwane, biorąc pod uwagę ograniczenia algorytmu. Czyste równoległe szybkie sortowanie opiera się na współdzielonym zasobu stosu, co spowoduje rywalizację między wątkami, zmniejszając w ten sposób wzrost wydajności. Zaletą tego algorytmu jest to, że sortuje „na miejscu”, co zmniejsza ilość potrzebnej pamięci. Możesz wziąć to pod uwagę podczas sortowania ponad 100 milionów elementów, jak powiedziałeś.

Widzę, że chcesz sortować w systemie z 8-32 rdzeniami. Algorytm PSRS unika rywalizacji o współdzielony zasób, umożliwiając przyspieszenie przy większej liczbie procesów. Pokazałem algorytm z maksymalnie 4 rdzeniami, jak powyżej, ale wyniki eksperymentów innych wskazują na prawie liniowe przyspieszenie przy znacznie większej liczbie rdzeni, 32 i więcej. Wadą algorytmu PSRS jest to, że nie jest on na miejscu i będzie wymagał znacznie więcej pamięci.

Jeśli jesteś zainteresowany, możesz użyć lub przejrzeć mój kod Java dla każdego z tych algorytmów. Możesz go znaleźć na github: https://github.com/broadbear/sort . Kod jest przeznaczony do zastępowania Java Collections.sort (). Jeśli szukasz możliwości równoległego sortowania w JVM, tak jak powyżej, kod w moim repozytorium może ci pomóc. Interfejs API jest w pełni uogólniony dla elementów implementujących Porównywalny lub implementujących własny komparator.

Czy mogę zapytać, po co chcesz posortować tak wiele elementów? Interesuje mnie potencjalne zastosowanie mojego pakietu do sortowania.

Broadbear
źródło
Mam 8-rdzeniowy procesor. :) Teraz przetestowałem sortowanie powyżej 40M elementów. Nie widzę liniowego przyspieszenia, ale widzę znaczny wzrost wydajności w porównaniu ze standardowym algorytmem sortowania kolekcji Java 8, który jest podobno wielowątkowym Timsort. Moja implementacja PSRS sortuje 40M elementów w średnio 4985 ms, w porównaniu z 19759 ms dla domyślnego algorytmu sortowania JDK.
broadbear