параллельная quicksort в c

после долгих поисков реализации параллельной quicksort в c, я собираюсь погрузиться и кодировать его сам. (Мне нужно отсортировать массив около 1 миллиона текстовых строк.) Похоже, что все найденные мной реализации разделяют работу внутри самой функции qsort, что создает огромное количество накладных расходов при разбиении относительно небольшого объема работы на поток.

не было бы намного быстрее разделить 1 миллион строк на количество потоков (в моем случае 24 потока), и каждый из них работает над разделом, а затем выполняет слияние? Конечно, у этого есть теоретический недостаток, что это не на месте, но с доступными кусками памяти это не проблема. Машина, на которой это работает, имеет 12 (очень быстрых) физических/24 логических ядра и 192 ГБ (да, гигабайт) памяти. В настоящее время, даже на этой машине, то занимает почти 8 минут!

4 ответов


не было бы намного быстрее разделить 1 миллион строк по числу потоки (в моем случае 24 потока), и пусть каждый из них поработает над разделом, и тогда сделайте слияние?

хорошая идея.

но вы можете сделать некоторые наблюдения, написав игрушечные программы для quick-sort и merge-sort и воспользоваться преимуществами их алгоритмического / времени выполнения-поведения.

например. quick-sort рода а


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

Почему бы не сделать это в одном потоке, а затем породить другой поток и делегировать его одной половине, в то время как существующий поток берет другую половину, и так далее и тому подобное?


вы рассматривали возможность использования алгоритма сортировки, специально разработанного для сортировки строк? Похоже, это может быть лучше, чем пытаться реализовать пользовательскую quicksort. Конкретный выбор алгоритмов, вероятно, зависит от длины строк и того, насколько они отличаются, но сортировка radix вероятно, неплохая ставка.

быстрый поиск google появился статьи о сортировке строк. Я не читал его, но Седжвик и Бентли действительно знает свое дело. Согласно реферату, их алгоритм представляет собой амальгаму рода Quicksort и radix.

другое возможное решение-обернуть алгоритм параллельной сортировки из C++. Реализация STL GNU имеет параллельном режиме, который содержит параллельную реализацию quicksort. Это, вероятно, самое простое решение.


чтобы сделать многопоточный быстрый доступ к памяти возможным, необходимо оптимизировать так, чтобы большая часть работы по сортировке выполнялась внутри кэшей без общего доступа (L1 & L2). Бьюсь об заклад, что однопоточный quicksort будет быстрее, чем многопоточный, если вы не готовы вложить в обильное количество работы.

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

а в специальную строку-адаптирован сортировки концепции звучит странно. Я имею в виду, что не так много случаев, когда сортировка вектора только строк (или целых чисел) особенно полезна. Обычно данные будут организованы в таблицу со столбцами и строками, и вы захотите отсортировать строки по одному столбцу, содержащему буквы, и, если они равны, вы будете сортировать с помощью дополнительного столбца, содержащего отметку времени или рейтинг или что-то еще. Таким образом, процедура сортировки должна иметь возможность обрабатывать многоуровневый набор правил сортировки, который может указывать любой тип данных (boolean, integer, dates, strings, floating point и т. д.) В любом направлении (по возрастанию или убыванию), присутствующем в столбцах таблицы.