Hiérarchie mémoire

Pourquoi le parcours de la liste chaînée ci-dessus est-il généralement bien plus lent que la lecture séquentielle d’un tableau comportant le même nombre d’éléments ?

struct node { int val; struct node *next; };
for (p = head; p != NULL; p = p->next)
    sum += p->val;
  1. AL’adresse de l’élément suivant n’est connue qu’après lecture de l’élément courant, et les défauts surviennent un par un, en série
  2. BLes éléments d’une liste chaînée ne peuvent en aucun cas être placés dans le cache
  3. CDans un traitement à base de pointeurs, la prédiction de branchement du CPU échoue systématiquement
Afficher la réponse et l'explication

Réponse : A. L’adresse de l’élément suivant n’est connue qu’après lecture de l’élément courant, et les défauts surviennent un par un, en série

Dans une liste chaînée, l’adresse de l’élément suivant n’est connue qu’après lecture de p->next. Si les éléments sont dispersés en mémoire, chaque accès provoque un défaut ; comme l’adresse suivante est inconnue, plusieurs défauts ne peuvent pas se recouvrir, et la latence de la mémoire principale s’accumule intégralement à chaque élément. Avec un tableau, l’adresse suivante se calcule, ce qui permet le préchargement et le recouvrement des défauts. Les éléments d’une liste chaînée entrent aussi dans le cache, et le branchement de boucle, facile à prédire, n’échoue pas systématiquement.

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

Autres questions sur Hiérarchie mémoire

  1. Chaque défaut lit une ligne de 64 octets et la latence de la mémoire principale est de 100 ns ; si un seul défaut peut être traité à la fois, la bande passante de lecture plafonne à environ 0.64 GB/s. Si 10 défauts peuvent être traités simultanément, quelle est approximativement la bande passante ? (aucune autre contrainte)
  2. Pour écrire de gros volumes de données qui ne seront pas relus avant longtemps, quel est le principal avantage des écritures qui contournent le cache (écritures non temporelles) ?
  3. Si le taux de succès du cache est de 95%, quel est le taux de défauts ?
  4. Quelle technique, lors du chargement depuis la mémoire principale d’une ligne en défaut, envoie d’abord le mot requis par le CPU puis le reste de la ligne ?
  5. Pourquoi la fusion des deux boucles ci-dessus en une seule (fusion de boucles) accélère-t-elle généralement le traitement lorsque N est grand ?

Comparatifs sur ce thème