nVidia CUDA : la fin des CPU ?

Quelques définitions

Avant de nous plonger dans CUDA prenons soin de définir au préalable quelques termes qui parsèment les documentations de NVIDIA. La firme Californienne a en effet choisi une terminologie bien particulière qui peut dérouter. En premier lieu il faut définir ce qu’est un thread en CUDA car il n’a pas tout à fait le même sens qu’un thread CPU, et n’est pas non plus équivalent à ce que nous appelons threads dans nos articles sur les GPU. Un thread sur le GPU consiste en un élément de base des données à traiter. A l’inverse des threads CPU, les threads CUDA sont extrêmement « légers » ce qui signifie que le changement de contexte entre deux threads est une opération peu coûteuse.

Deuxième terme fréquemment rencontré dans la documentation de CUDA : warp. Cette fois pas de confusion ce terme n’évoque rien si ce n’est peut être aux « Trekkies » ou aux adeptes de Warhammer. En réalité pour la petite anecdote ce terme vient des machines à tisser, il désigne un ensemble de fils de cotons or (en anglais fil se dit… thread). Un warp en CUDA est donc un ensemble de 32 threads, il s’agit de la taille minimale des données traitées de façon SIMD par un multiprocesseur en CUDA.

CUDA nVidia

Mais cette granularité n’est toujours pas 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.

Enfin ces blocs sont réunis dans des grilles. 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 comme nous le verrons plus loin. Le nombre de blocs dans une grille permet d’abstraire totalement cette contrainte et d’appliquer un kernel à une grande quantité de threads en un seul appel, sans se soucier de ressources fixées. Le runtime 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 il 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.

CUDA nVidia

Les autres termes que vous rencontrerez fréquemment dans l’API CUDA sont utilisés pour désigner le CPU qui est ici appelé host (hôte) ou le GPU désigné comme device (périphérique). Après cette petite introduction qui, on l’espère, ne vous aura pas trop refroidi, il est temps de passer aux choses sérieuses !