Какой алгоритм параллельной сортировки имеет наилучшую среднюю производительность? - PullRequest
124 голосов
/ 19 октября 2010

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

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

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

Ответы [ 4 ]

189 голосов
/ 19 октября 2010

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

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

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

Обновление для решения проблемы возраста Марка:

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

Улучшения в выборочной сортировке AA-Sort

Крайний край (около 2010 года, некоторым из них всего пара месяцев):

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

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

Университетские лекции: Параллельное разбиение для выбора и сортировки Алгоритмы параллельной сортировки Алгоритмы параллельной сортировки Лекция 2 Алгоритмы параллельной сортировки Лекция 3 Другие источники и документы: Новый алгоритм сортировки для многоядерных архитектур на основе адаптивной битовой сортировки Масштабируемая параллельная сортировка 2 Параллельное слияние Параллельное слияние 2 Параллельная система самосортировки объектов Сравнение производительности алгоритмов последовательной быстрой сортировки и параллельной быстрой сортировки Разделяемая память, сообщения и гибридные слияния для автономных и кластерных SMP Различные параллельные алгоритмы (сортировка и др.), Включая реализации GPU и CPU / GPU гибридные источники и документы: Метод OpenCL алгоритмов параллельной сортировки для архитектуры графического процессора Сортировка данных с использованием графических процессоров Эффективные алгоритмы сортировки на графических процессорах Разработка эффективных алгоритмов сортировки для многоядерных графических процессоров Детерминированная выборка для графических процессоров Быстрая сортировка на месте с помощью CUDA на основе битовой сортировки Быстрая параллельная GPU-сортировка с использованием гибридного алгоритма Алгоритмы быстрой параллельной сортировки на графических процессорах Быстрая сортировка на процессорах и графических процессорах: случай пропускной способности без учета SIMD-сортировки Пример сортировки графического процессора GPU-ABiSort: оптимальная параллельная сортировка в потоковых архитектурах GPUTeraSort: высокопроизводительная графическая сопроцессорная сортировка для управления большими базами данных Высокопроизводительный алгоритм сортировки на основе сравнения на многоядерных графических процессорах Параллельная внешняя сортировка для графических процессоров с поддержкой CUDA с балансировкой нагрузки и низкими издержками на передачу Сортировка на графических процессорах для крупномасштабных наборов данных: тщательное сравнение

6 голосов
/ 11 ноября 2013

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

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

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

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

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

4 голосов
/ 16 января 2011

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

2 голосов
/ 19 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...