Pourquoi existe-t-il des caches L1 distincts pour les données et les instructions?

23

Je viens de parcourir quelques diapositives et j'ai remarqué que le cache L1 (au moins sur les processeurs Intel) fait la distinction entre le cache de données et d'instructions, je voudrais savoir pourquoi c'est ..

Nils
la source

Réponses:

28

Il y a en fait plusieurs raisons.

D'abord et probablement avant tout, les données qui sont stockées dans le cache d'instructions sont généralement quelque peu différentes de celles qui sont stockées dans le cache de données - avec les instructions elles-mêmes, il y a des annotations pour des choses comme où commence l'instruction suivante, pour aider les décodeurs. Certains processeurs (par exemple, Netburst, certains SPARC) utilisent un "cache de trace", qui stocke le résultat du décodage d'une instruction plutôt que de stocker l'instruction d'origine dans sa forme codée.

Deuxièmement, cela simplifie un peu les circuits - le cache de données doit traiter les lectures et les écritures, mais le cache d'instructions ne traite que les lectures. (Cela explique en partie pourquoi le code auto-modifiant est si cher - au lieu de remplacer directement les données dans le cache d'instructions, l'écriture passe par le cache de données dans le cache L2, puis la ligne dans le cache d'instructions est invalidée et re - chargé de L2).

Troisièmement, cela augmente la bande passante: la plupart des processeurs modernes peuvent lire simultanément les données du cache d'instructions et du cache de données. La plupart ont également des files d'attente à "l'entrée" du cache, de sorte qu'ils peuvent réellement faire deux lectures et une écriture dans un cycle donné.

Quatrièmement, il peut économiser de l'énergie. Alors que vous devez maintenir l'alimentation des cellules de mémoire elles-mêmes pour maintenir leur contenu, certains processeurs peuvent / font éteindre certains des circuits associés (décodeurs et autres) lorsqu'ils ne sont pas utilisés. Avec des caches séparés, ils peuvent alimenter ces circuits séparément pour les instructions et les données, augmentant les chances qu'un circuit reste non alimenté pendant un cycle donné (je ne suis pas sûr que des processeurs x86 le fassent - AFAIK, c'est plus un ARM chose).

Jerry Coffin
la source
3
Il est également important de mentionner que le code et les données peuvent présenter des modèles d'accès différents; par exemple, les instructions pour sommer tous les éléments d'un tableau présentent une localité temporelle (les mêmes instructions sont souvent utilisées (si vous le faites par boucle)) et les données du tableau présentent une localité spatiale (les données suivantes sont utilisées ensuite).
gablin
1
@gablin: bien que vraies, ces différences de modèles favoriseraient souvent un cache unifié. Dans une boucle serrée comme vous le mentionnez, la majeure partie du cache d'instructions est inactive. Un cache unifié doublerait essentiellement la taille du cache de données pour la durée de la boucle.
Jerry Coffin
Pas vraiment, car il y a plus de code après cette petite boucle et cela est également susceptible de fonctionner avec le tableau. Cela caractérise énormément de code (par exemple, la gestion des chaînes). En fait, les premiers caches dans les CPU étaient des caches unifiés - ils se trouvaient entre l'interface mémoire principale du CPU et le bus externe, qui était un endroit simple pour les mettre - mais nous utilisons maintenant un cache partitionné car il est plus rapide dans la pratique .
Donal Fellows
@Donal Fellows: Oui, vraiment. Je sais très bien comment la mise en cache précoce a été effectuée et pourquoi ils ont changé pour un cache divisé.
Jerry Coffin
5

Tout comme l'immobilier, l'utilisation du cache est motivée par trois choses: l'emplacement, l'emplacement, l'emplacement. L'intérêt d'avoir un cache est que la plupart des programmes présentent des schémas de localisation: s'ils accèdent à l'octet 1111111, alors l'octet suivant auquel ils accéderont est probablement 1111110 ou 1111112, et pas tant l'octet 9999999. Cependant, la plupart des programmes présenteront très différents modèles de localisation pour leurs instructions et leurs données. Cela signifie qu'il est peu probable que les instructions et les données puissent partager efficacement le cache. Parce que les instructions et les données ne sont pas nécessairement proches les unes des autres en mémoire. Un accès aux données suspendrait les instructions du cache, et les instructions de chargement suspendraient les données du cache.

Charles E. Grant
la source