Який алгоритм паралельного сортування має найкращі середні показники випадку?


134

Сортування займає O (n log n) у серійному корпусі. Якщо у нас є O (n) процесори, ми сподіваємось на лінійну швидкість. O (log n) паралельні алгоритми існують, але вони мають дуже високу константу. Вони також не застосовуються до товарного обладнання, яке не має ніде поблизу процесорів O (n). З процесорами p розумні алгоритми повинні зайняти час O (n / p log n).

У серійному випадку швидкий сорт має в середньому найкращу складність виконання. Алгоритм паралельного швидкого сортування легко реалізувати (див. Тут і тут ). Однак це не добре, оскільки перший крок - це розділення всієї колекції на одне ядро. Я знайшов інформацію про багато алгоритмів паралельного сортування, але поки що не бачив нічого, що вказувало б на явного переможця.

Я шукаю сортувати списки від 1 до 100 мільйонів елементів на мові JVM, що працює на 8 - 32 ядрах.


@Jon Все, що насправді. Вони будуть моїми об’єктами домену, які всі різні, але всі реалізують Порівнянні.
Крейг П. Мотлін

1
Я думаю, у вас є занадто багато n / p у вашому "повинен взяти"
Sparr

@Sparr Я не думаю, що так. Я розрізняю наявність декількох процесорів і стільки процесорів, скільки елементів відсортовано.
Крейг П. Мотлін

@ CraigP.Motlin вірно, але ви, здається, помилково "розподілили" / p. Має бути лише один / п.
Спарр

@Sparr Ах, змінив це, дякую.
Крейг П. Мотлін

Відповіді:


206

Наступна стаття (завантаження PDF) - порівняльне дослідження алгоритмів паралельного сортування у різних архітектурах:

Алгоритми паралельного сортування на різних архітектурах

Відповідно до статті, вибіркове сортування, здається, найкраще для багатьох типів паралельної архітектури.

Оновлення, щоб вирішити стурбованість Марка віком:

Ось новіші статті, що представляють щось більш нове (з 2007 року, яке, до речі, все ж можна порівняти зі зразком):

Вдосконалення щодо вибіркового сортування
AA-Сортування

Край кровотечі (близько 2010 року, деякі лише пару місяців):

Шаблон
паралельного сортування
Багатоядерний паралельний сортування на основі графічного процесора Гібридний CPU / GPU паралельний сортування
Випадковий паралельний алгоритм сортування з експериментальним дослідженням
Високо масштабований паралельний сортування
сортування N-елементів за допомогою природного порядку: новий адаптивний підхід до сортування.

Оновлення на 2013 рік: Ось крайова кров’я, приблизно в січні 2013 року. (Примітка. Деякі з посилань - на документи в Citeseer і потребують безкоштовної реєстрації):

Університетські лекції:
Паралельний розподіл для відбору та сортування
Паралельний алгоритм сортування Лекція
Паралельний алгоритм сортування Лекція 2
Паралельний алгоритм сортування Лекція 3

Інші джерела та статті:
Новий алгоритм сортування для багатоядерних архітектур на основі адаптивного бітонічного сортування
Високо масштабований паралельний сортування 2
Паралельний об'єднання
Паралельний Об'єднання 2
паралельної системи самосортирування об'єктів
для порівняння продуктивності порівняльних алгоритмів послідовного швидкого і паралельного швидкого сортування
спільної пам'яті, передачі повідомлень та гібридних сортів злиття для автономних та кластеризованих SMP
Різні паралельні алгоритми (сортування та ін.), Включаючи реалізацію

Гібридні джерела та статті GPU та CPU / GPU:
OpenCL метод паралельного алгоритму сортування алгоритмів для архітектури графічних процесорів за
допомогою графічних блоків обробки
Ефективні алгоритми для сортування на графічних процесорах
Розробка ефективних алгоритмів сортування для багатокореневих графічних процесорів
Детермінований сортування зразків для графічних процесів
Швидке місце сортування з CUDA на основі бітонічного сортування
Швидке паралельне сортування GPU за допомогою гібридного алгоритму
Швидке паралельне алгоритми сортування на графічних процесорах
Швидке сортування на процесорах та графічних процесорах: випадок для пропускання смуги пропускної здатності SIMD сортування
вибірки
GPU сортування GPU-ABiSort: оптимальне паралельне сортування на потокових архітектурах
GPUTeraSort: висока сортування графіки продуктивності спільного процесора для управління великими базами даних
Високопродуктивний алгоритм сортування на основі багатоядерних графічних процесорів
Паралельне зовнішнє сортування для графічних процесорів з підтримкою CUDA з балансуванням навантаження та низькою накладною передачею
Сортування на графічних процесорах для масштабних наборів даних: ретельне порівняння


2
Це порівняльне дослідження алгоритмів паралельного сортування на різних архітектурах, що діють у 1996 році. З того часу багато що змінилося в паралельних обчисленнях.
Марка високої продуктивності

1
Здається, ви пропустили те, що IMHO найкраще за всіх, Ефективна реалізація сортування в багатоядерній архітектурі SIMD. З досліджень Intel, представлених у VLDB 2008.
alecco

1
Колись це була б чудова відповідь. Зараз більшість ланок розірвано.
Тім Лонг

6

Я працював як з алгоритмом паралельного Quicksort, так і з алгоритмом PSRS, який по суті поєднує quicksort паралельно зі злиттям.

За допомогою алгоритму Parallel Quicksort я продемонстрував майже лінійну швидкість з до 4 ядер (двоядерний з гіпер-різьбленням), що очікується, враховуючи обмеження алгоритму. Чистий паралельний Quicksort покладається на спільний ресурс стека, що призведе до суперечок між потоками, тим самим знизивши будь-який приріст у продуктивності. Перевага цього алгоритму полягає в тому, що він сортує "на місці", що зменшує об'єм необхідної пам'яті. Ви можете розглянути це при сортуванні вгору 100М елементів, як ви заявили.

Я бачу, ви хочете сортувати за системою з 8-32 ядрами. Алгоритм PSRS уникає суперечок на спільному ресурсі, дозволяючи прискорити більшу кількість процесів. Я продемонстрував алгоритм з до 4 ядрами, як вище, але експериментальні результати інших повідомляють про лінійну швидкість з набагато більшим числом ядер, 32 і більше. Недоліком алгоритму PSRS є те, що він не стоїть на місці і вимагатиме значно більше пам’яті.

Якщо вас цікавить, ви можете використовувати або вивчити мій код Java для кожного з цих алгоритмів. Ви можете знайти його на github: https://github.com/broadbear/sort . Код призначений для заміни Java Collections.sort (). Якщо ви шукаєте можливість виконувати паралельне сортування в JVM, як ви заявляєте вище, код у моїй репо може допомогти вам. API повністю генерований для елементів, що реалізують Порівняльний або реалізує власний компаратор.

Чи можу я запитати, що ви шукаєте, щоб сортувати стільки елементів? Мені цікаво знати потенційні програми для мого пакету сортування.


У мене 8-ядерний процесор. :) Зараз я перевірив сортування вгору елементів 40M. Я не бачу лінійного прискорення, але я бачу значне підвищення продуктивності в порівнянні зі стандартним алгоритмом сортування Java 8 Collections, який нібито є багатопоточним Timsort. Моя реалізація PSRS сортує 40M елементів в середньому 4985 мс, порівняно з 19759 мс для алгоритму сортування JDK за замовчуванням.
широкосмуговий

4

Погляньте на цей документ: Алгоритм масштабування паралельного сортування з використанням точного розщеплення . Він стосується багатьох більш ніж 32 ядер. Однак він докладно описує алгоритм, який має складність часу виконання O (n / p * log (n) + p * log (n) ** 2) і застосовний для довільних компараторів.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.