GPU-programmeren
Welk voordeel van het schrijven van een kernel met een lus zoals hierboven (grid-stride loop) is juist?
for (int i = blockIdx.x * blockDim.x + threadIdx.x;
i < n;
i += blockDim.x * gridDim.x)
y[i] = a * x[i] + y[i];
- ABij gebruik van een lus is de toegang niet meer coalesced
- BOok als er minder threads worden gestart dan er elementen zijn, verwerkt elke thread meerdere elementen met een tussenruimte van het totale aantal threads en kunnen alle elementen worden behandeld
- CEr draait nog maar één thread
Antwoord en toelichting tonen
Antwoord: B. Ook als er minder threads worden gestart dan er elementen zijn, verwerkt elke thread meerdere elementen met een tussenruimte van het totale aantal threads en kunnen alle elementen worden behandeld
Omdat telkens met het totale aantal threads (blockDim.x×gridDim.x) wordt doorgeteld, worden ongeacht het aantal threads alle elementen zonder uitzondering verwerkt. Er kan met een redelijk aantal blocks worden gestart dat past bij het aantal SM's van de GPU, en ook de moeite van het aanmaken van threads neemt af. In elke ronde van de lus behandelen naburige threads naburige elementen, dus coalesced toegang blijft behouden.