Le tri prend O (n log n) dans le cas sériel. Si nous avons des processeurs O(n)), nous espérons une accélération linéaire. Il existe des algorithmes parallèles O (log n) mais ils ont une constante très élevée. Ils ne sont pas applicables non plus sur le matériel standard. qui n'a nulle part près des 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 à mettre en œuvre (voir ici et ici ). Cependant, il ne fonctionne pas bien puisque la toute première étape consiste à partitionner la collection entière sur un seul noyau. J'ai trouvé des informations sur de nombreux algorithmes de tri en parallèle, mais jusqu'à présent je n'ai rien vu qui indique 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.
L'article suivant (téléchargement au format PDF) est une étude comparative d'algorithmes de tri en parallèle sur diverses architectures:
algorithmes de tri en parallèle sur diverses architectures
Selon l'article, le tri de l'échantillon semble être préférable sur de nombreux types d'architecture parallèle.
Mise à jour pour répondre à la préoccupation de Mark concernant son âge:
Voici des articles plus récents introduisant quelque chose de plus novateur (à partir de 2007, qui est toujours comparé au tri de l'échantillon):
Améliorations sur le tri de l'échantillon
AA-Sort
The Blooding Edge (circa 2010, certains âgés seulement de quelques mois):
Modèle de tri parallèle
Tri en parallèle basé sur plusieurs GP
Tri parallèle CPU/GPU hybride
Algorithme de tri parallèle aléatoire avec une étude expérimentale
Tri en parallèle hautement évolutif
Tri des éléments N à l'aide de l'ordre naturel: une nouvelle approche de tri adaptatif
Mise à jour pour 2013: Voici le fil de discussion vers janvier 2013. (Remarque: quelques-uns des liens renvoient à des articles publiés chez Citeseer et nécessitent une inscription. libre):
Cours universitaires:
Partitionnement parallèle pour la sélection et le tri
Cours sur les algorithmes de tri parallèles
Cours parallèle sur les algorithmes de tri parallèle
Cours parallèle sur les algorithmes de tri parallèle
Autres sources et articles:
n nouvel algorithme de tri pour les architectures multicœurs basé sur le tri adaptatif bitonique
Tri en parallèle hautement évolutif 2
Fusion parallèle
fusion parallèle 2
Système de tri automatique pour objets
Comparaison des performances des algorithmes de tri rapide séquentiel et de tri rapide parallèle
Tri de mémoire partagée, transmission de messages et fusion hybride pour SMP autonomes et en cluster
Divers algorithmes parallèles (tri et autres), y compris des implémentations
Sources et papiers hybrides GPU et CPU/GPU:
Méthode OpenCL d’algorithmes de tri en parallèle pour l’architecture GP
Tri des données à l'aide d'unités de traitement graphique
Algorithmes efficaces pour trier sur des GP
Conception d'algorithmes de tri efficaces pour de nombreux GP
Tri d’échantillons déterministe pour les GP
Tri rapide sur place avec CUDA basé sur le tri bitonique
Tri rapide parallèle sur GPU utilisant un algorithme hybride
Algorithmes de tri rapide en parallèle sur les GP
Tri rapide sur les processeurs et les GPU: un cas de tri SIMD sans bande passante
tri sur échantillon GP
GPU-ABiSort: Tri parallèle optimal sur des architectures de flux
GPUTeraSort: tri de co-processeurs graphiques hautes performances pour la gestion de bases de données volumineuses
Algorithme de tri basé sur la comparaison hautes performances sur les GPU multi-core
Tri externe en parallèle pour les GPU compatibles CUDA avec équilibrage de charge et faible temps système de transfert
Tri sur GPU pour les jeux de données à grande échelle: une comparaison approfondie
J'ai travaillé avec un algorithme Parallel Quicksort et un algorithme PSRS qui combinent 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 (double cœur avec hyper-threading), ce qui est attendu compte tenu des limites de l'algorithme. Un Quicksort purement parallèle repose sur une ressource de pile partagée, ce qui entraînera des conflits entre les threads, ce qui réduira tout gain de performances. L'avantage de cet algorithme réside dans le fait qu'il effectue le tri 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 un système avec 8 à 32 cœurs. L'algorithme PSRS évite les conflits au niveau de la ressource partagée, ce qui permet d'accélérer le traitement à un nombre plus élevé de processus. J'ai présenté l'algorithme avec jusqu'à 4 cœurs comme ci-dessus, mais les résultats expérimentaux d'autres auteurs font état d'une accélération presque linéaire avec un nombre beaucoup plus grand de cœurs, 32 et plus. Le désavantage de l’algorithme PSRS est qu’il n’est pas en place et nécessitera beaucoup plus de mémoire.
Si cela vous intéresse, vous pouvez utiliser ou consulter mon code Java pour chacun de ces algorithmes. Vous pouvez le trouver sur github: https://github.com/broadbear/sort . Le code est destiné à remplacer immédiatement Java Collections.sort (). Si vous recherchez la possibilité d'effectuer un tri en parallèle dans une machine virtuelle, comme indiqué ci-dessus, Le code de mon référentiel peut vous aider. L'API est entièrement générique pour les éléments implémentant 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 paquet de tri.
Jetez un coup d'œil à cet article: n algorithme de tri parallèle évolutif utilisant la division exacte . Il concerne plus de 32 cœurs. Cependant, il décrit en détail un algorithme, qui a une complexité de temps d'exécution de O (n/p * log (n) + p * log (n) ** 2) et qui est applicable aux comparateurs arbitraires.
Le document "Comparaison d'algorithmes de tri en parallèle sur différentes architectures" peut être un bon point de départ pour vous.