Какой алгоритм параллельной сортировки имеет лучшую среднюю производительность?

134

Сортировка занимает O (n log n) в последовательном случае. Если у нас будет O (n) процессоров, мы будем надеяться на линейное ускорение. O (log n) параллельных алгоритмов существуют, но они имеют очень высокую константу. Они также не применимы к обычному оборудованию, у которого нет даже около O (n) процессоров. С процессорами p разумные алгоритмы должны занимать время O (n / p log n).

В последовательном случае быстрая сортировка в среднем имеет лучшую сложность выполнения. Параллельный алгоритм быстрой сортировки легко реализовать (см. Здесь и здесь ). Однако это не очень хорошо работает, поскольку самый первый шаг - разделить всю коллекцию на одном ядре. Я нашел информацию о многих алгоритмах параллельной сортировки, но до сих пор не видел ничего, указывающего на явного победителя.

Я хочу отсортировать списки от 1 миллиона до 100 миллионов элементов на языке JVM, работающем на 8-32 ядрах.

Крейг П. Мотлин
источник
@Jon Что-нибудь правда. Это будут объекты моего домена, которые все разные, но все реализуют Comparable.
Крейг П. Мотлин
1
Я думаю, у вас слишком много n / p в вашем «следует брать»
Sparr
@Sparr Я так не думаю. Я делаю различие между наличием нескольких процессоров и количеством процессоров, равным количеству сортируемых элементов.
Крейг П. Мотлин
@ CraigP.Motlin верно, но похоже, что вы "раздавали" / p ошибочно. Должен быть только один / п.
Sparr
@Sparr А, изменил это, спасибо.
Craig P. Motlin

Ответы:

206

Следующая статья (скачать в формате PDF) представляет собой сравнительное исследование алгоритмов параллельной сортировки на различных архитектурах:

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

Согласно статье, выборочная сортировка кажется лучшей для многих типов параллельной архитектуры.

Обновление, чтобы решить проблему возраста Марка:

Вот более свежие статьи, знакомящие с чем-то более новым (с 2007 года, которые, кстати, все еще сравнивают с выборочной сортировкой):

Улучшения в сортировке образцов
AA-Sort

Новейший (около 2010 г., некоторым всего пара месяцев):

Схема параллельной сортировки Параллельная сортировка на
основе многоядерных графических
процессоров Гибридная параллельная сортировка ЦП / ГП
Алгоритм случайной параллельной сортировки с экспериментальным исследованием
Высоко масштабируемая параллельная сортировка
Сортировка N-элементов с использованием естественного порядка: новый подход адаптивной сортировки

Обновление за 2013 год. Вот новинка января 2013 года. (Примечание: некоторые ссылки относятся к статьям на Citeseer и требуют бесплатной регистрации):

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

Другие источники и статьи:
Новый алгоритм сортировки для многоядерных архитектур на основе адаптивной битонной сортировки
Высокая масштабируемость параллельная сортировка 2
Параллельное слияние
Параллельное Слияние двух
параллельных систем самосортировки для объектов
Сравнение производительности алгоритмов последовательной быстрой сортировки и параллельной быстрой сортировки
Общая память, передача сообщений и гибридные сортировки слиянием для автономных и кластерных SMP
Различные параллельные алгоритмы (сортировка и др.), Включая реализации

Гибридные источники и статьи для GPU и CPU / GPU:
Метод OpenCL алгоритмов параллельной сортировки для
сортировки данных архитектуры GPU с использованием графических процессоров
Эффективные алгоритмы сортировки на GPU
Разработка эффективных алгоритмов сортировки для многоядерных GPU
Детерминированная сортировка выборок для GPU
Быстрая сортировка на месте с CUDA на основе битонной сортировки
Быстрая параллельная сортировка
на графических процессорах с использованием гибридного алгоритма Быстрая параллельная сортировка на графических процессорах
Быстрая сортировка на процессорах и графических процессорах: случай не обращая внимания на пропускную способность SIMD sort Сортировка
образцов
графического процессора GPU-ABiSort: Оптимальная параллельная сортировка на потоковых архитектурах
GPUTeraSort: высокий высокопроизводительная сортировка сопроцессора графики для управления большими базами данных
Высокопроизводительный алгоритм сортировки на основе сравнения на многоядерных графических процессорах
Параллельная внешняя сортировка для графических процессоров с поддержкой CUDA с балансировкой нагрузки и низкими накладными расходами на передачу
Сортировка на графических процессорах для крупномасштабных наборов данных: подробное сравнение

Михаил Гольдштейн
источник
2
Это сравнительное исследование алгоритмов параллельной сортировки на различных архитектурах, проведенное в 1996 году. С тех пор в параллельных вычислениях многое изменилось.
High Performance Mark
1
Похоже, вы упустили то, что IMHO лучше всего, - эффективную реализацию сортировки в многоядерной архитектуре SIMD. Из исследования Intel, представленного на VLDB 2008.
alecco
1
Когда-то это был бы отличный ответ. Сейчас большинство ссылок не работает.
Тим Лонг
6

Я работал как с алгоритмом параллельной быстрой сортировки, так и с алгоритмом PSRS, который по существу сочетает быструю сортировку параллельно со слиянием.

С помощью алгоритма параллельной быстрой сортировки я продемонстрировал почти линейное ускорение с использованием до 4 ядер (двухъядерный с гиперпоточностью), что вполне ожидаемо с учетом ограничений алгоритма. Чистая параллельная быстрая сортировка полагается на общий ресурс стека, что приведет к конфликту между потоками, что снизит прирост производительности. Преимущество этого алгоритма заключается в том, что он выполняет сортировку «на месте», что уменьшает объем необходимой памяти. Вы можете учитывать это при сортировке более 100 миллионов элементов, как вы сказали.

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

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

Могу я спросить, для чего вы хотите отсортировать такое количество элементов? Мне интересно узнать о потенциальных приложениях для моего пакета сортировки.

broadbear
источник
У меня 8 ядерный процессор. :) Теперь я протестировал сортировку более 40 миллионов элементов. Я не вижу линейного ускорения, но я вижу существенный прирост производительности по сравнению со стандартным алгоритмом сортировки Java 8 Collections, который предположительно является многопоточным Timsort. Моя реализация PSRS сортирует 40 миллионов элементов в среднем за 4985 мс по сравнению с 19759 мс для алгоритма сортировки JDK по умолчанию.
broadbear 05
4

Взгляните на эту статью: Масштабируемый алгоритм параллельной сортировки с использованием точного разделения . Это касается гораздо более 32 ядер. Однако в нем подробно описывается алгоритм, который имеет временную сложность выполнения O (n / p * log (n) + p * log (n) ** 2) и применим для произвольных компараторов.

haraldkl
источник