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?
- AStoppen met atomicAdd en met gewone optelling naar global memory schrijven
- BDe bins samenvoegen tot één bin
- 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.