Programmation GPU

Dans un noyau CUDA, l'indice i de chaque thread est obtenu par l'expression ci-dessus. Que vaut i pour le thread tel que blockIdx.x=2, blockDim.x=256 et threadIdx.x=5 ?

int i = blockIdx.x * blockDim.x + threadIdx.x;
  1. A517
  2. B263
  3. C2565
Afficher la réponse et l'explication

Réponse : A. 517

blockIdx.x est l'indice du bloc dans la grille, blockDim.x le nombre de threads par bloc et threadIdx.x l'indice du thread dans le bloc. Le bloc 0 traite 0 à 255 et le bloc 1 256 à 511 ; le thread 5 du bloc 2 a donc l'indice 2×256+5=517. Cette expression attribue à tous les threads un numéro global sans recouvrement, qui détermine l'élément du tableau dont chacun est chargé.

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

Autres questions sur Programmation GPU

  1. On veut traiter un tableau de 1000 éléments à raison d'un élément par thread, avec 256 threads par bloc. Combien de blocs faut-il lancer ?
  2. Pourquoi le noyau CUDA ci-dessus contient-il « if (i < n) » ?
  3. Comment appelle-t-on, sur les GPU NVIDIA, l'unité regroupant 32 threads qui exécutent simultanément la même instruction ?
  4. Quelle est la différence entre le mode SIMT (instruction unique, threads multiples) des GPU et les instructions SIMD des CPU ?
  5. 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 ?

Comparatifs sur ce thème