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];
}
- 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
- BPour que le résultat de l'addition ne dépasse pas n
- 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.