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 ?
- AAppeler __syncthreads()
- BScinder le noyau en deux à cet endroit et lancer le second une fois le premier terminé
- 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.