Question

Pourquoi la taille du cache L1 inférieure à celle du cache L2 dans la plupart des processeurs?

Était-ce utile?

La solution

Il y a différentes raisons pour cela.

L2 existe dans le système de speedup le cas où il y a un manque de cache L1. Si la taille de L1 était identique ou plus grande que la taille de L2, alors L2 ne pouvait accueillir pour plusieurs lignes de cache que L1, et ne serait pas en mesure de traiter misses cache L1. Du point de vue conception / coût, le cache L1 est lié au processeur et plus rapide que L2. L'idée de caches est que vous accélérez l'accès au matériel plus lent en ajoutant du matériel intermédiaire qui est plus performant (et coûteux) que le plus lent matériel et encore moins cher que le plus rapide du matériel que vous avez. Même si vous avez décidé de doubler le cache L1, vous aussi L2 incrément, à speedup misses L1-cache.

Alors pourquoi est-il cache L2 du tout? Eh bien, le cache L1 est généralement plus performant et coûteux à construire, et il est lié à un seul noyau. Cela signifie que l'augmentation de la taille L1 par une quantité fixe aura que le coût multiplié par 4 dans un processeur à double noyau, ou par 8 dans un noyau de quad. L2 est généralement partagée par différents noyaux --depending sur l'architecture, il peut être partagé entre deux ou tous les cœurs du processeur, de sorte que le coût de l'augmentation L2 serait plus petite même si le prix de L1 et L2 sont les mêmes --which il n'est pas.

Autres conseils

L1 est très étroitement couplé au noyau de CPU, et est accessible à tous les accès à la mémoire (très fréquent). Ainsi, il a besoin de retourner les données très rapidement (généralement dans le cycle d'horloge). Latence et le débit (bande passante) sont à la fois des performances critiques pour le cache de données L1. (Par exemple quatre temps de latence de cycle, et supportant deux lectures et une écriture par le coeur de processeur à chaque cycle d'horloge). Il a besoin de beaucoup de ports de lecture / écriture pour supporter cette bande passante élevée d'accès. Construire une grande cache avec ces propriétés est impossible. Ainsi, les concepteurs gardent petit, par exemple 32KB dans la plupart des processeurs aujourd'hui.

L2 est accessible uniquement sur les ratés L1, de sorte que les accès sont moins fréquents (généralement 1 / 20ème de la L1). Ainsi, L2 peut avoir une latence plus élevée (par exemple de 10 à 20 cycles) et ont moins de ports. Cela permet aux concepteurs de faire plus.


L1 et L2 jouent des rôles très différents. Si L1 est fait plus, il augmente la latence d'accès L1 qui va considérablement réduire les performances, car il fera toutes les charges à charge plus lente et plus difficile pour l'exécution hors pour se cacher. L1 taille est discutable à peine.

Si nous avons supprimé L2, L1 misses devra passer au niveau suivant, par exemple la mémoire. Cela signifie que beaucoup d'accès va aller à la mémoire qui impliqueraient nous avons besoin de plus de bande passante mémoire, ce qui est déjà un goulot d'étranglement. Ainsi, en gardant la L2 est autour favorable.

Les experts se réfèrent souvent à L1 comme un filtre de latence (comme il est le cas commun de L1 frappe plus rapide) et L2 en tant que filtre de bande passante car elle réduit l'utilisation de la bande passante mémoire.

Note: J'ai pris une hiérarchie 2 niveaux cache dans mon argumentation pour le rendre plus simple. Dans un grand nombre de puces multi-cœurs d'aujourd'hui, il y a un cache L3 partagé entre tous les noyaux, tandis que chaque noyau a son propre L1 privé et peut-être L2. Dans ces puces, le cache de dernier niveau partagé (L3) joue le rôle de filtre de bande passante mémoire. L2 joue le rôle de filtre de bande passante sur la puce, à savoir qu'elle réduit l'accès à l'interconnexion sur puce et L3. Cela permet aux concepteurs d'utiliser une interconnexion à large bande passante inférieure comme un anneau, et un seul port lent L3, ce qui leur permet de faire L3 plus.

Peut-être à noter que le nombre de ports est un point de conception très important car il affecte la zone beaucoup plus à puce Les consume cache. Ports ajouter des fils dans le cache qui consomme beaucoup de surface de la puce et de la puissance.

@ réponse de Aater explique certaines des bases . Je vais ajouter quelques détails + un exemple de l'organisation réelle du cache sur Intel Haswell et AMD Piledriver, avec des latences et d'autres propriétés, pas seulement la taille.

Pour quelques détails sur Ivybridge, voir ma réponse sur " Comment peut-cACHE être aussi rapide? ", avec une discussion sur la latence globale charge d'utilisation, y compris le temps de calcul d'adresse, et les largeurs des bus de données entre les différents niveaux de cache.


L1 doit être très rapide (temps de latence et le débit), même si cela signifie un succès à taux limité . L1D doit également soutenir magasins octet sur presque toutes les architectures, et (dans certains modèles) accès non alignés. Cela rend difficile à utiliser ECC (codes de correction d'erreurs) pour protéger les données, et en fait, certains L1d conçoit (Intel), utilisez simplement la parité, avec une meilleure ECC seulement dans les niveaux extérieurs du cache (L2 / L3) où l'ECC peut être fait sur de plus gros morceaux pour moins de frais généraux.

Il est impossible de concevoir un seul niveau de cache qui pourrait fournir la faible latence moyenne de la demande (en moyenne sur tous les Flops) d'un moderne cache multi-niveaux . Les systèmes modernes ont de multiples très affamés cœurs partageant tous une connexion au même temps de latence relativement élevée DRAM, ce qui est essentiel.

Chaque noyau a besoin de sa propre L1 privée pour la vitesse, mais au moins le dernier niveau de cache est généralement partagé, donc un programme multi-thread qui lit les mêmes données à partir de plusieurs threads ne pas aller à DRAM sur chaque noyau. (Et d'agir comme un filet de sécurité pour les données écrites par un noyau et lu par un autre). Cela nécessite au moins deux niveaux de cache pour un système multi-core sain d'esprit, et fait partie de la motivation pour plus de 2 niveaux dans les modèles actuels. Processeurs x86 multicœurs modernes disposent d'un cache de niveau 2 rapide dans chaque noyau, et un cache plus lent plus partagée par tous les cœurs.

L1 taux de succès est encore très important, donc les caches L1 ne sont pas aussi petit / simples / rapides car ils pourraient être, car cela réduirait les taux touchés. La réalisation de la même performance globale nécessiterait donc des niveaux plus élevés de cache pour être plus rapide. Si des niveaux plus élevés gérer plus de trafic, leur temps d'attente est une plus grande composante de la latence moyenne, et ils goulot d'étranglement sur leur débit plus souvent (ou besoin d'un débit plus élevé).

haut débit signifie souvent être capable de gérer plusieurs lectures et écritures chaque cycle, à savoir plusieurs ports. Cela prend plus de zone et la puissance pour la même capacité en tant que cache-bas débit, de sorte que c'est une autre raison de L1 à rester faible.


L1 utilise aussi des tours de vitesse qui ne travaillerait si elle était plus grande . à-dire la plupart des modèles utiliser La quasi-Indexed, Physiquement Tagged (VIPT) L1, mais avec toutes les bits d'index venant d'en bas la page décalée afin qu'ils se comportent comme PIPT (parce que les bits de poids faible d'une adresse virtuelle sont les mêmes que dans l'adresse physique). On évite ainsi synonymes / homonymie (faux résultats ou les mêmes données se trouvant dans le cache deux fois, et voir réponse détaillée de Paul Clayton sur la question liée), mais laisse encore partie du chèque de succès / abordages se produisent en parallèle avec la recherche TLB. Un cache de VIVT ne pas attendre le TLB, mais il doit être invalidée à chaque modification des tables de page.

Sur x86 (qui utilise des pages de mémoire virtuelle 4Kio), 32kiB 8 voies associative caches L1 sont communs dans les conceptions modernes. Les 8 balises peuvent être récupérées sur la base des faibles 12 bits de l'adresse virtuelle, parce que ces bits sont les mêmes dans les adresses virtuelles et physiques (ils sont en dessous de la page offset pour les pages 4Kio). Cette vitesse bidouille pour L1 met en cache ne fonctionne que si elles sont assez petites et assez associative que l'indice ne dépend pas du résultat TLB. 32kiB / lignes 64B / 8 voies associativité = 64 (2 ^ 6) ensembles. Ainsi, les plus bas 6 bits d'une adresse de sélection octets dans une ligne, et les 6 bits suivants index un ensemble de 8 balises. Cet ensemble de 8 balises sont extraites en parallèle avec la TLB recherche, de sorte que les balises peuvent être vérifiées en parallèle contre les bits de sélection physique pages du résultat TLB pour déterminer quel (le cas échéant) des 8 façons de la cale de mettre en cache les données .

Création d'un cache plus grand L1 signifierait qu'il devait soit attendre le résultat TLB avant même de commencer à chercher de balises et de les charger dans les comparateurs parallèles, ou il devrait augmenter à associativité pour maintenir log2 (jeux) + log2 (line_size) <= 12. (plus de moyens de associativité plus de moyens par jeu => ensembles moins au total = moins de bits d'index). Ainsi, par exemple un cache 64 Kio devrait être de 16 manière associative: encore 64 ensembles, mais chaque jeu a deux fois plus de moyens. Cela fait augmenter la taille L1 au-delà de la taille actuelle prohibitif en termes de puissance, et probablement même temps de latence.

Passer plus de votre budget de puissance sur la logique du cache L1D laisserait moins de puissance disponible pour l'exécution hors de l'ordre, le décodage, et bien sûr le cache L2 et ainsi de suite . Obtenir le noyau entier pour fonctionner à 4GHz et maintenir ~ 4 instructions par cycle d'horloge (sur le code de haute ILP) sans fusion nécessite une conception équilibrée. Voir cet article: modernes Microprocesseurs:. A 90 minutes Guide

Plus un cache est, plus vous perdez en le rinçant, de sorte qu'un grand VIVT cache L1 serait pire que le courant VIPT qui usine-comme-PIPT. Et une plus grande mais L1D plus temps d'attente serait probablement pire.

Selon @PaulClayton , L1 caches souvent toutes les chercher données dans un ensemble en parallèle avec les balises, il est donc là, prêt à être sélectionné une fois l'étiquette de droite est détectée. Le coût de l'énergie de faire cette balance avec associativité, donc une grande L1 très associative serait vraiment mauvais pour utiliser de puissance ainsi que meurent zone (et la latence) . (Par rapport à L2 et L3, il ne serait pas beaucoup d'espace, mais la proximité physique est importante pour la latence. Retards de vitesse de propagation de lumière lorsque la matière cycles d'horloge sont 1/4 d'une nanoseconde.)

caches plus lente (comme L3) peut fonctionner à une basse tension / fréquence d'horloge pour faire moins de chaleur. Ils peuvent même utiliser différents agencements de transistors pour chaque cellule de stockage, pour faire mémoire de plus optimisés pour le pouvoir que pour la grande vitesse.

Il y a beaucoup de raisons liées à la consommation d'énergie pour les caches à plusieurs niveaux. Puissance / chaleur est l'une des plus importantes contraintes dans la conception du processeur moderne, car le refroidissement d'une puce minuscule est difficile. Tout est un compromis entre la vitesse et la puissance (et / ou de la zone dé). En outre, de nombreux processeurs sont alimentés par des batteries ou sont en centres de données qui ont besoin de refroidissement supplémentaire.


L1 est presque toujours divisé en instructions séparées et des caches de données. Au lieu d'un port de lecture supplémentaire dans une L1 unifiée à l'appui de code chercher, nous pouvons avoir un cache L1I séparé lié à un I séparé -TLB. (Les processeurs modernes ont souvent une L2-TLB, qui est un second niveau de cache pour les traductions qui est partagée par la L1 I-TLB et D-TLB, pas un TLB utilisé par le cache L2 régulière). Cela donne un total nous cache L1 de 64 Kio, statiquement divisée en caches de code et de données, pour beaucoup cheaper (et probablement latence plus faible) que un monstre 64k L1 cache unifiée avec le même débit total. Comme il est généralement très peu de chevauchement entre le code et les données, c'est une grande victoire.

L1I peut être placé physiquement à proximité de la logique de code de récupération, tandis que L1D peut être physiquement proche des unités de chargement / stockage. retards de vitesse de transmission de la lumière ligne sont un gros problème quand un cycle d'horloge ne dure que 1/3 d'une nanoseconde. Acheminement du câblage est également un gros problème: par exemple Intel Broadwell a 13 couches de cuivre au-dessus du de silicium.

de Split L1 aide beaucoup avec la vitesse, mais unifiée L2 est le meilleur choix. Certaines charges de travail ont très petit code, mais beaucoup de données tactiles. Il est logique que les caches de niveau supérieur à unifiés pour adapter à différentes charges de travail, au lieu de partitionnement statiquement dans le code par rapport aux données. (Par exemple, la quasi-totalité de la L2 seront données en cache, pas de code, lors de l'exécution d'une grande matrice se multiplient, par rapport à avoir beaucoup de code à chaud lors de l'exécution d'un programme C ++ pléthorique, ou même une mise en œuvre efficace d'un algorithme compliqué (par exemple gcc en cours d'exécution) ). Le code peut être copié autour des données, pas toujours juste chargées à partir du disque en mémoire avec DMA.


Caches aussi besoin logique pour suivre les misses en circulation (depuis l'extérieur de commande des moyens d'exécution que de nouvelles demandes peuvent continuer d'être générés avant la première miss est résolu). Avoir beaucoup misses moyens remarquables vous chevauchent la latence des misses, réalisant un débit plus élevé. Duplication la logique et / ou le partitionnement statiquement entre le code et les données en L2 ne serait pas bon.

Grandes caches bas-trafic sont également un bon endroit pour mettre la logique préchargement. préchargement matériel permet une bonne performance pour des choses comme boucle sur un tableau sans chaque morceau de code besoin des instructions logiciel prélecture. (SW prélecture était important pendant un certain temps, mais HW prefetchers sont plus intelligents que ceux utilisés pour être, de sorte que des conseils en sinon Ulrich Drepper excellente Ce que tout programmeur devrait savoir sur la mémoire est hors-date pour de nombreux cas d'utilisation.)

faible trafic caches de niveau supérieur peuvent se permettre le temps d'attente pour faire des choses intelligentes, comme l'utilisation d'une politique de remplacement adaptative au lieu de la LRU habituelle. Intel Ivybridge et les processeurs plus tard le font , pour résister à des modèles d'accès qui obtiennent malheureusement pas de résultats de cache pour un ensemble de travail juste un peu trop volumineux pour tenir dans le cache. (Par exemple en boucle sur certaines données dans la même direction, deux fois il a probablement juste avant expulsés serait réutilisé.)


Un exemple concret: Intel Haswell . Sources: analyse David microarchitecture de Kanter et résultats de tests Agner Fog (microarch pdf) . Voir aussi les manuels d'optimisation d'Intel (liens dans le tag wiki).

En outre, je l'ai écrit une réponse distincte sur: Quelle technique de mappage cache est utilisé dans le processeur Intel core i7?

moderne Intel conçoit l'utilisation d'un grand cache L3 inclusive partagée par tous les noyaux une politique de remplacement adaptatif Ivybridge et plus tard )

Les niveaux inférieurs de cache sont par noyau.

  • L1 : p-core 32kiB chaque instruction et de données (split), 8-way associative. Latence = 4 cycles . Au moins deux ports de lecture + 1 port d'écriture. ( Peut-être encore plus de ports pour gérer le trafic entre L1 et L2 , ou peut-être recevoir une ligne de cache L2 des conflits avec la retraite d'un magasin.) peut suivre 10 misses cache en circulation (10 tampons de remplissage).
  • L2 : 256kiB unifié par-core, 8-way associative. Latence = 11 ou 12 cycles . Lire la bande passante: 64 octets / cycle. La principale logique de préchargement prélecture dans L2. Peut suivre 16 misses en circulation. Peut fournir 64B par cycle au L1I ou L1D. port réel inconnu des comptes.
  • L3 : unifié, partagé (par tous les noyaux) 8MiB (pour un i7 quad-core). Inclus (de tous les caches L2 et L1 par cœur). 12 ou 16 associative façon. Latence = 34 cycles . Agit comme un filet de sécurité pour le cache-cohérence, ainsi modifiées des données partagées ne doivent pas aller à la mémoire principale et le dos.

Un autre exemple concret: AMD Piledriver : (. Par exemple Opteron et les processeurs de bureau FX) Taille du cache en ligne est toujours 64B, comme Intel et AMD ont utilisé depuis plusieurs années. Principalement du texte copié à partir de microarch Agner Fog pdf, avec plus de quelques diapositives informations que je trouve , et plus de détails sur l'écriture à travers L1 + 4k cache d'écriture combinant sur blog Agner, avec un commentaire que seul L1 est WT, pas L2 .

  • L1I : 64 kB, 2 voies, partagé entre une paire de tringles (la version de AMD de SMD a partitionnement plus statique que Hyperthreading, et ils appellent chacun un noyau de chaque paire part un vecteur. / unité FPU et d'autres ressources de pipeline.)
  • L1D : 16 kB, 4 voies, par noyau. Latence = 3-4 c . (Notez que tous les 12 bits ci-dessous la page de décalage sont encore utilisés pour l'index, les travaux habituels trick VIPT.) (Débit: deux opérations par cycle d'horloge, jusqu'à un d'eux étant un magasin). Politique = écriture immédiate , avec un cache en écriture combinant 4k.
  • L2 : 2 Mo, 16 à sens unique, partagé entre deux noyaux. Latence = 20 horloges . Lire Débit du 1 par 4 horloge. Ecrire un débit 1 par 12 horloge.
  • L3 : 0 - 8 Mo, 64 à sens unique, partagé entre tous les noyaux. Latence = 87 horloge . Lire Débit du 1 par 15 horloge. Ecrire un débit 1 par 21 horloge

Agner Fog indique que les deux noyaux d'une paire actif, L1 débit est plus faible que lorsque l'autre moitié d'une paire est au repos. On ne sait pas ce qui se passe, puisque les caches L1 sont censés être séparés pour chaque noyau.

Pour les personnes intéressées par ce type de questions, mon université recommande Computer Architecture: A quantitative approche et Organisation informatique et conception: Le matériel / logiciel d'interface . Bien sûr, si vous n'avez pas le temps pour cela, un aperçu rapide est disponible sur Wikipedia .

Je pense que la principale raison est que L1-Cache est plus rapide et il est donc plus cher.

Les autres réponses ici donnent spécifiques et des raisons techniques pour lesquelles L1 et L2 sont dimensionnées comme ils sont, et alors que beaucoup d'entre eux sont des considérations motivant pour des architectures particulières, ils ne sont pas vraiment nécessaire: la pression architecturale sous-jacente conduisant à l'augmentation (privé ) tailles de cache que vous vous éloignez du noyau est assez universel et est le même que le raisonnement de plusieurs caches en premier lieu.

Les trois faits de base sont les suivants:

  1. L'accès à la mémoire pour la plupart des applications présentent un degré élevé de localité temporelle, avec une distribution non uniforme.
  2. À travers une grande variété de processus et modèles, taille du cache et la vitesse du cache (latence et le débit) peut être échangé contre l'autre 1 .
  3. Chaque niveau distinct de cache comprend la conception incrémentale et le coût de la performance.

Donc, à un niveau de base, vous pourriez être en mesure de dire le double de la taille du cache, mais encourra une pénalité de latence de 1,4 par rapport au cache plus petit.

Il devient un problème d'optimisation: combien de caches si vous avez et la taille devraient-ils être? Si l'accès mémoire était totalement uniforme dans la taille du jeu de travail, vous finiriez probablement avec un cache assez grand, ou pas de cache du tout. Toutefois, l'accès est fortement non uniforme, donc un cache petit et rapide peut capturer un grand nombre d'accès, disproportionnée par rapport à la taille de lui.

Si fait 2 n'existait pas, vous venait de créer un très grand, très rapide L1 cache dans les autres contraintes de votre puce et pas besoin d'autres niveaux de cache.

Si fait 3 n'existait pas, tu finirais avec un grand nombre de « caches » à grain fine, plus rapide et petit au centre, et plus lent et plus à l'extérieur, ou peut-être un seul cache avec des temps d'accès variables : plus rapide pour les parties les plus proches du noyau. Dans la pratique, la règle 3 signifie que chaque niveau de cache a un coût supplémentaire, de sorte que vous finissent généralement avec quelques niveaux de cache quantifiées 2 .

Autres contraintes

Cela donne un cadre de base pour comprendre le cache et cache nombre de décisions de dimensionnement, mais il y a des facteurs secondaires au travail aussi bien. Par exemple, Intel x86 a 4K formats de page et leurs caches L1 utiliser une architecture VIPT . VIPT signifie que la taille du cache divisé par le nombre de façons ne peut pas être plus grand 3 de 4 Kio. Ainsi, un cache L1 8 comme utilisé sur la demi-douzaine modèles Intel peuvent être au plus 4 Kio * 8 = 32 Kio. Il est sans doute pas un hasard si c'est exactement la taille du cache L1 sur ces modèles! S'il n'y avait pas cette contrainte, il est tout à fait possible que vous auriez vu plus faible associativité et / ou plus L1 caches (par exemple, 64 Kio, 4 voies).


1 Bien sûr, il y a d'autres facteurs impliqués dans le compromis et, comme la superficie et de la puissance, mais maintenant les constantes de facteurs le compromis taille-vitesse applique, et même si elle ne maintenue constante la comportement de base est le même.

2 En plus de cette pression, il y a un avantage d'ordonnancement de caches latence connu, comme la plupart des modèles L1: et hors ordre planificateur peut présenter avec optimisme les opérations qui dépendent d'une charge de la mémoire sur le cycle que le cache L1 retournerait, lire le résultat en dehors du réseau de dérivation. Cela réduit les conflits et peut-être un cycle rase de la latence de chemin critique. Cela met une certaine pression au niveau du cache le plus intérieur d'un délai d'attente uniforme / prévisible et probablement des résultats en moins de niveaux de cache.

3 En principe, vous pouvez utiliser les caches VIPT sans cette restriction, mais seulement en exigeant le soutien du système d'exploitation (par exemple, la coloration de la page) ou avec d'autres contraintes. L'arc x86 n'a pas fait et ne peut probablement pas commencer maintenant.

logiquement, la question se répond.

Si L1 était plus grand que L2 (combiné), alors il n'y aurait pas besoin de cache L2.

Pourquoi voudriez-vous stocker vos affaires sur lecteur de bande si vous pouvez stocker tous sur disque dur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top