Qu'est-ce que SIMT ?

Modèle « une instruction, plusieurs threads ». Le programme est écrit par thread, mais le matériel regroupe les threads en warps (32 chez NVIDIA) exécutant la même instruction.

Nom japonais: SIMT

« SIMT » apparaît dans 2 questions d'entraînement réparties sur 1 thèmes, dont Programmation GPU.

Domaine: Programmation GPU

Comment le SIMT exécute les threads

Dans le modèle SIMT (single instruction, multiple threads), le programmeur écrit un kernel comme du code ordinaire pour un seul thread, et des milliers de threads l'exécutent sur des données différentes. Le matériel regroupe les threads en paquets fixes, appelés warps de 32 threads sur les GPU NVIDIA et wavefronts de 64 ou 32 threads sur les GPU AMD. Une seule instruction est chargée et décodée pour tout le paquet, puis exécutée en parfaite synchronie (lockstep) par tous ses threads, chacun avec ses propres registres et données. Le coût de la logique de contrôle est ainsi réparti sur de nombreuses voies de calcul, si bien que l'essentiel de la surface de la puce est consacré au calcul.

Divergence de branchement

Comme chaque thread est écrit indépendamment, les threads d'un même warp peuvent prendre des branches différentes. Le matériel gère ce cas en exécutant chaque chemin tour à tour, les threads qui ne sont pas sur ce chemin étant masqués, puis en reconvergeant. La correction est préservée, mais si la moitié des threads prend chaque côté d'un if-else, le warp passe du temps sur les deux et son débit est à peu près divisé par deux. Le code soucieux des performances organise les données pour que les threads d'un même warp suivent le même chemin, par exemple en faisant dépendre les conditions de branchement de l'indice du warp plutôt que des données de chaque thread.

SIMT et SIMD des CPU

Les extensions SIMD (single instruction, multiple data) des CPU appliquent une instruction à un registre vectoriel contenant un nombre fixe d'éléments, par exemple 4 ou 8. Le programme ou le compilateur doit être conçu autour de cette largeur, avec des instructions vectorielles explicites et des masques pour les cas limites. Le SIMT masque la largeur : le code décrit un thread scalaire, et le matériel forme les vecteurs à partir de nombreux threads et gère le masquage en cas de divergence. Sous le capot, l'exécution est similaire, c'est pourquoi les performances SIMT dépendent toujours du maintien des threads d'un warp au même pas.

Conséquences pratiques

Plusieurs règles courantes de programmation GPU découlent du SIMT. La taille des blocs de threads est normalement un multiple de 32, pour qu'aucun warp ne s'exécute partiellement vide. Les accès mémoire sont les plus rapides lorsque des threads voisins d'un warp accèdent à des adresses voisines, ce qui permet au matériel de les combiner en quelques transactions larges, un motif appelé coalescence. Enfin, les GPU masquent la longue latence mémoire en gardant de nombreux warps résidents et en basculant vers un autre warp prêt dès que l'un est bloqué ; c'est pourquoi une occupation élevée, c'est-à-dire suffisamment de warps actifs par cœur, compte souvent pour les performances.

S'entraîner : questions sur SIMT

Quelle est la différence entre le mode SIMT (instruction unique, threads multiples) des GPU et les instructions SIMD des CPU ?

  1. ALe SIMT applique simultanément plusieurs instructions à une donnée, le SIMD une instruction à une donnée
  2. BSIMT et SIMD sont strictement identiques, seul le nom diffère
  3. CEn SIMT, chaque thread s'écrit comme un programme indépendant et le matériel gère les branchements, alors qu'en SIMD le programmeur ou le compilateur utilise explicitement des instructions vectorielles de largeur fixe
Afficher la réponse et l'explication

Réponse : C. En SIMT, chaque thread s'écrit comme un programme indépendant et le matériel gère les branchements, alors qu'en SIMD le programmeur ou le compilateur utilise explicitement des instructions vectorielles de largeur fixe

En SIMD sur CPU, une instruction s'applique à un registre vectoriel regroupant 4 ou 8 données ; le programme est donc écrit en tenant compte de la largeur du vecteur. En SIMT sur GPU, le programmeur écrit normalement le traitement d'un seul thread, et le matériel regroupe les threads par 32 pour les exécuter avec la même instruction. Les branchements par thread sont permis : le matériel exécute successivement les chemins divergents, mais l'efficacité baisse alors.

Questions fréquentes

Qu'est-ce qu'un warp en calcul GPU ?

Un warp est un groupe de 32 threads sur les GPU NVIDIA qui exécutent ensemble la même instruction en parfaite synchronie. C'est l'unité de base d'émission des instructions dans le modèle SIMT ; l'équivalent chez AMD s'appelle un wavefront.

Quelle est la différence entre SIMT et SIMD ?

Le SIMD expose des instructions vectorielles de largeur fixe que le programmeur ou le compilateur doit utiliser explicitement. Le SIMT permet d'écrire chaque thread comme du code scalaire indépendant, tandis que le matériel regroupe les threads en warps et gère les branchements divergents.

Qu'est-ce que la divergence de warp ?

La divergence de warp se produit lorsque les threads d'un même warp prennent des chemins de branchement différents. Le matériel exécute chaque chemin en série en masquant les threads inactifs, ce qui réduit l'efficacité jusqu'à ce que les chemins reconvergent.

« SIMT » dans les explications

Questions mentionnant « SIMT » (2)

  1. Quelle est la différence entre le mode SIMT (instruction unique, threads multiples) des GPU et les instructions SIMD des CPU ?
  2. Comment appelle-t-on, sur les GPU NVIDIA, l'unité regroupant 32 threads qui exécutent simultanément la même instruction ?

Termes associés

GPU SIMD Bloc de threads Boucle grid-stride Coalescence mémoire Conflit de banc CUDA Divergence de warp Masquage de latence Mémoire constante

Retour au glossaire