Programmation GPU

En CUDA, on veut, au milieu d'un noyau, attendre que tous les autres blocs aient terminé leur calcul avant de passer à l'étape suivante. Quelle est la méthode usuelle ?

  1. AAppeler __syncthreads()
  2. BScinder le noyau en deux à cet endroit et lancer le second une fois le premier terminé
  3. CAttendre dans une boucle un drapeau écrit par les autres blocs
Afficher la réponse et l'explication

Réponse : B. Scinder le noyau en deux à cet endroit et lancer le second une fois le premier terminé

Les blocs s'exécutent indépendamment et dans n'importe quel ordre ; tous ne sont pas forcément chargés simultanément sur le GPU. Si le bloc attendu n'a pas encore commencé, la boucle d'attente du drapeau ne se termine jamais. On réalise donc généralement la synchronisation globale en scindant le noyau, en exploitant le fait qu'un noyau lancé dans le même flux (stream) ne commence qu'après la fin du précédent.

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

Autres questions sur Programmation GPU

  1. Pour construire sur GPU l'histogramme des valeurs de pixels, faire ajouter directement par tous les threads via atomicAdd dans les 256 cases en mémoire globale peut être lent. Quelle méthode l'améliore ?
  2. Pour calculer sur GPU la somme d'un grand nombre de valeurs, pourquoi utilise-t-on une réduction en arbre (répétition de l'addition de voisins qui divise par deux le nombre de valeurs) ?
  3. Combien d'étapes faut-il pour sommer 1024 valeurs par une réduction en arbre ?
  4. Dans un programme utilisant un GPU discret, quel énoncé est généralement correct au sujet de la mémoire côté CPU et côté GPU ?
  5. Envoyer des données au GPU pour un traitement léger, comme une seule addition par élément d'un tableau, peut être plus lent qu'un calcul sur CPU. Quelle en est la raison principale ?

Comparatifs sur ce thème