Programmation GPU

Pourquoi le noyau CUDA ci-dessus contient-il « if (i < n) » ?

__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. APour que, lorsque le nombre total de threads dépasse le nombre d'éléments, les threads excédentaires ne lisent ni n'écrivent hors des limites du tableau
  2. BPour que le résultat de l'addition ne dépasse pas n
  3. CPour doubler la vitesse du GPU
Afficher la réponse et l'explication

Réponse : A. Pour que, lorsque le nombre total de threads dépasse le nombre d'éléments, les threads excédentaires ne lisent ni n'écrivent hors des limites du tableau

Les threads étant lancés par blocs, si le nombre d'éléments n'est pas un multiple de la taille de bloc, le nombre total de threads dépasse celui des éléments. Écrire sans vérifier l'indice risque de corrompre la mémoire hors du tableau alloué ou de provoquer une erreur d'accès illégal. La vérification « i < n » est une forme quasi systématique dans l'écriture des noyaux GPU.

S'entraîner sur ce thème Retour au thème

Autres questions sur Programmation GPU

  1. Comment appelle-t-on, sur les GPU NVIDIA, l'unité regroupant 32 threads qui exécutent simultanément la même instruction ?
  2. Quelle est la différence entre le mode SIMT (instruction unique, threads multiples) des GPU et les instructions SIMD des CPU ?
  3. Dans un warp, un branchement conditionnel envoie la moitié des threads dans la branche if et l'autre moitié dans la branche else (divergence de warp). Comment l'exécution se déroule-t-elle généralement ?
  4. Les codes (1) et (2) ci-dessus font tous deux exécuter A à la moitié des threads et B à l'autre moitié. Quelle explication est correcte du point de vue de l'efficacité des warps (32 threads par warp) ?
  5. Quelle est la définition de l'accès mémoire coalescé (coalescing) sur GPU ?

Comparatifs sur ce thème