CUDA

2      Vocabulaire et Notions

Pour pouvoir continuer l’étude, nous avons besoin d’un peu de vocabulaire spécifique à l’environnement CUDA.

L’hôte est le CPU, c’est lui qui demande au périphérique (le GPU) d’effectuer les calculs.

Un kernel est une portion parallèle de code à exécuter sur le périphérique. Chacune de ses instances s’appelle un thread.
A l’inverse des threads CPU, les threads GPU sont extrêmement « légers » ce qui signifie que le changement de contexte entre deux threads est une opération peu coûteuse.

Un warp est un ensemble de 32 threads, envoyés ensemble à l’exécution, et exécutés simultanément.
Quel que soit le GPU utilisé, quel que soit la quantité de données à traiter, dans n’importe quel cas, un warp sera exécuté sur deux cycles.

Pour la petite anecdote, le terme warp provient des machines à tisser. Il désigne un ensemble de fils de cotons or (en anglais un fil se dit… thread).

machine a tisser

Cet ensemble de 32 threads est la taille minimale des données traitées de façons SIMD par un multiprocesseur CUDA.
Mais cette granularité n’est pas toujours suffisante pour être facilement utilisable par un programmeur.

Ainsi en CUDA on ne manipule pas directement des warps, on travaille avec des blocs pouvant contenir de 64 à 512 threads.

Un petit parallèle avec le matériel. Un thread est exécuté par un processeur : posons donc l’égalité entre le thread et le processeur.
Ainsi, le bloc est le multiprocesseur, tandis que la grille représente l’entièreté de la carte.

Un bloc est un élément de calculs indépendants, constitué de threads. L’ordre dans lequel les blocs sont exécutés par la carte n’est pas prédictible parallèlement, consécutivement ou tout autre combinaison est possible, c’est pourquoi ils doivent représenter une unité de traitement indépendante et c’est également pourquoi un thread ne peut communiquer qu’avec les threads du même bloc que lui.

Une grille est constituée de blocs.
L’intérêt de ce regroupement est que le nombre de blocs traités simultanément par le GPU est intimement lié aux ressources du hardware En effet le nombre de blocs dans une grille permet d’abstraire totalement de cette contrainte et d’appliquer un kernel à une grande quantité de threads en un seul appel, sans se soucier des ressources fixées. Le runtime de CUDA se charge de décomposer le tout pour nous. Ce modèle est ainsi extrêmement extensible : si un hardware a peu de ressources il exécute les blocs séquentiellement, à l’inverse, s’il dispose d’un très grand nombre d’unités, uk peut les traiter en parallèle. Le même code permet donc de cibler à la fois les GPU d’entrée de gamme, les GPU haut de gamme voire les GPU futurs.

Grille de Blocs de Threads
Grille de Blocs de Threads

Le calcul hétérogène est l’utilisation des deux types de processeur disponibles sur nos ordinateurs : les CPU et les GPU. Il s’agit donc d’utiliser le bon type de processeur pour la bonne tâche.

6 réflexions sur « CUDA »

  1. Bonjour,
    je souhaite savoir quels sont les outils et comment faire les configurations s’il y a lieu de faire, à fin programmer en java en utilisant CUDA?
    j’ai un windows xp pack2
    carte graphique NVIDIA GeForce Go 7300
    1 Go de RAM
    merci à l’avance.
    Cordialement.

  2. Bonjour, il y a une faute en première page, je cite :
    « le code devant s’exécuter sur le GPU est en fait exécuté sur le GPU »
    -> est en fait exécuté sur le CPU.

    Voila merci pour l’article sinon 🙂

  3. pouvez vous nous indiquer les étapes à suivre pour utiliser cuda avec Visual studio 2010 ou bien 2008 et merci d’avance

Laisser un commentaire