Quel algorithme de tri parallèle a les meilleures performances de cas moyennes?

134

Le tri prend O (n log n) dans le cas série. Si nous avons des processeurs O (n), nous espérons une accélération linéaire. Des algorithmes parallèles O (log n) existent mais ils ont une constante très élevée. Ils ne sont pas non plus applicables sur le matériel de base qui n'a nulle part près de processeurs O (n). Avec p processeurs, des algorithmes raisonnables devraient prendre un temps O (n / p log n).

Dans le cas des séries, le tri rapide présente en moyenne la meilleure complexité d'exécution. Un algorithme de tri rapide parallèle est facile à implémenter (voir ici et ici ). Cependant, cela ne fonctionne pas bien car la toute première étape consiste à partitionner toute la collection sur un seul cœur. J'ai trouvé des informations sur de nombreux algorithmes de tri parallèle, mais jusqu'à présent, je n'ai rien vu d'indiquer un gagnant clair.

Je cherche à trier des listes de 1 à 100 millions d'éléments dans un langage JVM fonctionnant sur 8 à 32 cœurs.

Craig P. Motlin
la source
@Jon Anything vraiment. Ce seront mes objets de domaine qui sont tous différents, mais qui implémentent tous Comparable.
Craig P. Motlin
1
Je pense que vous avez un trop grand nombre de n / p dans votre "devrait prendre"
Sparr
@Sparr, je ne pense pas. Je fais une distinction entre avoir quelques processeurs et avoir autant de processeurs que d'éléments à trier.
Craig P. Motlin
@ CraigP.Motlin à droite, mais vous semblez avoir "distribué" le / p par erreur. Il ne devrait y avoir qu'un seul / p.
Sparr
@Sparr Ah, cela a changé, merci.
Craig P. Motlin

Réponses:

206

L'article suivant (téléchargement PDF) est une étude comparative d'algorithmes de tri parallèle sur différentes architectures:

Algorithmes de tri parallèle sur différentes architectures

Selon l'article, le tri des échantillons semble être le meilleur sur de nombreux types d'architecture parallèle.

Mise à jour pour répondre aux préoccupations de Mark concernant l'âge:

Voici des articles plus récents présentant quelque chose de plus nouveau (à partir de 2007, qui, d'ailleurs, est toujours comparé au tri des échantillons):

Améliorations du tri des échantillons Tri
AA

À la pointe de la technologie (vers 2010, certains ne datent que de quelques mois):

Modèle de tri
parallèle Tri parallèle basé sur GPU à plusieurs cœurs Tri parallèle
CPU / GPU hybride
Algorithme de tri parallèle aléatoire avec une étude expérimentale Tri
parallèle hautement évolutif
Tri des N-éléments à l'aide de l'ordre naturel: une nouvelle approche de tri adaptatif

Mise à jour pour 2013: Voici la pointe de la technologie vers janvier 2013. (Remarque: certains des liens renvoient aux articles de Citeseer et nécessitent une inscription gratuite):

Cours universitaires:
Partitionnement parallèle pour la sélection et le tri
Algorithmes de tri parallèle Cours Algorithmes de tri
parallèle Cours 2
Algorithmes de tri parallèle Cours 3

Autres sources et articles:
Un nouvel algorithme de tri pour les architectures à plusieurs cœurs basé sur le tri bitonique adaptatif Tri
parallèle hautement évolutif 2
Parallel Merging
Parallel Fusion de 2
systèmes d'auto-tri parallèles pour les objets
Comparaison des performances des algorithmes de tri rapide séquentiel et de tri rapide parallèle
Mémoire partagée, passage de messages et tris hybrides de fusion pour les SMP autonomes et en cluster
Divers algorithmes parallèles (tri et al), y compris les implémentations

Sources et documents hybrides GPU et CPU / GPU:
Une méthode OpenCL d'algorithmes de tri parallèle pour l'architecture GPU
Tri des données à l'aide d'unités de traitement graphique
Algorithmes efficaces pour le tri sur les GPU
Conception d'algorithmes de tri efficaces pour de nombreux GPU
Tri déterministe des échantillons pour les GPU Tri
rapide sur place avec CUDA basé sur le tri bitonique Tri
rapide par GPU parallèle à l'aide d'un algorithme hybride Algorithmes de
tri parallèle rapide sur GPU
Tri rapide sur CPU et GPU: un cas pour la bande passante inconsciente Tri SIMD Tri d'
échantillons
GPU GPU-ABiSort: Tri parallèle optimal sur les architectures de flux
GPUTeraSort: élevé tri par coprocesseur graphique de performance pour la gestion de grandes bases de données
Algorithme de tri basé sur une comparaison haute performance sur des GPU à plusieurs cœurs
Tri externe parallèle pour les GPU compatibles CUDA avec équilibrage de charge et faible surcharge de transfert
Tri sur GPU pour des ensembles de données à grande échelle: une comparaison approfondie

Michael Goldshteyn
la source
2
Il s'agit d'une étude comparative d'algorithmes de tri parallèle sur différentes architectures actuelles en 1996. Beaucoup de choses ont changé dans le calcul parallèle depuis.
High Performance Mark
1
Il semble que vous ayez manqué ce qui est à mon humble avis le meilleur de tous, la mise en œuvre efficace du tri dans l'architecture SIMD multicœur. D'après Intel research, présenté au VLDB 2008.
alecco
1
Cela aurait été une excellente réponse, une fois. Maintenant, la plupart des liens sont rompus.
Tim Long
6

J'ai travaillé avec un algorithme de tri rapide parallèle et un algorithme PSRS qui combine essentiellement le tri rapide en parallèle avec la fusion.

Avec l'algorithme Parallel Quicksort, j'ai démontré une accélération presque linéaire avec jusqu'à 4 cœurs (dual core avec hyper-threading), ce qui est attendu compte tenu des limitations de l'algorithme. Un tri rapide parallèle pur repose sur une ressource de pile partagée qui entraînera des conflits entre les threads, réduisant ainsi tout gain de performances. L'avantage de cet algorithme est qu'il trie «sur place», ce qui réduit la quantité de mémoire nécessaire. Vous voudrez peut-être en tenir compte lorsque vous triez plus de 100 millions d'éléments comme vous l'avez indiqué.

Je vois que vous cherchez à trier sur un système avec 8-32 cœurs. L'algorithme PSRS évite les conflits au niveau de la ressource partagée, permettant une accélération à un plus grand nombre de processus. J'ai démontré l'algorithme avec jusqu'à 4 cœurs comme ci-dessus, mais les résultats expérimentaux d'autres rapportent une accélération presque linéaire avec un nombre beaucoup plus grand de cœurs, 32 et au-delà. L'inconvénient de l'algorithme PSRS est qu'il n'est pas en place et nécessitera beaucoup plus de mémoire.

Si vous êtes intéressé, vous pouvez utiliser ou parcourir mon code Java pour chacun de ces algorithmes. Vous pouvez le trouver sur github: https://github.com/broadbear/sort . Le code est conçu comme un remplacement de Java Collections.sort (). Si vous recherchez la possibilité d'effectuer un tri parallèle dans une JVM comme vous l'indiquez ci-dessus, le code de mon dépôt peut vous aider. L'API est entièrement générique pour les éléments mettant en œuvre Comparable ou implémentant votre propre comparateur.

Puis-je vous demander pourquoi vous cherchez à trier autant d'éléments? Je suis intéressé de connaître les applications potentielles pour mon package de tri.

Broadbear
la source
J'ai un processeur à 8 cœurs. :) Maintenant, j'ai testé le tri de plus de 40 millions d'éléments. Je ne vois pas d'accélération linéaire, mais je constate un gain de performances substantiel par rapport à l'algorithme de tri standard Java 8 Collections, qui est censé être un Timsort multi-thread. Mon implémentation PSRS trie 40 millions d'éléments en une moyenne de 4985 ms, contre 19759 ms pour l'algorithme de tri JDK par défaut.
broadbear