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.

KenmerkSIMDSIMT
UitvoeringsmodelEén instructie verwerkt tegelijk meerdere elementen in een vectorregisterEén instructie wordt tegelijk uitgevoerd door veel threads die tot een warp zijn gebundeld. Elke thread heeft zijn eigen registers
Hoe het programma eruitzietGeschreven met de vectorbreedte in gedachten. Via intrinsics, assembly of automatische vectorisatie door de compilerDe verwerking van één thread wordt als scalaire code geschreven. De hardware doet het bundelen
Parallelle breedteBepaald door de registerbreedte. Bijvoorbeeld 16 getallen van 32 bit bij 512 bitDe warpbreedte (bijvoorbeeld 32 threads). De chip als geheel houdt tienduizenden threads tegelijk vast
VertakkingenGeen vertakking per element. Beide kanten worden berekend en met een masker uit het vergelijkingsresultaat gekozenPer 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 elementenExpliciet door programmeur of compiler, met gemaskeerde instructies of blend-instructiesDe hardware beheert de actieve threads automatisch
GeheugentoegangSterk in het samen lezen van aaneengesloten adressen. Verspreide adressen worden met gather/scatter-instructies afgehandeld, maar dat is traagElke thread kan vrij een adres opgeven. Als naburige threads naburige adressen lezen, worden de toegangen samengevoegd (coalescing)
Verbergen van geheugenlatentieGrote caches, out-of-order-uitvoering, prefetchingWisselen tussen veel warps: terwijl een warp wacht, draait een andere
Plaats in de taxonomie van FlynnSIMD zelfEen vorm van SIMD die zich voordoet als threads
Typisch gebruikVectorinstructies van CPU's. Lussen voor beeld- en audioverwerking, cryptografie en matrixbewerkingenWarps 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.

Wanneer welke variant?

SIMD
Wanneer je op een CPU een lus wilt versnellen die dezelfde berekening op elk element van een array uitvoert. Het effect is groot als de data aaneengesloten ligt en er geen afhankelijkheden tussen iteraties zijn; het werkt ook via automatische vectorisatie door de compiler.
SIMT
Grootschalige parallelle berekeningen die dezelfde verwerking op duizenden tot miljoenen onafhankelijke elementen toepassen. Op een GPU schrijf en draai je een programma per thread. De efficiëntie stijgt als vertakkingen en geheugenadressen binnen een warp op één lijn liggen.
Combinatie
Binnen een GPU wordt SIMT-uitvoering per warp uitgevoerd op SIMD-rekeneenheden. In systemen die CPU en GPU samen gebruiken, doet de CPU met SIMD de voorbewerking en besturing en de GPU de grote parallelle berekeningen.

Veelgestelde vragen

Is SIMT een volledig ander mechanisme dan SIMD?

In de hardware lijken ze sterk op elkaar. Elke thread van een warp komt overeen met één lane van een SIMD-rekeneenheid en draait met dezelfde instructie. Het verschil zit in de presentatie: bij SIMT regelt de hardware de registers, adressen en vertakkingen per thread, zodat de programmeur kan schrijven zonder aan de vectorbreedte te denken.

Hoe beperk je warpdivergentie?

Zorg dat threads in dezelfde warp zoveel mogelijk dezelfde kant van een vertakking nemen. Mogelijke methoden zijn de data herschikken zodat de uitkomst van de voorwaarde gelijk is, de threadnummers zo toewijzen dat de voorwaarde per warp omslaat, en korte vertakkingen vervangen door selectiebewerkingen.

Hoe schrijf je met SIMD code met een if-statement?

Met een vergelijkingsinstructie wordt de voorwaarde per element omgezet in een masker; beide resultaten worden berekend en daarna per element volgens het masker gekozen. In instructiesets met gemaskeerde instructies kunnen alleen de elementen die aan de voorwaarde voldoen worden berekend en opgeslagen. Omdat beide paden worden berekend, daalt de efficiëntie als de vertakking zwaar is, wat lijkt op divergentie bij SIMT.

Wanneer lukt automatische vectorisatie door de compiler niet goed?

Bijvoorbeeld als er afhankelijkheden tussen iteraties zijn (een resultaat wordt in de volgende iteratie gebruikt), als pointers mogelijk naar hetzelfde gebied wijzen, als data niet aaneengesloten ligt, of als de lus complexe vertakkingen of functieaanroepen bevat. Door de compiler te laten weten dat er geen afhankelijkheden zijn, of door de data anders te ordenen, kan vectorisatie soms toch lukken.

Test uw begrip

Welke methode voert met één instructie dezelfde bewerking tegelijk uit op meerdere gegevens?

  1. ASISD
  2. BSIMD
  3. CMISD
Antwoord en toelichting tonen

Antwoord: B. SIMD

SIMD voert met één instructie dezelfde bewerking parallel uit op meerdere gegevens; met een register van 512 bit kunnen bijvoorbeeld 16 getallen van 32 bit in één keer worden berekend. Voorbeelden zijn SSE en AVX van x86 en NEON en SVE van ARM, waarmee bij beeldverwerking, videocompressie en matrixbewerkingen een versnelling van enkele malen of meer wordt bereikt. In de classificatie van Flynn bestaan verder onder meer SISD (gewone sequentiële verwerking) en MIMD (multicore).

Hoe heet bij NVIDIA-GPU's de eenheid waarin 32 threads tot één bundel worden gevormd die dezelfde instructie tegelijk uitvoert?

  1. AWarp
  2. BGrid
  3. CPage
Antwoord en toelichting tonen

Antwoord: A. Warp

De threads in een block worden in de hardware in warps van 32 verdeeld, en de 32 threads van één warp voeren dezelfde instructie tegelijk uit op verschillende data. Deze methode, waarbij als threads geschreven programma's tot een bundel worden gevormd en met dezelfde instructie werken, heet SIMT. Bij AMD-GPU's heet een vergelijkbare eenheid een wavefront, met 64 of 32 threads. Als basisregel is de blockgrootte een veelvoud van 32.

Welke uitspraak over het verschil tussen de SIMT-methode (single instruction, multiple threads) van de GPU en SIMD-instructies van de CPU is juist?

  1. ASIMT voert meerdere instructies tegelijk uit op één data-element en SIMD voert één instructie uit op één data-element
  2. BSIMT en SIMD zijn volledig hetzelfde en verschillen alleen in naam
  3. CBij SIMT kan elke thread als een onafhankelijk programma worden geschreven en handelt de hardware ook sprongen af, terwijl bij SIMD de programmeur of compiler expliciet vectorinstructies met vaste breedte gebruikt
Antwoord en toelichting tonen

Antwoord: C. Bij SIMT kan elke thread als een onafhankelijk programma worden geschreven en handelt de hardware ook sprongen af, terwijl bij SIMD de programmeur of compiler expliciet vectorinstructies met vaste breedte gebruikt

Bij SIMD van de CPU wordt één instructie toegepast op een vectorregister met bijvoorbeeld 4 of 8 data-elementen, dus het programma wordt geschreven met aandacht voor de vectorbreedte. Bij SIMT van de GPU schrijft de programmeur de bewerking van één thread gewoon uit, en bundelt de hardware die in groepen van 32 en voert ze met dezelfde instructie uit. Threads mogen individueel vertakken, en de hardware voert de gesplitste paden na elkaar uit, maar dan daalt de efficiëntie.

  1. Binnen één warp splitst een voorwaardelijke sprong de helft van de threads naar de if-zijde en de rest naar de else-zijde (warp divergence). Hoe wordt dit over het algemeen uitgevoerd?
  2. Welke uitspraak over coalesced geheugentoegang bij GPU's is juist?
  3. Welk soort instructie wordt gebruikt bij automatische vectorisatie door een compiler?

Oefenvragen over GPU-programmeren

Belangrijke termen uitgelegd

SIMD
Afkorting van Single Instruction, Multiple Data. Methode waarbij één instructie dezelfde bewerking op meerdere data tegelijk uitvoert. Versnelt beeldverwerking en AI-berekeningen.
SIMT
Single instruction, multiple threads. Het programma wordt per thread geschreven, maar de hardware bundelt threads in warps (bij NVIDIA 32) en voert ze met dezelfde instructie uit.
Warp divergence
Verschijnsel waarbij de paden van threads binnen één warp door een voorwaardelijke sprong uiteenlopen. De gesplitste paden worden na elkaar uitgevoerd, dus de efficiëntie daalt.
Memory coalescing
Het samenvoegen tot minder geheugentoegangen wanneer naburige threads in een warp naburige adressen benaderen. Gecombineerde toegang.
Vectorisatie
Optimalisatie die dezelfde berekening die in een lus per element wordt gedaan omzet in een vorm die met SIMD-instructies meerdere elementen tegelijk verwerkt. Voorwaarde is dat er tussen de iteraties geen datafhankelijkheid is.

Verwante vergelijkingen