Quel algorithme de tri parallèle a la meilleure performance moyenne?

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

dans le cas de série, quick sort A la meilleure complexité d'exécution en moyenne. Un tri rapide parallèle l'algorithme est facile à implémenter (voir ici et ici ). Cependant, il ne fonctionne pas bien puisque la toute première étape est de diviser l'ensemble de la collection sur un seul noyau. J'ai trouvé des informations sur de nombreux parallèles algorithmes de tri mais jusqu'à présent je n'ai rien vu indiquant clairement le gagnant.

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

119
demandé sur Community 2010-10-19 19:07:32

4 réponses

l'article suivant (PDF download) est une étude comparative des algorithmes de tri parallèle sur diverses architectures:

algorithmes de tri en parallèle sur diverses architectures

Selon l'article, "151970920 de l'échantillon" tri semble être la meilleure sur de nombreux parallèles types d'architecture.

mise à Jour de l'adresse de Marque de l'inquiétude de l'âge:

voici plus récent articles présentant quelque chose de plus nouveau (à partir de 2007, qui, btw, encore obtenir comparé avec tri d'échantillon):

amélioration du tri des échantillons

AA-Sort

La bord de saignement (circa 2010, certains vieux de quelques mois seulement):

schéma de tri parallèle

tri parallèle à base de GPU multicentriques

tri parallèle CPU/GPU Hybride

algorithme aléatoire de tri parallèle avec étude expérimentale

tri parallèle hautement évolutif

tri des N-Éléments en utilisant L'ordre naturel: une nouvelle approche adaptative de tri

Mise à jour pour 2013: Voici le bord de saignement autour de janvier, 2013. (Note: quelques-uns des liens sont à des papiers chez Citeseer et exigent l'enregistrement qui est gratuit):

conférences universitaires:

cloisonnement parallèle pour la sélection et le tri

Conférence sur les Algorithmes de tri parallèle

Tri parallèle Conférence Sur Les Algorithmes 2

Conférence Sur Les Algorithmes De Tri Parallèle 3



Autres sources et articles:

un nouvel algorithme de tri pour les architectures à plusieurs noyaux basé sur le tri bitonique adaptatif

Tri parallèle hautement évolutif 2

Fusion parallèle

Fusion parallèle 2

système D'Auto-Tri parallèle pour les objets

comparaison des performances des algorithmes de tri rapide séquentiel et de tri rapide parallèle

la mémoire partagée, le passage de messages et les sortes de fusion hybrides pour les PME autonomes et groupées

divers algorithmes parallèles (tri et al), y compris les implémentations



Sources et documents hybrides GPU et CPU/GPU:

an OpenCL Method of Parallel Sorting Algorithms for GPU Architecture

tri des données à L'aide D'Unités de traitement graphique

algorithmes efficaces pour le tri sur GPU

concevoir des algorithmes de tri efficaces pour les GPU de manycore

Tri D'échantillons déterministes pour les GPU

tri rapide en place avec CUDA basé sur le tri bitonique

tri parallèle GPU rapide à l'aide d'un algorithme hybride

Tri parallèle rapide Algorithmes sur GPUs

tri rapide sur CPUs et GPUs: un cas pour la bande passante Oblivious SIMD tri

GPU tri des échantillons

GPU-ABiSort: tri en parallèle Optimal sur les Architectures Stream

GPUTeraSort: co-processeur graphique haute performance pour le tri pour la gestion de grandes bases de données

" high performance comparison-based sorting algorithm on many-core GPUs

tri externe parallèle pour les GPU à commande CUDA avec équilibrage de la charge et transfert de charge faible

tri sur GPUs pour les ensembles de données à grande échelle: une comparaison approfondie

179
répondu Michael Goldshteyn 2013-01-10 21:17:52

j'ai travaillé à la fois avec un algorithme Quicksort parallèle et un algorithme PSRS qui combine essentiellement quicksort en parallèle avec la fusion.

avec l'algorithme Quicksort parallèle, j'ai démontré une vitesse quasi linéaire avec jusqu'à 4 noyaux (double noyau avec Hyper-filetage), ce qui est attendu étant donné les limites de l'algorithme. Un Quicksort parallèle pur s'appuie sur une ressource de pile partagée qui aboutira à la discorde entre les threads, réduisant ainsi tout gain dans la performance. L'avantage de cet algorithme est qu'il trie "en place", ce qui réduit la quantité de mémoire nécessaire. Vous voudrez peut-être tenir compte de cela lors du tri de plus de 100m d'éléments comme vous l'avez déclaré.

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

si vous êtes intéressé, 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 les Collections Java.sorte.)( Si vous êtes à la recherche pour la capacité pour effectuer un tri parallèle dans une JVM comme vous le mentionnez ci-dessus, le code dans ma repo peut vous aider. L'API est entièrement généralisée pour les éléments mettant en œuvre comparables ou mettant en œuvre votre propre comparateur.

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

6
répondu broadbear 2013-11-24 04:47:31

jetez un coup d'oeil à ce papier: un algorithme de tri parallèle évolutif utilisant la Division exacte . Il concerne beaucoup plus de 32 cœurs. Cependant, il décrit en détail un algorithme, qui a une complexité de durée D'exécution de O(n/p * log(n) + p * log(n)**2) et est applicable pour les comparateurs arbitraires.

4
répondu haraldkl 2014-11-20 06:55:38
2
répondu LBushkin 2010-10-19 15:12:39