GPU-programmeren

In CUDA wordt __syncthreads() binnen 'if (threadIdx.x < 16)' geplaatst, zodat alleen een deel van de threads er doorheen komt. Wat kan er juist gebeuren?

  1. AAlleen de 16 threads synchroniseren en het werkt correct
  2. BOmdat de andere threads nooit aankomen, kan het block vastlopen of wordt het resultaat onbepaald
  3. C__syncthreads() wordt automatisch genegeerd, dus er gebeurt niets
Antwoord en toelichting tonen

Antwoord: B. Omdat de andere threads nooit aankomen, kan het block vastlopen of wordt het resultaat onbepaald

__syncthreads() wacht op de aankomst van alle threads van het block, dus als het binnen een sprong staat die slechts een deel van de threads passeert, zijn er threads die nooit komen. Het gedrag is volgens de specificatie niet gedefinieerd; in de praktijk loopt het vast of is het resultaat verkeerd, ook als het toevallig doorloopt. Als basisregel wordt synchronisatie buiten sprongen geplaatst, op een plaats die alle threads zeker passeren.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. Welke uitspraak over bank conflicts van CUDA shared memory is juist?
  2. Een tabel van 32×32 floats staat in shared memory en de 32 threads van een warp lezen in de kolomrichting (verticaal), waardoor een bank conflict ontstaat. Welke maatregel wordt veel toegepast?
  3. Waarom worden bij het berekenen van een product van grote matrices op een GPU de matrices in kleine tiles verdeeld en in shared memory geladen?
  4. Wat kan er gebeuren in een GPU-kernel als het registergebruik per thread te hoog is?
  5. Welke uitspraak over de bezettingsgraad (occupancy) van een GPU is juist?

Vergelijkingen bij dit onderwerp