Leçon 11 : Divergence de warp
Un warp est un groupe de 32 threads qui exécutent la même instruction ensemble (lockstep) sous le modèle SIMT. Tant que tous les threads d'un warp suivent le même chemin de code, le matériel les exécute ensemble en une seule passe. Mais que se passe-t-il quand un if/else envoie certains threads vers
Imagine une chorale de 32 chanteurs qui doivent chanter la même note à tout moment. Si la moitié doit chanter « la » et l'autre moitié « do », le chef laisse d'abord chanter tous ceux qui font « la » (le reste reste silencieux), puis tous ceux qui font « do ». Ça prend deux fois plus de temps. Mais si une chorale entière chante « la » et une deuxième chorale entière chante « do », les deux chantent en même temps sans aucun gaspillage.
- divergence de warp (warp divergence)
- Quand les threads d'un même warp prennent des branches différentes d'un if/else, donc le matériel exécute les chemins en série — le temps est la somme des chemins.
- lockstep
- Les 32 threads d'un warp exécutent la même instruction au même pas. C'est la base de SIMT.
- masquage (predication)
- Quand seuls certains threads d'une branche sont actifs, le reste reste masqué : ils exécutent la même instruction mais n'écrivent aucun résultat.
- branche uniforme (uniform branch)
- Une condition que tous les threads d'un warp évaluent de la même façon (par exemple, par warpId), donc il n'y a ni divergence ni pénalité.