Cache L1 vs L2 vs L3 : capacité, latence, partage, inclusion

Les caches L1, L2 et L3 forment une hiérarchie à plusieurs niveaux, rangés par distance au cœur du CPU : plus un niveau est proche, plus il est petit et rapide ; plus il est éloigné, plus il est grand et lent. Dans les CPU de PC et de serveur typiques, le L1 fait quelques dizaines de Ko pour quelques cycles, le L2 quelques centaines de Ko à quelques Mo pour une dizaine à une vingtaine de cycles, et le L3 quelques Mo à quelques dizaines de Mo pour quelques dizaines de cycles. Le L1 et le L2 sont le plus souvent propres à chaque cœur, tandis que le L3 est partagé entre plusieurs cœurs. Un accès à la mémoire principale en DRAM coûte des centaines de cycles : cette hiérarchie doit donc absorber le plus grand nombre d’accès possible.

CritèreCache L1Cache L2Cache L3
Rapport au cœurPropre à chaque cœurLe plus souvent propre à chaque cœur. Certaines conceptions le partagent entre quelques cœursPartagé par plusieurs cœurs (toute la puce ou un groupe de cœurs)
Capacité (plage typique pour les CPU de PC et de serveur)Environ 32 à 64 Ko chacun pour les instructions et pour les donnéesEnviron 256 Ko à quelques Mo par cœurQuelques Mo à quelques dizaines de Mo pour toute la puce
Latence (plage typique)Environ 3 à 5 cyclesEnviron 10 à 20 cyclesEnviron 30 à 70 cycles. Plus longue pour les parties éloignées du cœur
Instructions et donnéesSéparées (cache I et cache D)Communes (cache unifié)Communes (cache unifié)
Priorité de conceptionUn temps de succès court. Il est utilisé à chaque cycle dans le pipelineAbsorber les défauts du L1 et réduire la pénalité de défautRéduire les accès à la mémoire principale et partager les données entre cœurs
Destination en cas de défautL2L3Mémoire principale (DRAM)
AdressageSouvent indexé virtuellement, étiqueté physiquement (VIPT)Adresses physiquesAdresses physiques
InclusionNiveau le plus haut. Sa présence dans les niveaux inférieurs dépend de la politique de ces derniersSelon la conception, par exemple inclusive ou non inclusiveUn L3 inclusif facilite le filtrage des vérifications de cohérence. Il existe aussi des conceptions exclusives, sans doublons, et non inclusives
Emplacement physiqueDans le cœur, juste à côté des unités d’exécutionJuste à l’extérieur du cœur, placé comme partie du cœurSouvent divisé en tranches par cœur reliées par un anneau ou un maillage
Taille de ligneGénéralement 64 octetsGénéralement 64 octetsGénéralement 64 octets

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Cache L1
Le cache le plus proche, utilisé à chaque lecture d’instruction et à chaque chargement ou rangement. Il est le plus efficace lorsque les données fréquemment utilisées sont regroupées dans une petite zone et que la localité temporelle est élevée.
Cache L2
Absorbe les données de travail qui ne tiennent pas dans le L1. Les techniques comme le découpage de boucles (loop blocking), qui ramènent les données de travail à quelques centaines de Ko ou quelques Mo, y sont particulièrement efficaces.
Cache L3
Efficace lorsque plusieurs cœurs partagent des données ou lorsque de grandes données ne tiennent pas dans les caches par cœur. Comme sa capacité est disputée avec les autres cœurs, il subit l’influence des programmes exécutés en même temps.

Questions fréquentes

Pourquoi ne pas agrandir le cache L1 ?

Une plus grande capacité allonge la matrice de cellules et le câblage, ce qui augmente le temps de succès. Le L1 est utilisé à chaque cycle dans le pipeline, si bien qu’un seul cycle de retard pèse lourdement sur les performances. On limite donc le L1 à quelques dizaines de Ko et l’on obtient la grande capacité avec le L2 et le L3. En VIPT, la capacité est en outre limitée par la relation entre taille de page et associativité.

Pourquoi seule le L1 est-elle séparée en cache d’instructions et cache de données ?

Dans un pipeline, une instruction est lue à chaque cycle pendant qu’une autre instruction lit ou écrit des données. Séparer les caches permet d’effectuer les deux accès simultanément et d’adapter chaque cache à son usage. À partir du L2, les accès sont moins fréquents : on préfère généralement un cache unifié, dont la capacité se répartit plus souplement.

Inclusif ou exclusif : lequel est le meilleur ?

Chacun a ses avantages et ses inconvénients. En mode inclusif, le contenu des niveaux supérieurs figure toujours aussi dans le niveau inférieur, si bien que les requêtes des autres cœurs peuvent être tranchées en consultant seulement ce dernier, mais les doublons réduisent la capacité effective. Le mode exclusif évite les doublons et exploite pleinement la capacité totale, mais le déplacement des lignes et la gestion de la cohérence sont plus complexes. Le choix dépend du nombre de cœurs et de la taille des caches.

Les capacités et les nombres de cycles du tableau valent-ils pour tous les CPU ?

Non, ce sont des plages typiques pour les CPU de PC et de serveur. Elles varient selon la génération de conception, la fréquence d’horloge, le nombre de cœurs et l’organisation de la puce. Beaucoup de microcontrôleurs embarqués n’ont ni L2 ni L3 ; à l’inverse, certains CPU empilent une puce de cache pour agrandir le L3. Les valeurs réelles se vérifient avec les compteurs de performance ou des programmes de mesure de la latence mémoire.

Vérifier vos connaissances

Dans un ordinateur courant, quelle hiérarchie mémoire classée du plus rapide au plus lent est correcte ?

  1. ASSD → mémoire principale → cache L2 → cache L1 → registres
  2. BMémoire principale → registres → SSD → cache L1
  3. CRegistres → cache L1 → cache L2 → mémoire principale (DRAM) → SSD
Afficher la réponse et l'explication

Réponse : C. Registres → cache L1 → cache L2 → mémoire principale (DRAM) → SSD

Plus une mémoire est proche du processeur, plus elle est rapide et petite ; plus elle est éloignée, plus elle est lente, grande et bon marché. Ordres de grandeur : registres moins d'un cycle, L1 environ 1 ns (quelques dizaines de KB), L2 quelques ns (quelques MB), L3 une dizaine de ns (quelques dizaines de MB), DRAM environ 100 ns (quelques dizaines de GB), SSD quelques dizaines à 100 µs (quelques TB). Placer les données fréquentes dans les niveaux rapides permet d'obtenir globalement une mémoire rapide et de grande capacité à faible coût.

Quel est le principal avantage d’un cache L1 séparé en cache d’instructions (cache I) et cache de données (cache D) ?

  1. ALes instructions et les données placées à la même adresse n’entrent plus en conflit, et la capacité semble doublée
  2. BLa lecture des instructions et la lecture/écriture des données peuvent avoir lieu en parallèle dans le même cycle d’horloge
  3. CLes instructions n’étant pas modifiées, le cache D peut être supprimé
Afficher la réponse et l'explication

Réponse : B. La lecture des instructions et la lecture/écriture des données peuvent avoir lieu en parallèle dans le même cycle d’horloge

Dans un pipeline, une instruction est lue à chaque cycle pendant qu’une autre lit ou écrit des données. Séparer le L1 en caches d’instructions et de données permet d’effectuer les deux accès en parallèle sans se disputer un port unique, et d’adapter la configuration de chacun à ses caractéristiques. La capacité n’est pas doublée : la capacité totale est partagée. Les lectures et écritures de données étant toujours nécessaires, le cache D ne peut pas être supprimé. À partir du L2, instructions et données sont généralement partagées.

Dans un cache multiniveau où un cache L2 est placé sous le cache L1, quel est le rôle principal du cache L2 ?

  1. AÉliminer les défauts L1 grâce à un temps de succès plus court que celui du L1
  2. BRéduire la pénalité de défaut du L1, en étant plus grand mais plus lent que le L1
  3. CConserver en permanence toutes les données du programme à la place de la mémoire principale
Afficher la réponse et l'explication

Réponse : B. Réduire la pénalité de défaut du L1, en étant plus grand mais plus lent que le L1

Le L1 est conçu petit pour privilégier la vitesse, si bien que des défauts surviennent dans une certaine mesure. Le L2, plus grand que le L1, a un temps de succès plus long mais reste bien plus rapide que la mémoire principale ; il absorbe une grande partie des accès en défaut dans le L1 et réduit la pénalité de défaut du L1 par rapport à un accès en mémoire principale. Il n’est pas plus rapide que le L1 et ne peut pas éliminer les défauts L1. Sa capacité, bien inférieure à celle de la mémoire principale, ne permet pas de conserver toutes les données.

  1. Quelle est la caractéristique d’un schéma inclusif, dans lequel le cache inférieur (L2, etc.) contient tout le contenu du cache supérieur (L1) ?
  2. Comment évolue en général le temps de succès lorsque la capacité du cache augmente ? Quelle réponse est correcte, raison comprise ?
  3. Avec un temps de succès L1 de 1 ns, un taux de défauts L1 de 5%, un temps de succès L2 de 10 ns, un taux de défauts local L2 de 20% et un temps d’accès à la mémoire principale de 100 ns, quel est le temps moyen d’accès mémoire ?

Questions d'entraînement sur Hiérarchie mémoire

Termes clés expliqués

Mémoire cache
Mémoire rapide de faible capacité placée près du CPU. Elle conserve les données fréquemment utilisées pour compenser l'écart de vitesse avec la mémoire principale. Réalisée principalement en SRAM.
Temps d'accès mémoire moyen (AMAT)
Durée moyenne d'un accès mémoire, calculée par temps de succès + taux de défauts × pénalité de défaut. Indicateur de base pour comparer les performances des caches.
Pénalité de défaut (miss penalty)
Temps supplémentaire nécessaire, lors d'un défaut de cache, pour aller chercher la donnée au niveau inférieur. Il dépend du temps d'accès du niveau inférieur et du temps de transfert de la ligne.
Cohérence de cache
Mécanisme qui maintient la cohérence du contenu lorsque les caches de plusieurs cœurs d'un CPU multicœur contiennent des données de même adresse. Lorsqu'un cœur écrit, les anciennes copies des autres cœurs sont par exemple invalidées.
Localité temporelle
Propriété selon laquelle une donnée ou une instruction déjà accédée a de fortes chances d'être de nouveau accédée prochainement. Les variables réutilisées dans une boucle en sont un exemple ; c'est l'une des raisons de l'efficacité des caches.

Comparatifs associés