SIMD versus SIMT: uitvoeringsmodel, vertakkingen en geheugen
Bij zowel SIMD als SIMT voert één instructie dezelfde bewerking uit op veel data, maar ze zien er voor het programma anders uit. SIMD zijn de vectorinstructies van CPU's: de programmeur of compiler zet data in vectorregisters met een vaste breedte en gebruikt expliciet die instructies. SIMT is de aanpak van GPU's: je schrijft gewoon de verwerking van één thread, en de hardware bundelt bijvoorbeeld 32 threads tot een warp die met dezelfde instructie wordt uitgevoerd. Vertakkingen per thread zijn mogelijk, maar als de paden binnen een warp uiteenlopen, worden beide paden na elkaar uitgevoerd en daalt de efficiëntie.
| Kenmerk | SIMD | SIMT |
|---|---|---|
| Uitvoeringsmodel | Eén instructie verwerkt tegelijk meerdere elementen in een vectorregister | Eén instructie wordt tegelijk uitgevoerd door veel threads die tot een warp zijn gebundeld. Elke thread heeft zijn eigen registers |
| Hoe het programma eruitziet | Geschreven met de vectorbreedte in gedachten. Via intrinsics, assembly of automatische vectorisatie door de compiler | De verwerking van één thread wordt als scalaire code geschreven. De hardware doet het bundelen |
| Parallelle breedte | Bepaald door de registerbreedte. Bijvoorbeeld 16 getallen van 32 bit bij 512 bit | De warpbreedte (bijvoorbeeld 32 threads). De chip als geheel houdt tienduizenden threads tegelijk vast |
| Vertakkingen | Geen vertakking per element. Beide kanten worden berekend en met een masker uit het vergelijkingsresultaat gekozen | Per thread te schrijven. Als de paden binnen een warp uiteenlopen, worden beide paden na elkaar uitgevoerd en rusten de niet-betrokken threads (divergentie) |
| Beheer van actieve elementen | Expliciet door programmeur of compiler, met gemaskeerde instructies of blend-instructies | De hardware beheert de actieve threads automatisch |
| Geheugentoegang | Sterk in het samen lezen van aaneengesloten adressen. Verspreide adressen worden met gather/scatter-instructies afgehandeld, maar dat is traag | Elke thread kan vrij een adres opgeven. Als naburige threads naburige adressen lezen, worden de toegangen samengevoegd (coalescing) |
| Verbergen van geheugenlatentie | Grote caches, out-of-order-uitvoering, prefetching | Wisselen tussen veel warps: terwijl een warp wacht, draait een andere |
| Plaats in de taxonomie van Flynn | SIMD zelf | Een vorm van SIMD die zich voordoet als threads |
| Typisch gebruik | Vectorinstructies van CPU's. Lussen voor beeld- en audioverwerking, cryptografie en matrixbewerkingen | Warps van GPU's. Grootschalige parallelle berekeningen zoals graphics, training en inferentie van AI en wetenschappelijk rekenwerk |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.