GPU-programmeren
Waarom wordt in de bovenstaande CUDA-kernel 'if (i < n)' opgenomen?
__global__ void add(float *c, const float *a,
const float *b, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
c[i] = a[i] + b[i];
}
- AZodat overtollige threads niet buiten het bereik van de array lezen of schrijven wanneer het totale aantal threads groter is dan het aantal elementen
- BZodat het resultaat van de optelling n niet overschrijdt
- COm de GPU twee keer zo snel te maken
Antwoord en toelichting tonen
Antwoord: A. Zodat overtollige threads niet buiten het bereik van de array lezen of schrijven wanneer het totale aantal threads groter is dan het aantal elementen
Threads worden per block gestart, dus als het aantal elementen geen veelvoud van de blockgrootte is, is het totale aantal threads groter dan het aantal elementen. Als zonder controle van het nummer wordt geschreven, kan geheugen buiten de gereserveerde array worden beschadigd of treedt door een ongeldige toegang een fout op. De controle 'i < n' is vrijwel een vaste vorm bij het schrijven van GPU-kernels.