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];
}
  1. AZodat overtollige threads niet buiten het bereik van de array lezen of schrijven wanneer het totale aantal threads groter is dan het aantal elementen
  2. BZodat het resultaat van de optelling n niet overschrijdt
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over GPU-programmeren

  1. Hoe heet bij NVIDIA-GPU's de eenheid waarin 32 threads tot één bundel worden gevormd die dezelfde instructie tegelijk uitvoert?
  2. Welke uitspraak over het verschil tussen de SIMT-methode (single instruction, multiple threads) van de GPU en SIMD-instructies van de CPU is juist?
  3. 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?
  4. 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)?
  5. Welke uitspraak over coalesced geheugentoegang bij GPU's is juist?

Vergelijkingen bij dit onderwerp