Programmation GPU
Quel est l'avantage d'écrire un noyau avec une boucle comme ci-dessus (boucle à pas de grille, grid-stride loop) ?
for (int i = blockIdx.x * blockDim.x + threadIdx.x;
i < n;
i += blockDim.x * gridDim.x)
y[i] = a * x[i] + y[i];
- ALa boucle empêche l'accès mémoire coalescé
- BMême si le nombre de threads lancés est inférieur au nombre d'éléments, chaque thread traite plusieurs éléments espacés du nombre total de threads, et tous les éléments sont couverts
- CUn seul thread s'exécute
Afficher la réponse et l'explication
Réponse : B. Même si le nombre de threads lancés est inférieur au nombre d'éléments, chaque thread traite plusieurs éléments espacés du nombre total de threads, et tous les éléments sont couverts
La boucle avançant l'indice du nombre total de threads (blockDim.x×gridDim.x), tous les éléments sont traités sans omission quel que soit le nombre de threads. On peut lancer un nombre de blocs adapté au nombre de SM du GPU, et le coût de création des threads diminue. À chaque itération, des threads voisins traitent des éléments voisins, ce qui préserve l'accès mémoire coalescé.