Как реализовать параллельный алгоритм быстрой сортировки или слияния для Java?Многопоточный quicksort или mergesort
У нас были проблемы с 16-дюймовым (виртуальным) компьютером Mac, где работало только одно ядро (!) С использованием стандартного Java-сортировки algo, и было неплохо видеть, что эта очень тонкая машина полностью недогружено. Таким образом, мы написали свои собственные (я написал это), и мы действительно получили хорошие ускорения (я написал многопоточную быстродействующую сортировку и из-за ее разметки, она очень хорошо распараллеливается, но я мог бы написать слияние тоже) ... Но моя реализация только масштабирует до 4 потоков, это проприетарный код, и я предпочел бы использовать один, исходящий из уважаемого источника, вместо использования моего вновь изобретенного колеса.
только один я нашел в Интернете является примером того, как не писать многопоточные быстрой сортировки в Java, он занят, зацикливание (который на самом деле страшно) с помощью:
while (helpRequested) { }
http://broadcast.oreilly.com/2009/06/may-column-multithreaded-algor.html
Так что в дополнение к потере нити без причины, она обязательно убивает перфомансы, занявшись петлей в этом цикле (который является умственным).
Отсюда мой вопрос: знаете ли вы о какой-либо корректной многопоточной реализации quicksort или mergesort в Java, которая будет поступать из уважаемого источника?
Я делаю акцент на том факте, что я знаю, что сложность остается O (n log n), но мне все еще очень понравилось видеть, что все эти ядра начинают работать вместо холостого хода. Обратите внимание, что для других задач, на тех же 16 виртуальных ядрах Mac, я видел ускорение до x7 путем распараллеливания кода (и я вовсе не специалист по параллелизму).
Так что даже жесткая сложность остается O (n log n), я бы очень признателен за ускорение x7 или x8 или даже x16.
В идеале это можно было бы настроить: вы могли бы передать минимальное/максимальное количество потоков, которые вы хотите разрешить для своего многопотокового сортировки. – SyntaxT3rr0r
Вам действительно нужна многопоточная версия quicksort? Если количество потоков, которые вы хотите использовать, k, сделайте быстрый раздел в k массивах (выбор k-1 опорных точек) и вызовите любой тип, который вам нужен, независимо друг от друга. –
@Moron: Но не были ли тогда объединены отдельно отсортированные разделы? –