Programmation GPU

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 ?

  1. AConserver le tableau en 32×32 et lire dans un ordre aléatoire
  2. BRenoncer à la mémoire partagée et tout lire depuis la mémoire globale
  3. CAllouer le tableau en 32×33 avec une colonne supplémentaire, afin de décaler la position des bancs à chaque ligne
Afficher la réponse et l'explication

Réponse : C. Allouer le tableau en 32×33 avec une colonne supplémentaire, afin de décaler la position des bancs à chaque ligne

Avec 32 float (128 octets) par ligne, chaque ligne commence au même banc ; les éléments d'une même colonne tombent donc tous dans le même banc, et une lecture verticale concentre les 32 threads sur un seul banc. Avec 33 éléments par ligne, le banc se décale d'une unité à chaque ligne, et les 32 éléments d'une colonne se répartissent sur des bancs tous différents, lisibles en un seul accès. Il suffit d'ajouter la mémoire d'une colonne inutilisée.

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

Autres questions sur Programmation GPU

  1. 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 ?
  2. Que peut-il se produire si un noyau GPU utilise trop de registres par thread ?
  3. Quelle est la définition de l'occupation (occupancy) d'un GPU ?
  4. Quelle est la principale méthode par laquelle le GPU masque la longue latence mémoire (plusieurs centaines de cycles) ?
  5. Quel énoncé est correct au sujet de l'occupation d'un GPU ?

Comparatifs sur ce thème