Programmation GPU

En CUDA, __syncthreads() est placé dans « if (threadIdx.x < 16) », de sorte que seuls certains threads le franchissent. Que peut-il se produire ?

  1. ALa synchronisation se fait entre les 16 threads seulement et le programme fonctionne correctement
  2. BLes autres threads n'arrivant jamais, le bloc peut se bloquer ou le résultat devenir indéterminé
  3. C__syncthreads() est automatiquement ignoré et rien ne se passe
Afficher la réponse et l'explication

Réponse : B. Les autres threads n'arrivant jamais, le bloc peut se bloquer ou le résultat devenir indéterminé

__syncthreads() attendant l'arrivée de tous les threads du bloc, le placer dans une branche que seuls certains threads franchissent revient à attendre des threads qui ne viendront jamais. Le comportement n'est pas défini par la spécification ; en pratique, le bloc peut se bloquer ou, s'il fonctionne par hasard, produire des résultats erronés. En principe, la synchronisation s'écrit hors des branchements, à un endroit que tous les threads franchissent obligatoirement.

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

Autres questions sur Programmation GPU

  1. Quelle est la définition des conflits de banc (bank conflicts) de la mémoire partagée CUDA ?
  2. Un tableau de 32×32 float est placé en mémoire partagée ; sa lecture par colonne (verticalement) par les 32 threads d'un warp provoque des conflits de banc. Quelle contre-mesure est couramment utilisée ?
  3. Lors du calcul d'un produit de grandes matrices sur GPU, pourquoi découpe-t-on les matrices en petites tuiles chargées en mémoire partagée ?
  4. Que peut-il se produire si un noyau GPU utilise trop de registres par thread ?
  5. Quelle est la définition de l'occupation (occupancy) d'un GPU ?

Comparatifs sur ce thème