GPU-programmeren
Leer met meerkeuzevragen de principes van GPU-programmeren, zoals de hiërarchie van threads, blokken en warps, gedeeld geheugen, gecoalesceerde geheugentoegang, divergentie binnen een warp en occupancy.
GPU-programmeren: kernpunten
Een GPU is een processor die uitblinkt in het gelijktijdig uitvoeren van duizenden tot tienduizenden threads en dezelfde bewerking op grote hoeveelheden gegevens toepast. Een programma drukt parallellisme uit in een hiërarchie van grid, blokken en threads, en de hardware voert groepen van ongeveer 32 threads, warps, met dezelfde instructie uit.
Voor goede prestaties zijn gecoalesceerde geheugentoegang, waarbij naburige threads naburige adressen lezen, on-chip gedeeld geheugen binnen een blok, het vermijden van divergentie binnen een warp en voldoende occupancy om geheugenlatentie te verbergen belangrijk. De nadruk ligt op principes die niet afhangen van de productgeneratie.
Alle vragen over GPU-programmeren (50)
- Welke uitspraak over het verschil in ontwerpfilosofie tussen CPU en GPU is juist?
- Welk kenmerk van werk dat op een GPU snel kan worden verwerkt is het meest passend?
- Welke bewerking wordt op een GPU waarschijnlijk inefficiënt uitgevoerd?
- Welke uitspraak over wat in GPU-programmering zoals CUDA een 'kernel' wordt genoemd, is juist?
- Welke combinatie van de hiërarchie van CUDA-threads is juist (van groot naar klein)?
- In een CUDA-kernel wordt met bovenstaande formule het nummer i van elke thread bepaald. Wat is i voor de thread met blockIdx.x=2, blockDim.x=256 en threadIdx.x=5?
- Een array van 1000 elementen moet worden verwerkt met 256 threads per block en één element per thread. Welk aantal blocks dat moet worden gestart is juist?
- Waarom wordt in de bovenstaande CUDA-kernel 'if (i < n)' opgenomen?
- Hoe heet bij NVIDIA-GPU's de eenheid waarin 32 threads tot één bundel worden gevormd die dezelfde instructie tegelijk uitvoert?
- Welke uitspraak over het verschil tussen de SIMT-methode (single instruction, multiple threads) van de GPU en SIMD-instructies van de CPU is juist?
- Binnen één warp splitst een voorwaardelijke sprong de helft van de threads naar de if-zijde en de rest naar de else-zijde (warp divergence). Hoe wordt dit over het algemeen uitgevoerd?
- 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)?
- Welke uitspraak over coalesced geheugentoegang bij GPU's is juist?
- 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?
- Welke rangschikking is voordelig voor coalesced geheugentoegang wanneer data van deeltjes met posities x, y en z op een GPU wordt verwerkt?
- Welke uitspraak over de kenmerken van CUDA shared memory is juist?
- Welke uitspraak over de werking van __syncthreads() in CUDA is juist?
- 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?
- Welke uitspraak over bank conflicts van CUDA shared memory is juist?
- 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?
- 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?
- Wat kan er gebeuren in een GPU-kernel als het registergebruik per thread te hoog is?
- Welke uitspraak over de bezettingsgraad (occupancy) van een GPU is juist?
- Welke methode is de belangrijkste waarmee een GPU lange geheugenlatentie (enkele honderden klokcycli) verbergt?
- Welke uitspraak over de occupancy van een GPU is juist?
- Welke uitspraak over de relatie tussen blocks en SM's (streaming multiprocessors) in CUDA is juist?
- 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?
- 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?
- 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)?
- Hoeveel stappen zijn nodig om 1024 waarden met een reductie in boomvorm te sommeren?
- 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?
- 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?
- Welke reden waarom overdracht naar de GPU sneller gaat nadat het CPU-geheugen is vastgepind (page-locked), is juist?
- Wat is het belangrijkste doel van het gebruik van meerdere CUDA-streams?
- Een programma dat duizenden keren achter elkaar zeer kleine kernels start is traag. Welke verbetermethode is het meest passend?
- Welke uitspraak over CUDA unified memory is juist?
- Wat bepaalt hoofdzakelijk de prestaties wanneer op een GPU twee grote arrays elementgewijs worden opgeteld (c[i] = a[i] + b[i])?
- Wat is de meest passende reden waarom bij veel GPU's voor consumentengames de rekenprestatie in dubbele precisie (FP64) veel lager is dan in enkele precisie (FP32) (bijvoorbeeld tientallen keren)?
- Welke uitspraak over de kenmerken van de tensor cores (matrixrekeneenheden) van recente GPU's is juist?
- Waarom wordt bij gemengde precisie op een GPU vaak de vermenigvuldiging in lage precisie zoals FP16 uitgevoerd en de sommatie (accumulatie) in FP32?
- Bij het berekenen van de som van drijvende-kommagetallen van dezelfde data op een GPU week het laatste cijfer van het resultaat bij elke uitvoering lichtjes af. Wat is de meest waarschijnlijke oorzaak?
- Welke algemene richtlijn voor het bepalen van het aantal threads per block in CUDA is juist?
- Welk voordeel van het schrijven van een kernel met een lus zoals hierboven (grid-stride loop) is juist?
- Bij welke toegang werkt CUDA constant memory bijzonder snel?
- Welke uitspraak is juist over een kenmerk van GPU-caches in vergelijking met CPU's?
- Welk voorbeeld van een programmeermechanisme voor parallelle berekeningen op GPU's e.d., dat ook voor andere GPU's dan die van NVIDIA kan worden gebruikt, is juist?
- Op een GPU wil men alleen de elementen die aan een voorwaarde voldoen uit een array halen en in een andere array compact wegschrijven (elke thread levert 0 of 1 uitvoer). Welke parallelle berekening wordt veel gebruikt om het schrijfadres van elke thread te bepalen?
- Welke uitspraak over een uitgangspunt dat bij het schrijven van GPU-kernels moet worden aangehouden, is juist?
- Wat is het belangrijkste doel van het laten lopen via shared memory bij het transponeren van een grote matrix op een GPU (b[j][i] = a[i][j])?
- Welke uitspraak is in het algemeen juist over wat er in CUDA gebeurt direct nadat het programma aan de CPU-zijde een kernel start?
Vergelijkingen bij dit onderwerp
Andere onderwerpen in Computersystemen
- Computerarithmetiek
- Instructieset en assembly
- Compilers
- Linker, loader en uitvoerbare formaten
- Besturingssysteem en hardware
- Geheugenhiërarchie en prestaties
- Multicore en synchronisatie
- AI-hardware en softwarestack
- Embedded systemen en firmware
- Hardwarebeschrijvingstalen en verificatie
- Interfaces en busstandaarden
- Prestatiemeting en profiling
- Hardwarebeveiliging
- Energiebeheer (softwaregestuurd)