Qual algoritmo de classificação paralela tem o melhor desempenho médio de caixa?

134

A classificação leva O (n log n) no caso serial. Se tivermos O (n) processadores, esperamos uma aceleração linear. Existem algoritmos paralelos O (log n), mas eles têm uma constante muito alta. Eles também não são aplicáveis ​​a hardware comum, que não tem nem perto de processadores O (n). Com processadores p, algoritmos razoáveis ​​devem levar tempo O (n / p log n).

No caso de série, a classificação rápida tem a melhor complexidade de tempo de execução, em média. Um algoritmo de classificação rápida paralela é fácil de implementar (veja aqui e aqui ). No entanto, ele não apresenta um bom desempenho, pois o primeiro passo é particionar toda a coleção em um único núcleo. Encontrei informações sobre muitos algoritmos de classificação paralela, mas até agora não vi nada apontando para um vencedor claro.

Estou procurando classificar listas de 1 a 100 milhões de elementos em uma linguagem JVM executando de 8 a 32 núcleos.

Craig P. Motlin
fonte
@ Jon Qualquer coisa realmente. Eles serão meus objetos de domínio, todos diferentes, mas implementam Comparable.
Craig P. Motlin
1
Acho que você tem um demasiados n / p no seu "deve tomar"
Sparr
@ Sparr Acho que não. Estou fazendo uma distinção entre ter alguns processadores e ter tantos processadores quanto elementos sendo classificados.
Craig P. Motlin
@ CraigP.Motlin certo, mas você parece ter "distribuído" o / p erroneamente. Deve haver apenas um / p.
Sparr 18/09/12
@ Sparr Ah, mudou isso, obrigado.
Craig P. Motlin

Respostas:

206

O artigo a seguir (download em PDF) é um estudo comparativo de algoritmos de classificação paralela em várias arquiteturas:

Algoritmos de classificação paralela em várias arquiteturas

Segundo o artigo, a classificação da amostra parece ser melhor em muitos tipos de arquitetura paralela.

Atualização para abordar a preocupação de idade de Mark:

Aqui estão artigos mais recentes que apresentam algo mais inovador (a partir de 2007, que ainda é comparado com a amostra):

Melhorias na classificação da amostra
AA-Sort

A margem de sangramento (por volta de 2010, alguns com apenas alguns meses):

Padrão de classificação paralela Classificação
paralela baseada em GPU de muitos núcleos Classificação paralela de
CPU / GPU híbrida
Algoritmo de Classificação Paralela Aleatória com um Estudo Experimental Classificação
paralela altamente escalável
Classificação de N-Elementos Usando a Ordem Natural: Uma Nova Abordagem de Classificação Adaptativa

Atualização para 2013: aqui está o ponto mais crítico em janeiro de 2013. (Nota: alguns dos links são para artigos da Citeseer e exigem registro gratuito):

Palestras universitárias:
Particionamento Paralelo para Seleção e Classificação de
Algoritmos de Classificação Paralela Palestra Algoritmos de Classificação
Paralela Lição 2
Algoritmos de Classificação Paralela Lição 3

Outras fontes e documentos:
Um novo algoritmo de classificação para arquiteturas de muitos núcleos baseado em classificação bitônica adaptável
Classificação Paralela Altamente Escalável 2 Classificação
Paralela
Paralela Mesclando 2
sistemas de classificação automática paralela para objetos
Comparação de desempenho de algoritmos de classificação rápida sequencial e de classificação rápida paralela
Memória compartilhada, passagem de mensagens e classificações de mesclagem híbrida para SMPs autônomos e em cluster
Vários algoritmos paralelos (classificação et al), incluindo implementações

Origens e documentos híbridos de GPU e CPU / GPU:
um método OpenCL de algoritmos de classificação paralela para arquitetura de GPU
Classificação de dados usando unidades de processamento gráfico
Algoritmos eficientes para classificação em GPUs
Projeto de algoritmos de classificação eficientes para manycore
Classificação determinística de amostra de GPUs para GPUs Classificação
rápida no local com CUDA baseada em classificação bitônica Classificação
rápida por GPU paralela usando um algoritmo híbrido Algoritmos de
classificação paralela rápida em GPUs Classificação
rápida em CPUs e GPUs: um caso de largura de banda alheia à classificação SIMD e classificação de
amostra
GPU GPU-ABiSort: classificação paralela ideal em arquiteturas de fluxo
GPUTeraSort: high classificação de co-processador gráfico de desempenho para gerenciamento de grandes bancos de dados
Algoritmo de classificação baseado em comparação de alto desempenho em GPUs com muitos núcleos Classificação
externa paralela para GPUs habilitadas para CUDA com balanceamento de carga e baixa sobrecarga de transferência
Classificação em GPUs para conjuntos de dados em grande escala: Uma comparação completa

Michael Goldshteyn
fonte
2
É um estudo comparativo de algoritmos de classificação paralela em várias arquiteturas atuais em 1996. Muita coisa mudou na computação paralela desde então.
High Performance Mark
1
Parece que você perdeu o que há de melhor em IMHO, implementação eficiente de classificação na arquitetura SIMD de vários núcleos. Da pesquisa da Intel, apresentada no VLDB 2008.
alecco 11/11
1
Esta teria sido uma ótima resposta, uma vez. Agora, a maioria dos links está quebrada.
Tim Long
6

Eu trabalhei com um algoritmo Parallel Quicksort e um algoritmo PSRS que essencialmente combina quicksort em paralelo com a fusão.

Com o algoritmo Parallel Quicksort, demonstrei uma aceleração quase linear com até 4 núcleos (núcleo duplo com hiperencadeamento), o que é esperado, dadas as limitações do algoritmo. Um Paricks Quicksort puro conta com um recurso de pilha compartilhada que resultará em contenção entre threads, reduzindo assim qualquer ganho no desempenho. A vantagem desse algoritmo é que ele classifica 'no local', o que reduz a quantidade de memória necessária. Você pode considerar isso ao classificar mais de 100 milhões de elementos, conforme indicado.

Vejo que você deseja classificar em um sistema com 8 a 32 núcleos. O algoritmo PSRS evita a contenção no recurso compartilhado, permitindo aceleração em um número maior de processos. Eu demonstrei o algoritmo com até 4 núcleos, como acima, mas os resultados experimentais de outros relatam uma aceleração quase linear com um número muito maior de núcleos, 32 e além. A desvantagem do algoritmo PSRS é que ele não está no local e exigirá consideravelmente mais memória.

Se você estiver interessado, poderá usar ou ler meu código Java para cada um desses algoritmos. Você pode encontrá-lo no github: https://github.com/broadbear/sort . O código pretende ser um substituto direto do Java Collections.sort (). Se você está procurando a capacidade de executar uma classificação paralela em uma JVM, como você afirma acima, o código no meu repositório pode ajudá-lo. A API é totalmente genérica para elementos que implementam o Comparable ou implementam seu próprio Comparator.

Posso perguntar o que você procura para classificar tantos elementos? Estou interessado em conhecer possíveis aplicativos para o meu pacote de classificação.

urso largo
fonte
Eu tenho um processador de 8 núcleos. :) Agora testei a classificação de mais de 40 milhões de elementos. Não estou vendo aceleração linear, mas estou vendo um ganho substancial de desempenho em relação ao algoritmo padrão de classificação Java 8 Collections, que é supostamente um Timsort com vários threads. Minha implementação do PSRS classifica elementos de 40 milhões em uma média de 4985 ms, em comparação com 19759 ms para o algoritmo de classificação JDK padrão.
broadbear 5/08/16