¿Qué algoritmo de clasificación paralela tiene el mejor rendimiento promedio de casos?

134

La ordenación toma O (n log n) en el caso en serie. Si tenemos procesadores O (n), esperamos una aceleración lineal. Existen algoritmos paralelos O (log n) pero tienen una constante muy alta. Tampoco son aplicables en hardware básico que no tiene cerca de procesadores O (n). Con los procesadores p, los algoritmos razonables deberían llevar tiempo O (n / p log n).

En el caso en serie, la ordenación rápida tiene la mejor complejidad de tiempo de ejecución en promedio. Un algoritmo paralelo de ordenación rápida es fácil de implementar (ver aquí y aquí ). Sin embargo, no funciona bien ya que el primer paso es dividir toda la colección en un solo núcleo. He encontrado información sobre muchos algoritmos de ordenamiento en paralelo, pero hasta ahora no he visto nada que apunte a un claro ganador.

Estoy buscando ordenar listas de 1 millón a 100 millones de elementos en un lenguaje JVM que se ejecuta en 8 a 32 núcleos.

Craig P. Motlin
fuente
@ Jon Cualquier cosa realmente. Serán mis objetos de dominio que son todos diferentes, pero todos implementan Comparable.
Craig P. Motlin
1
Creo que tienes demasiados n / p en tu "debería tomar"
Sparr
@Sparr, no lo creo. Estoy haciendo una distinción entre tener unos pocos procesadores y tener tantos procesadores como elementos ordenados.
Craig P. Motlin
@ CraigP.Motlin bien, pero parece que has "distribuido" el / p erróneamente. Debe haber solo uno / p.
Sparr
@Sparr Ah, cambió eso, gracias.
Craig P. Motlin

Respuestas:

206

El siguiente artículo (descarga en PDF) es un estudio comparativo de algoritmos de clasificación paralela en varias arquitecturas:

Algoritmos de clasificación paralelos en varias arquitecturas.

Según el artículo, la clasificación de muestras parece ser la mejor en muchos tipos de arquitectura paralela.

Actualización para abordar la preocupación de edad de Mark:

Aquí hay artículos más recientes que presentan algo más novedoso (de 2007, que, por cierto, todavía se comparan con el tipo de muestra):

Mejoras en el tipo de muestra
AA-Sort

El borde sangrante (alrededor del año 2010, algunos solo tienen un par de meses):

Patrón de clasificación paralela Clasificación
paralela basada en GPU de muchos núcleos Clasificación paralela de
CPU / GPU híbrida
Algoritmo de clasificación paralela aleatoria con un estudio experimental Clasificación
paralela altamente escalable
Clasificación de elementos N usando orden natural: un nuevo enfoque de clasificación adaptativa

Actualización para 2013: este es el punto de inflexión alrededor de enero de 2013. (Nota: algunos de los enlaces son a documentos en Citeseer y requieren registro, que es gratuito):

Conferencias universitarias:
Particionamiento paralelo para selección y clasificación
Algoritmos de clasificación paralela Conferencia Algoritmos de clasificación
paralela Conferencia 2
Algoritmos de clasificación paralela Conferencia 3

Otras fuentes y documentos:
Un algoritmo de clasificación novedoso para arquitecturas de muchos núcleos basado en clasificación bitónica adaptativa
Clasificación paralela altamente escalable 2
Fusión
paralela paralela Combinación de 2
sistemas de clasificación automática paralela para objetos
Comparación de rendimiento de clasificación rápida secuencial y algoritmos de clasificación rápida paralela
Memoria compartida, paso de mensajes y clasificación de combinación híbrida para SMP independientes y agrupados
Varios algoritmos paralelos (clasificación y otros) incluyendo implementaciones

Fuentes y documentos híbridos de GPU y CPU / GPU:
un método OpenCL de algoritmos de clasificación paralela para la arquitectura de GPU
Clasificación de datos utilizando unidades de procesamiento de gráficos
Algoritmos eficientes para clasificar en GPU
Diseño de algoritmos de clasificación eficientes para muchas GPU de puntaje
Clasificación de muestras determinista para GPU Clasificación
rápida en el lugar con CUDA basado en clasificación bitónica Clasificación de
GPU paralela rápida utilizando un algoritmo híbrido Algoritmos de
clasificación paralela rápida en GPU Clasificación
rápida en CPU y GPU: un caso para el ancho de banda sin SIMD ordenada Clasificación de
muestra
GPU GPU-ABiSort: Clasificación paralela óptima en arquitecturas de flujo
GPUTeraSort: alto clasificación del coprocesador de gráficos de rendimiento para la gestión de grandes bases de datos
Algoritmo de clasificación basado en comparación de alto rendimiento en GPU de muchos núcleos
Parallel clasificación externa para GPU habilitadas para CUDA con equilibrio de carga y baja sobrecarga de transferencia
Clasificación Clasificación en GPU para conjuntos de datos a gran escala: una comparación exhaustiva

Michael Goldshteyn
fuente
2
Es un estudio comparativo de algoritmos de clasificación paralela en varias arquitecturas actuales en 1996. Mucho ha cambiado en computación paralela desde entonces.
Alto rendimiento Mark
1
Parece que te perdiste lo que en mi humilde opinión es lo mejor de todo, la implementación eficiente de la clasificación en la arquitectura SIMD de múltiples núcleos. De la investigación de Intel, presentada en VLDB 2008.
alecco
1
Esta habría sido una gran respuesta, una vez. Ahora, la mayoría de los enlaces están rotos.
Tim Long
6

He trabajado con un algoritmo Parallel Quicksort y un algoritmo PSRS que esencialmente combina quicksort en paralelo con la fusión.

Con el algoritmo Parallel Quicksort, he demostrado una aceleración casi lineal con hasta 4 núcleos (doble núcleo con hiperprocesamiento), lo que se espera dadas las limitaciones del algoritmo. Un QuickSort Parallel puro se basa en un recurso de pila compartido que dará lugar a una disputa entre hilos, reduciendo así cualquier ganancia en el rendimiento. La ventaja de este algoritmo es que clasifica 'in situ', lo que reduce la cantidad de memoria necesaria. Es posible que desee considerar esto cuando ordene más de 100 millones de elementos como lo indicó.

Veo que está buscando ordenar un sistema con 8-32 núcleos. El algoritmo PSRS evita la contención en el recurso compartido, lo que permite acelerar en un mayor número de procesos. He demostrado el algoritmo con hasta 4 núcleos como el anterior, pero los resultados experimentales de otros informan una aceleración casi lineal con un número mucho mayor de núcleos, 32 y más. La desventaja del algoritmo PSRS es que no está en su lugar y requerirá considerablemente más memoria.

Si está interesado, puede usar o leer detenidamente mi código Java para cada uno de estos algoritmos. Puede encontrarlo en github: https://github.com/broadbear/sort . El código pretende ser un reemplazo directo de Java Collections.sort (). Si está buscando la capacidad de realizar una clasificación paralela en una JVM como lo indica anteriormente, el código en mi repositorio puede ayudarlo. La API está completamente genérica para elementos que implementan Comparable o implementan su propio Comparador.

¿Puedo preguntar para qué busca clasificar tantos elementos? Estoy interesado en conocer posibles aplicaciones para mi paquete de clasificación.

Broadbear
fuente
Tengo un procesador de 8 núcleos. :) Ahora he probado la clasificación de más de 40 millones de elementos. No veo una aceleración lineal, pero sí veo un aumento sustancial en el rendimiento sobre el algoritmo de ordenación estándar de Java 8 Collections, que supuestamente es un Timsort de múltiples hilos. Mi implementación de PSRS ordena 40 millones de elementos en un promedio de 4985 ms, en comparación con 19759 ms para el algoritmo de ordenación JDK predeterminado.
broadbear