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];
- 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
- BLa multiplication prend du temps
- 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).