7
votes

Tri des objets avec la poussée Cuda

est-il possible de trier les objets à l'aide de la bibliothèque de poussée? J'ai la structure suivante: xxx

est-il possible d'utiliser une poussée afin de trier un tableau d'ob conformité à N? Pouvez-vous fournir un exemple simple sur l'utilisation de poussée pour trier les objets? Si la poussée n'est pas capable de le faire, existe-t-il d'autres bibliothèques Cuda qui me permet de le faire?


0 commentaires

5 Réponses :


-1
votes

jusqu'à maintenant, vous ne pouvez pas trier les objets personnalisés. Vous pouvez faire le tri de clé, mais pas d'objets personnalisés comme la structure que vous avez mentionnée. Il y a quelques autres algorithmes à base de Cuda ouverts disponibles pour le faire, mais cela nécessite également une modification, etc. pour les faire fonctionner pour vous.


1 commentaires

Ce n'est pas correct. Il existe des versions de tous les algorithmes de triage de la poussée de base qui prennent un cocceur modélisé sur le prédicat binaire de l'ordre strict STL. Si vous fournissez un foncteur qui agit comme ce modèle sur un objet utilisateur donné, le tri fonctionnera correctement.



-1
votes

Je n'ai pas essayé poussée pour le moment, mais il existe une fonction de tri similaire dans CUDPP appelé cudppsort . Vous ne pouvez pas trier directement les structures à l'aide de CudPsort, il ne peut que gérer des entiers ou des flotteurs.

Donc, une façon de trier la gamme de structures consiste à trier les touches (de votre structure) et à un réseau d'index de valeurs avec elle. Plus tard, utilisez la matrice d'index triée pour déplacer les structures dans leurs emplacements de tri définitifs. J'ai décrit comment faire cela pour l'algorithme de compaction CUDPPCompact dans un blog post ici . La technique devrait également être similaire à cudppsort.


0 commentaires

17
votes

Les docs pour Thrust :: Trier montrent qu'il accepte une comparaison opérateur. Voir dans leur Exemple Comment sont définis et utilisés. Je n'ai pas testé cela, mais sur la base de l'exemple, tout ce dont vous auriez besoin est une structure qui ressemble à ceci comme ceci: xxx

puis invoquer poussée .begin (), obs.end (), obcmp ()) .


1 commentaires

Cela aurait dû être pris comme une réponse, je l'ai testé et cela a fonctionné. Merci pour le post!



6
votes

Même si vous pouvez trier les objets en utilisant des définitions de struct spéciales, à l'aide d'une structure comme fonction de fonctionnement, elle permettra de modifier l'algorithme de tri de RADIX-TRY. La vitesse de la sorte de radix est sensiblement plus rapide que celle de la fusion. Donc, lorsque vous utilisez la poussée, essayez d'utiliser des types d'entiers comme des valeurs clés que possible.

Je peux vous suggérer d'utiliser "Thust :: Sory_by_key (..)" Fonction "

Vous devez changer votre structure de AOS à la structure de la SOA. xxx

à xxx

Lorsque vous triez les indices avec SOR_BY_KEY, les valeurs seront déjà triées. xxx


2 commentaires

Il suffit de vous demander, comment puis-je savoir quelle poussée d'algorithme de tri utilise?


AFAIK, si des valeurs entières sont utilisées, elles utilisent Radix Tri. Si la méthode de comparaison définie par l'utilisateur est utilisée, elle utilise une sorte de fusion. Si les numéros de points flottants sont utilisés, ils peuvent utiliser à nouveau la fusion. Je me souviens que j'ai converti (stocké) mes valeurs de point flottant sur des valeurs entières pour obtenir de meilleures performances de tri.



2
votes

Vous pouvez trier les objets en surcharge de la surcharge <. Par exemple:

 XXX  

Les objets seront triés après la distance.


0 commentaires