GPU-programmeren
Op een GPU met een limiet van 1024 threads per thread block wordt een CUDA-kernel gestart met blockDim.x ingesteld op 2048. Wat gebeurt er in het algemeen?
- ADe GPU splitst het automatisch in twee blocks van elk 1024 threads en voert die uit
- BAlleen de eerste 1024 threads worden uitgevoerd en de rest wordt genegeerd
- CDe startconfiguratie wordt als ongeldig behandeld, zodat de kernel niet wordt uitgevoerd en er een fout wordt teruggegeven
Antwoord en toelichting tonen
Antwoord: C. De startconfiguratie wordt als ongeldig behandeld, zodat de kernel niet wordt uitgevoerd en er een fout wordt teruggegeven
Alle threads van een thread block moeten tegelijk op één SM staan en moeten via shared memory en __syncthreads() kunnen samenwerken, dus het aantal threads per block is begrensd. Wordt een kernel gestart met een configuratie boven de limiet, dan wordt er geen enkele thread uitgevoerd en mislukt de start met een fout die op een ongeldige configuratie wijst. Het starten van een kernel geeft geen waarde terug, dus zonder de fout te controleren met cudaGetLastError() of iets vergelijkbaars valt het gemakkelijk niet op dat de array met de resultaten nooit is bijgewerkt. Werk voor 2048 threads wordt verdeeld over meerdere blocks van 1024 threads of minder.