Hiérarchie mémoire
Parcourir le tableau à deux dimensions a[i][j] du langage C avec j dans la boucle interne, comme ci-dessus, est généralement plus rapide qu’avec i dans la boucle interne. Pour quelle raison ?
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
sum += a[i][j];
- ALe stockage étant en ordre ligne par ligne, des adresses contiguës sont lues successivement et les lignes de cache sont exploitées efficacement
- BLe compilateur supprime en bloc les additions de la boucle et omet le calcul lui-même à l’exécution
- CAvec j dans la boucle interne, le TLB n’est plus du tout consulté et la traduction d’adresse virtuelle en adresse physique devient inutile
Afficher la réponse et l'explication
Réponse : A. Le stockage étant en ordre ligne par ligne, des adresses contiguës sont lues successivement et les lignes de cache sont exploitées efficacement
Un tableau à deux dimensions en C est stocké ligne par ligne (row-major) : a[i][0], a[i][1]… sont adjacents en mémoire. Avec j dans la boucle interne, les adresses contiguës sont lues dans l’ordre, si bien que le reste de la ligne de cache de 64 octets chargée lors d’un défaut est utilisé immédiatement. Avec i dans la boucle interne, la lecture saute d’une ligne entière à chaque accès, et la ligne de cache tend à être évincée alors qu’une infime partie seulement a été utilisée. Le TLB reste sollicité ; la traduction d’adresse n’est pas supprimée.