Programmation GPU

Avec i l'indice de chaque thread, lire le tableau tous les 32 éléments comme ci-dessus est plus lent que lire a[i]. Quelle en est la raison principale ?

float x = a[i * 32];
  1. ALes adresses de threads voisins étant distantes de 128 octets, l'accès n'est pas coalescé et chaque thread lit un bloc mémoire différent
  2. BLa multiplication prend du temps
  3. CLire tous les 32 éléments empêche de lire correctement les valeurs
Afficher la réponse et l'explication

Réponse : A. Les adresses de threads voisins étant distantes de 128 octets, l'accès n'est pas coalescé et chaque thread lit un bloc mémoire différent

Un float occupant 4 octets, avec a[i*32] les adresses de threads voisins sont distantes de 128 octets. Les 32 threads du warp lisent 32 blocs distincts et n'utilisent que 4 octets de chacun. Avec a[i], les 32 threads se contentent d'un seul bloc de 128 octets ; la quantité de données transférée diffère de plusieurs dizaines de fois. Pour un tableau 2D, on fait en principe correspondre l'indice de thread à l'indice intérieur (adresses contiguës).

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

Autres questions sur Programmation GPU

  1. Pour traiter sur GPU des données de particules ayant des positions x, y et z, quelle disposition est avantageuse du point de vue de l'accès mémoire coalescé ?
  2. Quelle est la caractéristique de la mémoire partagée (shared memory) en CUDA ?
  3. Quel est le rôle de __syncthreads() en CUDA ?
  4. En CUDA, __syncthreads() est placé dans « if (threadIdx.x < 16) », de sorte que seuls certains threads le franchissent. Que peut-il se produire ?
  5. Quelle est la définition des conflits de banc (bank conflicts) de la mémoire partagée CUDA ?

Comparatifs sur ce thème