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];
  1. ALa boucle empêche l'accès mémoire coalescé
  2. 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
  3. 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é.

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

Autres questions sur Programmation GPU

  1. Pour quel type d'accès la mémoire constante de CUDA est-elle particulièrement rapide ?
  2. Quelle est la caractéristique générale des caches GPU par rapport à ceux des CPU ?
  3. Quel est un exemple de mécanisme de programmation pour le calcul parallèle sur GPU et autres, utilisable aussi sur des GPU autres que NVIDIA ?
  4. Sur GPU, on veut extraire d'un tableau les seuls éléments satisfaisant une condition et les écrire de façon compacte dans un autre tableau (chaque thread produit 0 ou 1 sortie). Quel calcul parallèle est couramment utilisé pour déterminer l'adresse d'écriture de chaque thread ?
  5. Quelle hypothèse faut-il respecter lors de l'écriture d'un noyau GPU ?

Comparatifs sur ce thème