CUDA prend-il en charge la récursivité?

CUDA prend-il en charge la récursivité?

Il fait sur le matériel NVIDIA supportant la capacité de calcul 2.0 et CUDA 3.1:

Les nouvelles fonctionnalités linguistiques ajoutées à CUDA C / C ++ incluent :

La prise en charge des pointeurs de fonction et de la récursivité facilite le portage de nombreux algorithmes existants sur les 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

Récursivité: 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 NVIDIA CUDA :

Les fonctions de périphérique ne prennent en charge que la récursivité dans le code de périphérique compilé pour les périphériques de capacité de calcul 2.0.

Vous avez besoin d’une carte Fermi pour les utiliser.

Même si elle ne supporte 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 raytracer CUDA .

Dans la version CUDA 4.1, CUDA supporte la récursivité uniquement 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, c’est le cas, mais cela nécessite l’architecture Kepler. Découvrez leur dernier exemple sur le sorting rapide classique.

http://blogs.nvidia.com/2012/09/how-tesla-k20-speeds-up-quicksort-a-familiar-comp-sci-code/

Pour autant que je sache, seul le dernier Kepler GK110 prend en charge le parallélisme dynamic, qui permet ce type d’appel récursif et la génération de nouveaux threads dans le kernel. Avant Kepler GK110, ce n’était pas possible. Et notez que toutes les architectures Kepler ne le supportent pas, seul GK110 le fait.

Si vous avez besoin de récursivité, vous avez probablement besoin du Tesla K20. Je ne suis pas sûr que Fermi le supporte, ne le lise jamais. : \ Mais Kepler en est certain. =)

Tout algorithme récursif peut être implémenté avec une stack et une boucle. C’est beaucoup plus douloureux, mais si vous avez vraiment besoin de récursivité, cela peut fonctionner.

CUDA 3.1 prend en charge la récursivité

Si votre algorithme innove avec beaucoup de récurrences, alors support ou pas, il n’est pas conçu pour les GPU, ni redessinez vos algorthims ou obtenez un meilleur processeur, de toute façon ce sera mieux (je parie dans bien des cas, mieux les maginitudes) GPU.

Oui, il est supporté sur la version actuelle. Mais malgré le fait qu’il soit possible d’exécuter des fonctions récursives, vous devez avoir à l’esprit que l’allocation de mémoire à partir de la stack d’exécution ne peut pas être prédite (la fonction récursive doit être exécutée pour connaître la véritable profondeur de la récursivité). peut résulter ne pas être suffisant pour vos besoins et il pourrait avoir besoin d’un incrément manuel de la taille de la stack par défaut

Essayé juste maintenant sur mon PC avec un GPU NVIDIA avec la capacité de calcul 1.1. Il est dit que la récursivité n’est pas encore prise en charge. Donc, il n’a rien à voir avec le runtime mais le matériel lui-même