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