GPU-programmeren

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?

  1. ABeide zijden worden tegelijk uitgevoerd, dus de snelheid verandert niet
  2. BDe threads aan de else-zijde worden niet uitgevoerd en vervallen
  3. CDe if-zijde en de else-zijde worden na elkaar uitgevoerd, waarbij de niet-betrokken threads telkens wachten, zodat de efficiëntie daalt
Antwoord en toelichting tonen

Antwoord: C. De if-zijde en de else-zijde worden na elkaar uitgevoerd, waarbij de niet-betrokken threads telkens wachten, zodat de efficiëntie daalt

De 32 threads van een warp voeren dezelfde instructie uit. Als de sprong zich splitst, wordt eerst de instructie van de if-zijde uitgevoerd met alleen de threads van de if-zijde actief en daarna de else-zijde met de overige threads. Het resultaat is juist, maar omdat telkens de helft van de threads niets doet, is de tijd de som van beide paden. De efficiëntie neemt toe als data of threads zo worden gerangschikt dat sprongen binnen een warp gelijk zijn.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. Zowel (1) als (2) hierboven laat de helft van de threads A en de rest B uitvoeren. Welke uitleg is juist met betrekking tot de efficiëntie van de warps (uitgaande van 32 threads per warp)?
  2. Welke uitspraak over coalesced geheugentoegang bij GPU's is juist?
  3. Als zoals hierboven elke 32 elementen van de array wordt gelezen, waarbij i het nummer van elke thread is, is dat trager dan het lezen van a[i]. Wat is de belangrijkste reden?
  4. Welke rangschikking is voordelig voor coalesced geheugentoegang wanneer data van deeltjes met posities x, y en z op een GPU wordt verwerkt?
  5. Welke uitspraak over de kenmerken van CUDA shared memory is juist?

Vergelijkingen bij dit onderwerp