web-dev-qa-db-fra.com

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

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

53
JuanPablo

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);
}
46
Stringer

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.

12
Matias Valdenegro

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 .

9
ttsiodras

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__.

7
username_4567

Seulement après la capacité de calcul 2.0 sur les appareils compatibles

5
Arturo Garcia

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. =)

3
Hong Zhou

CUDA 3.1 prend en charge la récursivité

2
Jan C

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.

2
dicroce

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.

1
user0002128

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

0
Mr.PotatusVII

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.

0
palebluedot