CUDA prend-il en charge la récursivité?
Cela concerne le matériel NVIDIA prenant en charge la capacité de calcul 2.0 et CUDA 3.1:
Nouvelles fonctionnalités linguistiques ajoutées à CUDA C/ C++ include:
Prise en charge de la fonction les pointeurs et la récursion facilitent porter de nombreux algorithmes existants à GPU Fermi
http://developer.nvidia.com/object/cuda_3_1_downloads.html
Pointeurs de fonction:http://developer.download.nvidia.com/compute/cuda/sdk/website/CUDA_Advanced_Topics.html#FunctionPointers
Recursion: Je ne trouve pas d'échantillon de code sur le site Web de NVIDIA, mais sur le forum quelqu'un publie ceci:
__device__ int fact(int f)
{
if (f == 0)
return 1;
else
return f * fact(f - 1);
}
Oui, consultez le Guide de programmation de NVIDIA CUDA :
Les fonctions device ne prennent en charge que la récursivité dans le code de périphérique compilé pour les périphériques de la capacité de calcul 2.0.
Vous avez besoin d'une carte Fermi pour les utiliser.
Même si elle ne prend en charge que la récursivité pour des puces spécifiques, vous pouvez parfois vous en sortir avec une récursion "émulée": voyez comment j'ai utilisé la récursion à la compilation pour mon rayon de traçage CUDA .
Dans la version 4.1 de CUDA, CUDA ne prend en charge la récursivité que pour la fonction __device__ mais pas pour la fonction __global__.
Seulement après la capacité de calcul 2.0 sur les appareils compatibles
Bien sûr, mais l’architecture Kepler est nécessaire pour le faire .. Regardez leur dernier exemple sur le tri rapide classique.
http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/
Autant que je sache, seul le dernier Kepler GK110 prend en charge le parallélisme dynamique, qui permet ce type d'appels récursifs et la génération de nouveaux threads dans le noyau. Avant Kepler GK110, ce n'était pas possible. Et notez que toutes les architectures Kepler ne le supportent pas, seul le GK110 le fait.
Si vous avez besoin de récursion, vous avez probablement besoin de la Tesla K20 . Je ne sais pas si Fermi la supporte, ne la lisez jamais. :\ Mais Kepler, bien sûr. =)
CUDA 3.1 prend en charge la récursivité
Tout algorithme récursif peut être implémenté avec une pile et une boucle. C'est beaucoup plus pénible, mais si vous avez vraiment besoin de récursion, cela peut fonctionner.
Si votre algorithme implique beaucoup de récursions, support ou non, il n'est pas conçu pour les GPU, que vous redessiniez vos algorithmes ou que vous obteniez un meilleur processeur, de toute façon il sera meilleur (je parie que dans beaucoup de cas, maginitudes mieux) GPU.
Oui, il est pris en charge sur la version actuelle. Mais malgré le fait qu'il soit possible d'exécuter des fonctions récursives, vous devez garder à l'esprit que l'allocation mémoire de la pile d'exécution ne peut pas être prédite (la fonction récursive doit être exécutée pour connaître la profondeur réelle de la récursion), de pourrait ne pas suffire à vos besoins et nécessiter un incrément manuel de la taille de pile par défaut
Oui, cela prend en charge la récursivité. Cependant, ce n'est pas une bonne idée de faire de la récursion sur GPU. Parce que chaque fil va le faire.