SIMD vs SIMT : modèle d’exécution, branchements, mémoire
SIMD et SIMT appliquent tous deux la même opération à de nombreuses données avec une seule instruction, mais ils se présentent différemment au programme. Le SIMD correspond aux instructions vectorielles des CPU : le programmeur ou le compilateur range les données dans des registres vectoriels de largeur fixe et utilise explicitement ces instructions. Le SIMT est l’approche des GPU : on écrit simplement le traitement d’un thread, et le matériel regroupe par exemple 32 threads en un warp exécuté avec la même instruction. On peut écrire des branchements par thread, mais lorsque les chemins divergent au sein d’un warp, les deux chemins sont exécutés l’un après l’autre et l’efficacité baisse.
| Critère | SIMD | SIMT |
|---|---|---|
| Modèle d’exécution | Une instruction traite simultanément plusieurs éléments rangés dans un registre vectoriel | Une instruction est exécutée simultanément par de nombreux threads regroupés en un warp. Chaque thread possède ses propres registres |
| Vue du programme | On écrit en tenant compte de la largeur des vecteurs, avec des intrinsèques, de l’assembleur ou la vectorisation automatique du compilateur | On écrit le traitement d’un thread comme du code scalaire. Le regroupement est fait par le matériel |
| Largeur parallèle | Fixée par la largeur des registres. Par exemple 16 nombres de 32 bits pour 512 bits | La largeur du warp (32 threads, par exemple). La puce entière maintient des dizaines de milliers de threads simultanément |
| Branchements | Pas de branchement par élément. On calcule les deux côtés et on choisit avec un masque issu d’une comparaison | Possibles par thread. Si les chemins divergent dans un warp, les deux chemins sont exécutés successivement et les threads non concernés sont mis en pause (divergence) |
| Gestion des éléments actifs | Explicite, par le programmeur ou le compilateur, avec des instructions masquées ou de mélange (blend) | Le matériel gère automatiquement les threads actifs |
| Accès mémoire | Efficace pour lire ensemble des adresses contiguës. Les adresses dispersées passent par des instructions gather/scatter, mais c’est lent | Chaque thread peut désigner librement une adresse. Si des threads voisins lisent des adresses voisines, les accès sont regroupés (coalescence) |
| Masquage de la latence mémoire | Grands caches, exécution dans le désordre, préchargement | Basculement entre de nombreux warps : pendant qu’un warp attend, un autre s’exécute |
| Place dans la taxonomie de Flynn | Le SIMD lui-même | Une forme de SIMD présentée sous forme de threads |
| Usages typiques | Instructions vectorielles des CPU. Boucles de traitement d’image et de son, de cryptographie et de calcul matriciel | Warps des GPU. Calcul massivement parallèle : graphisme, entraînement et inférence d’IA, calcul scientifique |
Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.