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 ?
- AConserver le tableau en 32×32 et lire dans un ordre aléatoire
- BRenoncer à la mémoire partagée et tout lire depuis la mémoire globale
- 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.