Quelle technique de cartographie de cache est utilisée dans le processeur intel core i7?

j'ai appris différentes techniques de cartographie de cache comme la cartographie directe,la cartographie associée et la technique de cartographie associative set et j'ai également appris les compromis. Mais je suis curieux de savoir ce qui est utilisé dans les processeurs intel core i7 ou AMD de nos jours. Et comment les techniques sont évoluées. Et quelles sont les choses qui doivent être améliorées?

2
demandé sur Peter Cordes 2018-03-04 09:11:24

1 réponses

les caches à cartographie directe ne sont pratiquement jamais utilisées dans les CPU modernes à haute performance . Les économies d'énergie sont compensées par le grand avantage du taux de succès pour un cache set-associative de la même taille, avec seulement un peu plus de complexité dans la logique de contrôle. Les budgets des transistors sont très importants de nos jours.

il est très courant pour un logiciel d'avoir au moins un couple de tableaux qui sont un multiple de 4k l'un de l'autre, ce qui créerait le conflit manque dans une cache cartographiée directement. (Réglage de code avec plus de quelques tableaux peuvent impliquer l'inclinaison à réduire les conflits de justesse, si une boucle doit parcourir toutes à la fois)

les CPU modernes sont si rapides que la latence DRAM est de plus de 200 cycles d'horloge, ce qui est trop grand même pour de puissants CPU d'exécution hors-ordre pour bien se cacher sur une erreur de cache.


les caches à niveaux multiples sont essentielles (et utilisé est tout CPU haute performance) pour donner la faible latence (~4 cycles) / haut débit pour les données les plus chaudes (par exemple jusqu'à 2 charges et 1 mémoire par horloge , avec un chemin de 128, 256 ou même 512 bits entre la cache L1D et les unités vectorielles de charge/exécution de stockage), tout en étant assez grand pour mettre en cache un ensemble de travail de taille raisonnable. Il est physiquement impossible de construire un cache très grand / très rapide / très associatif qui fonctionne aussi bien que courant les caches à niveaux multiples pour les charges de travail typiques; les retards de la vitesse de la lumière lorsque les données doivent se déplacer physiquement loin sont un problème. Le coût de l'alimentation serait prohibitif. (En fait, la densité de puissance / puissance est un facteur limitant majeur pour les CPU modernes, voir les microprocesseurs modernes: un Guide de 90 minutes! .)

tous les niveaux de cache (sauf le cache uop) sont physiquement indexés / physiquement marqués dans tous les CPUs x86 que je connais. Les caches L1D dans la plupart des conceptions prennent leurs bits d'index situés en dessous du décalage de page, et donc aussi VIPT permettent à TLB lookup de se produire en parallèle avec tag fetch, mais sans aucun problème d'alias. Ainsi, les caches n'ont pas besoin d'être vidangées sur les commutateurs de contexte ou quoi que ce soit. (Voir cette réponse pour plus d'informations sur les caches à niveaux multiples en général et le tour de vitesse VIPT, et quelques paramètres de cache de quelques CPU x86 réels.)


le privé (per-core) L1D / Les caches L1I et L2 sont des caches set-associatives traditionnelles , souvent à 8 ou 4 voies pour les caches petites/rapides. La taille de la ligne de Cache est de 64 octets sur tous les CPU x86 modernes. Les caches de données sont en retour. (Sauf sur AMD Bulldozer-family,où L1D est write-through avec un petit tampon d'écriture 4kib combinant.)

http://www.7-cpu.com / a de bons numéros d'organisation / latence de cache, et de bande passante, et numéros D'organisation / performance TLB, pour diverses microarchitectures, y compris de nombreux x86, comme Haswell .

le "l0" décodé-UOP cache dans Intel Sandybridge-famille est set-associative et virtuellement adressée . Jusqu'à 3 blocs de jusqu'à 6 uops peuvent décoder les résultats à partir d'instructions dans un bloc de 32 octets de code machine. Connexe: alignement de branche pour les boucles impliquant des instructions micro-codées sur Intel SnB - famille CPUs . (Un cache uop est un grande avancée pour x86: les instructions x86 sont de longueur variable et difficiles à décoder rapidement / en parallèle, de sorte que la mise en cache des résultats de décodage internes ainsi que du code machine (L1I$) présente des avantages significatifs en termes de puissance et de débit. Des décodeurs puissants sont encore nécessaires, parce que le cache uop n'est pas grand; il est le plus efficace dans les boucles (y compris les boucles moyennes à grandes). Cela permet d'éviter L'erreur de Pentium4 (ou la limitation basée sur la taille du transitor à l'époque) d'avoir des décodeurs faibles et de compter sur le cache de trace.)


Intel moderne (et AMD, je suppose) L3 alias LLC alias les caches de dernier niveau utilisent une fonction d'indexation qui n'est pas seulement une gamme de bits d'adresse . C'est une fonction de hachage qui distribue mieux les choses pour réduire les collisions à pas fixes. selon Intel mon cache devrait être 24-way associative bien que son 12-way, Comment est-ce? .


à partir de À partir de Nehalem , Intel a utilisé une cache large inclusive partagée L3, qui filtre le trafic de cohérence entre les noyaux . c'est-à-dire que lorsqu'un noyau lit des données qui sont dans un état modifié dans L1d d'un autre noyau, les étiquettes L3 indiquent quel noyau, de sorte qu'un RFO (lu pour la propriété) peut être envoyé seulement à ce noyau, au lieu de diffusion. comment sont organisées les caches Intel CPU L3 modernes? . La propriété d'inclusivité est importante, car cela signifie qu'aucun cache L2 ou L1 privé ne peut avoir une copie d'une ligne de cache sans que L3 le sache. S'il est dans un État exclusif ou modifié dans un cache privé, L3 aura des données invalides pour cette ligne, mais les étiquettes indiqueront quand même quel noyau pourrait avoir une copie. Les cœurs qui n'ont certainement pas de copie n'ont pas besoin d'être envoyés un message à ce sujet, économisant l'énergie et la bande passante sur les liens internes entre les cœurs et L3. Voir pourquoi la cohérence du Cache de la puce est là pour rester pour plus détails sur la cohérence de cache sur puce dans Intel " i7 " (i.e. Nehalem et Sandybridge-famille, qui sont des architectures différentes mais utilisent la même hiérarchie de cache).

Core2Duo avait un cache de dernier niveau partagé (L2), mais était lent à générer des requêtes RFO (Read-For-Ownership) sur les erreurs de L2. Ainsi la bande passante entre les noyaux avec un petit tampon qui s'adapte à L1d est aussi lente qu'avec un grand tampon qui ne s'adapte pas à L2 (i.e. Dram speed). Il y a une gamme rapide des tailles lorsque le tampon s'adapte en L2 mais pas en L1d, parce que le noyau d'écriture expulse ses propres données en L2 où les charges des autres noyaux peuvent frapper sans générer de requête RFO. (Voir Figure 3.27: bande passante Core 2 avec 2 Threads dans"What Every Programmer Should Know about Memory" D'Ulrich Drepper. ( version complète ici ).


Skylake-AVX512 a une plus grande L2 par carotte (1mib au lieu de 256k), et de plus petites tranches de L3 (LLC) par carotte. Ce n'est plus inclusif . Il utilise un réseau de maillage au lieu d'un anneau bus pour connecter les noyaux les uns aux autres. Voir cet article D'AnandTech (mais il a quelques inexactitudes dans les détails microarchitecturaux sur d'autres pages, voir le commentaire que j'ai laissé ).

À Partir De Processeur Intel® Xeon® Évolutive De La Famille Présentation Technique

en raison de la nature non-inclusive DE LLC , l'absence d'une ligne de cache dans LLC n'indique pas que la ligne n'est pas présente dans les caches privés de l'un des noyaux. Par conséquent, un filtre snoop est utilisé pour garder une trace de l'emplacement des lignes de cache dans la L1 ou la MLC des noyaux quand elle n'est pas attribuée dans la LLC. Sur les CPU de la génération précédente, la LLC partagée elle-même s'est occupée de cette tâche.

Ce "Snoop-filter" n'est utile que s'il ne peut pas avoir de faux négatifs. C'est normal d'envoyer un invalidate ou RFO ( MESI ) à un noyau qui n'a pas de copie d'une ligne. Il n'est pas correct de laisser un noyau conserver une copie d'une ligne lorsqu'un autre noyau demande un accès exclusif à celle-ci. Il peut donc s'agir d'un tracker incluant des balises qui sait quels noyaux peuvent avoir des copies de telle ou telle ligne, mais qui ne cache aucune donnée.

ou peut-être le filtre snoop peut encore être utile sans être strictement inclus de toutes les étiquettes L2 / L1. Je ne suis pas un expert des protocoles multi-core / multi-socket snoop. I penser le même filtre snoop peut aussi aider à filtrer les requêtes snoop entre les sockets. (À Broadwell et plus tôt, seuls les quad-socket et les Xeons supérieurs ont un filtre snoop pour le trafic inter-core; Dual-socket-only Broadwell Xeon et plus tôt ne filtrent pas les requêtes snoop entre les deux sockets .)


AMD Ryzen utilise des caches L3 séparés pour les grappes de noyaux , de sorte que les données partagées entre plusieurs noyaux doivent être dupliquées dans la L3 pour chaque grappe. Aussi important, écrit à partir d'un noyau dans un cluster prennent plus de temps à être visible à un noyau dans un autre cluster, avec les demandes de cohérence doivent passer par une interconnexion entre les clusters. (Similaire à entre les sockets dans un système Intel multi-socket, où chaque paquet CPU a sa propre L3.)

ainsi cela nous donne NUCA (Non-Uniform Cache Access), analogue à L'habituel NUMA (Non-Uniform Memory Access) que vous obtenez dans un système multi-socket où chaque processeur a un contrôleur de mémoire intégré, et l'accès à la mémoire locale est plus rapide que l'accès à la mémoire attachée à une autre socket.


les récents systèmes Intel multi-socket ont des modes snoop configurables donc en théorie, vous pouvez ajuster le mécanisme NUMA pour fonctionner le meilleur pour la charge de travail que vous êtes en cours d'exécution. Voir la page D'Intel sur Broadwell-Xeon pour un tableau + description des modes snoop disponibles.


un Autre avance / l'évolution est une adaptation politique de remplacement dans le L3 sur IvyBridge et plus tard . Cela peut réduire la pollution lorsque certaines données sont localisées dans le temps, mais que d'autres parties de l'ensemble de travail sont beaucoup plus grandes. (c'est à dire en boucle au-dessus d'un tableau géant avec le remplacement LRU standard va tout expulser, laissant le cache L3 seulement cache des données du tableau qui ne sera pas touché à nouveau bientôt. Le remplacement adaptatif tente d'atténuer ce problème.)


"autres lectures:

11
répondu Peter Cordes 2018-03-09 23:12:48