GPU-programmeren

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)?

if (threadIdx.x % 2 == 0) A(); else B();   // (1)
if ((threadIdx.x / 32) % 2 == 0) A(); else B();   // (2)
  1. A(1) is efficiënter, omdat de sprongen gelijk zijn
  2. BBij (1) splitsen de sprongen zich in alle warps, maar bij (2) zijn ze per warp gelijk, dus (2) is efficiënter
  3. CBeide zijn precies even efficiënt
Antwoord en toelichting tonen

Antwoord: B. Bij (1) splitsen de sprongen zich in alle warps, maar bij (2) zijn ze per warp gelijk, dus (2) is efficiënter

Bij (1) wordt gesplitst tussen even en oneven threads, dus in elke warp zitten threads van zowel de A-zijde als de B-zijde en voeren alle warps A en B na elkaar uit. Bij (2) wordt gesplitst op de waarde van het threadnummer gedeeld door 32, dus alle 32 threads van een warp staan aan dezelfde kant en voert elke warp alleen A of alleen B uit. Ook voor hetzelfde werk verdwijnt divergence als de voorwaarde per warp gelijk wordt gemaakt.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. Welke uitspraak over coalesced geheugentoegang bij GPU's is juist?
  2. 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?
  3. Welke rangschikking is voordelig voor coalesced geheugentoegang wanneer data van deeltjes met posities x, y en z op een GPU wordt verwerkt?
  4. Welke uitspraak over de kenmerken van CUDA shared memory is juist?
  5. Welke uitspraak over de werking van __syncthreads() in CUDA is juist?

Vergelijkingen bij dit onderwerp