Programmation GPU

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 ?

  1. ALes deux branches sont exécutées simultanément, la vitesse est inchangée
  2. BLes threads de la branche else ne sont pas exécutés et sont abandonnés
  3. CLes branches if et else sont exécutées successivement, les threads non concernés restant inactifs pendant chacune, ce qui réduit l'efficacité
Afficher la réponse et l'explication

Réponse : C. Les branches if et else sont exécutées successivement, les threads non concernés restant inactifs pendant chacune, ce qui réduit l'efficacité

Les 32 threads d'un warp exécutant la même instruction, en cas de divergence, les instructions de la branche if sont d'abord exécutées avec seuls les threads concernés actifs, puis la branche else avec les threads restants. Le résultat est correct, mais pendant chaque phase la moitié des threads ne fait rien, et le temps est la somme des deux chemins. Organiser les données et les threads pour que les branchements soient uniformes au sein d'un warp améliore l'efficacité.

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

Autres questions sur Programmation GPU

  1. 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) ?
  2. Quelle est la définition de l'accès mémoire coalescé (coalescing) sur GPU ?
  3. Avec i l'indice de chaque thread, lire le tableau tous les 32 éléments comme ci-dessus est plus lent que lire a[i]. Quelle en est la raison principale ?
  4. Pour traiter sur GPU des données de particules ayant des positions x, y et z, quelle disposition est avantageuse du point de vue de l'accès mémoire coalescé ?
  5. Quelle est la caractéristique de la mémoire partagée (shared memory) en CUDA ?

Comparatifs sur ce thème