GPU-programmeren

In CUDA wil men halverwege een kernel wachten tot de berekeningen van alle andere blocks klaar zijn voordat men naar de volgende fase gaat. Welke methode is gebruikelijk?

  1. A__syncthreads() aanroepen
  2. BDe kernel op dat punt in tweeën splitsen en de tweede kernel starten nadat de eerste klaar is
  3. CIn een lus blijven wachten op een vlag die andere blocks schrijven
Antwoord en toelichting tonen

Antwoord: B. De kernel op dat punt in tweeën splitsen en de tweede kernel starten nadat de eerste klaar is

Blocks worden onafhankelijk uitgevoerd en mogen in elke volgorde worden uitgevoerd, dus niet alle blocks staan noodzakelijk tegelijk op de GPU. Als het block waarop wordt gewacht nog niet is begonnen, eindigt een lus die op een vlag wacht nooit. Daarom wordt gewoonlijk gebruikgemaakt van de eigenschap dat een kernel in dezelfde stream pas begint nadat de vorige klaar is, en wordt globale synchronisatie bereikt door de kernel te splitsen.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. Bij het maken van een histogram van pixelwaarden op een GPU kan het traag zijn als alle threads rechtstreeks met atomicAdd bij de 256 bins in global memory optellen. Welke verbetermethode is juist?
  2. Waarom wordt bij het berekenen van de som van veel waarden op een GPU een reductie in boomvorm gebruikt (herhaaldelijk naburige waarden optellen en zo halveren)?
  3. Hoeveel stappen zijn nodig om 1024 waarden met een reductie in boomvorm te sommeren?
  4. Welke uitspraak is in het algemeen juist over het geheugen aan de CPU-zijde en dat aan de GPU-zijde bij een programma dat een discrete GPU gebruikt?
  5. Bij lichte bewerkingen zoals het één keer optellen van array-elementen kan het sturen van data naar de GPU trager zijn dan rekenen op de CPU. Wat is de belangrijkste reden?

Vergelijkingen bij dit onderwerp