¿Cómo puedo implementar un algoritmo quicksort o mergesort simultáneo para Java?Quicksort multiproceso o mergesort
Hemos tenido problemas en un Mac de 16 (virtual) cores donde solo un núcleo (!) Funcionaba utilizando el algoritmo de ordenación predeterminado de Java y era, bueno, no era bueno ver que esa máquina muy fina fuera completamente infrautilizado Así que escribimos el nuestro (lo escribí) y obtuvimos buenas aceleraciones (escribí un quicksort multiproceso y debido a su naturaleza de particionamiento se paraleliza muy bien, pero podría haber escrito un mergesort también) ... Pero mi implementación solo escala hasta 4 hilos, es un código propietario, y prefiero usar uno proveniente de una fuente acreditada en lugar de usar mi rueda inventada.
El único que he encontrado en la web es un ejemplo de cómo no para escribir una clasificación rápida de múltiples subprocesos en Java, es de bucle de ocupados (que es realmente terrible) usando un:
while (helpRequested) { }
http://broadcast.oreilly.com/2009/06/may-column-multithreaded-algor.html
Así que, además de perder un hilo sin ninguna razón, es asegurarse de matar los perfs por ocupado bucle en ese ciclo while (que es alucinante).
De ahí mi pregunta: ¿conoces alguna implementación de multiprocesamiento rápido o mergesort en Java que provenga de una fuente acreditada?
Pongo énfasis en el hecho de que sé que la complejidad se mantiene en O (n log n), pero aún me gustaría mucho ver que todos estos núcleos comiencen a funcionar en lugar de funcionar al ralentí. Tenga en cuenta que para otras tareas, en los mismos 16 núcleos virtuales Mac, vi una aceleración de hasta x7 paralelizando el código (y no soy un experto en concurrencia).
Así que incluso si la complejidad se mantiene en O (n log n), realmente agradecería una aceleración x7 o x8 o incluso x16.
Lo ideal sería que fuera configurable: podría pasar un número mínimo/máximo de hilos que desea permitir a su género de subprocesos múltiples. – SyntaxT3rr0r
¿Realmente necesita una versión multiproceso de quicksort? Si el número de hilos que desea utilizar es k, realice una partición rápida en k matrices (seleccionando pivotes k-1) y llame independientemente al tipo que necesite en cada uno. –
@Moron: ¿Pero las particiones ordenadas independientemente no se fusionarían entonces? –