est-il possible de trier les objets à l'aide de la bibliothèque de poussée?
J'ai la structure suivante: 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? p> p>
5 Réponses :
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. P>
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.
Je n'ai pas essayé 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. P>
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: puis invoquer poussée
.begin (), obs.end (), obcmp ()) code>. p> p>
Cela aurait dû être pris comme une réponse, je l'ai testé et cela a fonctionné. Merci pour le post!
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 " p>
Vous devez changer votre structure de AOS à la structure de la SOA. p> à p> Lorsque vous triez les indices avec SOR_BY_KEY, les valeurs seront déjà triées. p>
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.
Vous pouvez trier les objets en surcharge de la surcharge <. Par exemple:
XXX PRE>Les objets seront triés après la distance. P> P>