GPU-programmeren

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?

  1. AStoppen met atomicAdd en met gewone optelling naar global memory schrijven
  2. BDe bins samenvoegen tot één bin
  3. CPer block een deelhistogram in shared memory maken en dat ten slotte in één keer bij de bins in global memory optellen
Antwoord en toelichting tonen

Antwoord: C. Per block een deelhistogram in shared memory maken en dat ten slotte in één keer bij de bins in global memory optellen

Als veel threads tegelijk atomicAdd op dezelfde bin uitvoeren, worden de updates één voor één afgehandeld, en omdat global memory traag is, wordt de wachttijd lang. Als elk block in shared memory een eigen histogram heeft, daarin telt en pas ten slotte één keer globaal optelt, daalt de contentie in het trage geheugen tot het aantal blocks × het aantal bins keer. Atomaire bewerkingen in shared memory zijn veel sneller.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. 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)?
  2. Hoeveel stappen zijn nodig om 1024 waarden met een reductie in boomvorm te sommeren?
  3. 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?
  4. 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?
  5. Welke reden waarom overdracht naar de GPU sneller gaat nadat het CPU-geheugen is vastgepind (page-locked), is juist?

Vergelijkingen bij dit onderwerp