quicksort parallèle en c
Après beaucoup de recherche pour une mise en œuvre parallèle de quicksort en c, je suis sur le point de plonger dans le code et de moi-même. (J'ai besoin de trier un tableau d'environ 1 million de chaînes de texte.) Il semble que toutes les implémentations j'ai trouvé diviser le travail à l'intérieur de la fonction qsort lui-même, ce qui crée une énorme quantité de frais généraux dans le partitionnement de la quantité relativement faible de temps de travail par thread.
Ne serait-il pas plus rapide de diviser le 1 million de chaînes par le nombre de threads (dans mon cas, 24 threads), et demandez à chacun de travailler sur une section, puis effectuez l'une mergesort? Accordée, ce qui a l'inconvénient théorique qu'il n'est pas un lieu de tri, mais avec des masses de mémoire disponible, il n'est pas un problème. La machine, elle fonctionne sur 12 (très rapide), physique/24 noyaux logiques et 192 GO (oui, giga-octets) de mémoire. Actuellement, même sur cette machine, le tri prend près de 8 minutes!
source d'informationauteur PaeneInsula
Vous devez vous connecter pour publier un commentaire.
C'est une bonne idée.
Mais vous pouvez faire de l'observation par écrit jouet programmes pour
quick-sort
etmerge-sort
et de profiter des avantages de leurs algorithmique-/run-time-comportement.Par exemple.
quick-sort
sortes toutdividing
processus (pivot
élément sera mis en sa place définitive à la fin de l'itération) etmerge-sort
sortes toutmerging
(le tri est fait, après tout le travail est décomposé (divisé) en très granulaire-unités où il peut être directement comparé avec d'autres granulaire-unités (==
oustrcmp()
).Mélanger les algorithmes basés sur la nature de l'ensemble de travail est une bonne idée.
À l'égard de la parallèle le tri, voici mon
parallel merge-sort
pour vous obtenir a commencé.Bonne chance!
Quicksort implique un passage initial sur une liste, qui trie la liste dans les sections supérieure et inférieure du pivot.
Pourquoi ne pas le faire dans un thread, et ensuite de générer un autre thread et délégué à la moitié alors que l'existant thread prend l'autre moitié, et ainsi de suite et ainsi de suite?
Avez-vous envisagé d'utiliser un algorithme de tri spécialement conçu pour trier les chaînes?
Il semble que cela pourrait être une meilleure idée que d'essayer de mettre en œuvre une coutume de quicksort. Le choix des algorithmes probablement dépend de la longueur des chaînes et comment ils sont différents, mais un tri radix n'est probablement pas un mauvais pari.
Un rapide recherche google tourné un article sur le tri des chaînes de caractères. Je n'ai pas lu, mais Sedgewick et Bentley connaissent vraiment leur truc. Selon le résumé, leur algorithme est un amalgame de Quicksort et de tri radix.
Une autre solution possible consiste à envelopper un parallèle algorithme de tri à partir de C++. GNU STL mise en œuvre a un mode parallèlequi contient, en parallèle, une implémentation rapide.
C'est probablement la solution la plus simple.
De faire du multi-thread quicksort possible l'accès à la mémoire doivent être optimisés de sorte que la plupart du travail de tri est effectué à l'intérieur de la non-caches partagés (L1 &L2). Mon pari est que single-threaded quicksort sera plus rapide que muli-thread, sauf si vous êtes prêt à mettre dans une grande quantité de travail.
Une approche de test pourrait être un thread pour trier la moitié supérieure et une autre pour le tri le plus bas.
À une chaîne de caractères spéciaux adaptés routines de tri le concept semble étrange pour moi. Je veux dire il n'y a pas beaucoup de cas où le tri d'un vecteur de chaînes uniquement (ou entiers) est particulièrement utile. Habituellement, les données seront organisées dans un tableau avec des colonnes et des lignes, et que vous souhaitez trier les lignes par une colonne contenant des lettres, et, si elles sont égales, vous allez trier à l'aide d'une colonne supplémentaire contenant un tampon de temps ou d'un classement ou d'autre chose. Si la routine de tri doit être capable de gérer un multi-niveau de la règle de tri qui peut spécifier n'importe quel type de données (boolean, integer, des dates, des chaînes, virgule flottante, etc) dans n'importe quel sens (ascendant ou descendant) présents dans les colonnes de la table.