« Fonctionnement d'un ordinateur/Les mémoires cache » : différence entre les versions

Aller à la navigation Aller à la recherche
m
Le cache est une mémoire intercalée entre la mémoire et un processeur ou un périphérique, qui est souvent fabriquée avec de la mémoire SRAM, parfois avec de l'eDRAM. Sans lui, on se croirait à l'âge de pierre tellement nos PC seraient lents ! En effet, la mémoire est lente comparée au processeur. Or, le temps mis pour accéder à la mémoire est du temps durant lequel le processeur n’exécute pas d'instruction (sauf cas particuliers impliquant un pipeline). Il a fallu trouver une solution pour diminuer ce temps d'attente, et on a décidé d'intercaler une mémoire entre le processeur et la mémoire. Comme cela, le processeur accède directement à une mémoire cache très rapide plutôt que d'accéder à une mémoire RAM qui répondra de toute façon trop tard.
 
==AccèsL'accès au cache==
 
Le cache est divisé en groupes de plusieurs bytes (de 64 à 256 octets chacun), qui portent le nom de '''lignes de cache'''. Sur les caches actuels, on transfère les données entre le cache et la RAM ligne de cache par ligne de cache. UnMais cache est une mémoire associative : tout accès mémoire sera intercepté par le cache, qui vérifiera si la donnée demandée est présente ou non dans le cache. Si cd'estautres lecaches cas,plus laanciens donnée voulue est présente dans le cache : on a un '''succèspermettaient de cache'''faire (cachedes hit)transferts etplus on accède à la donnée depuis le cachefins. Sinon, cC'est unà '''défautdire de cachequ''' (cache miss) : on est obligépouvait d’accédermettre à lajour RAMquelques ou de recopier notre donnée de la RAMoctets dans leune cache. Le nombre de succèsligne de cache parsans nombre d'accès mémoire , appelé le '''taux de succès''' (hit ratio), est déterminant pour les performances. En effet, plus celui-ci est élevé, plus on accède au cacheavoir à la placerecopier deintégralement ladepuis RAMou etdans plusla le cache est efficacemémoire.
 
Tout accès mémoire est intercepté par le cache, qui vérifie si la donnée demandée est présente ou non dans le cache. Si la donnée voulue est présente dans le cache, on a un '''succès de cache''' (''cache hit'') et on accède à la donnée depuis le cache. Sinon, c'est un '''défaut de cache''' (''cache miss'') et on est obligé d’accéder à la RAM. Le nombre de succès de cache par nombre d'accès mémoire , appelé le '''taux de succès''' (''hit ratio''), est déterminant pour les performances : plus il est élevé, plus le cache est efficace.
Les défauts de cache peuvent avoir des origines diverses. Lorsqu'on exécute une instruction ou qu'on accède à une donnée pour le première fois, celle-ci (l’instruction ou la donnée) n'a pas encore été chargée dans le cache. Le défaut de cache est inévitable : ce genre de défaut de cache s'appelle un '''défaut à froid''' (cold miss). Si on accède à beaucoup de données, le cache finit par être trop petit pour conserver les anciennes données : elles vont quitter le cache, et toute tentative ultérieure d'accès tombera en RAM, donnant un '''défaut de volume de cache''' (capacity cache miss). Les seules solutions pour éviter cela consistent à augmenter la taille du cache, faire en sorte que le programme prenne moins de mémoire cache, et améliorer la localité du programme exécuté.
 
Les défauts de cache peuvent avoir des origines diverses. Lorsqu'on exécute une instruction ou qu'on accède à une donnée pour le première fois, celle-ciil se produit un '''défaut à froid''' (l’instruction''cold miss''). La raison est que l'instruction ou la donnée) n'a pas encore été chargée dans le cache., Lece qui rend le défaut de cache est inévitable. :Autre cesituation genre: de défaut dele cache s'appelleest untrop '''défautpetit àpour froid'''les (coldbesoins miss).et Sile oncache accèdefait àalors beaucouple de donnéesménage, leen cacheretirant finitdes pardonnées êtredu tropcache. petitToute pourtentative conserverultérieure les anciennesaux données :qui ellesont vont quitterquitté le cache, et toute tentative ultérieure d'accès tombera en RAM, donnant un '''défaut de volume de cache''' (''capacity cache miss''). Les seules solutions pour éviter cela consistent à augmenter la taille du cache, faire en sorte que le programme prenne moins de mémoire cache, et améliorer la localité du programme exécuté.
===Tag d'une ligne de cache===
 
===TagLe tag d'une ligne de cache===
[[File:Cache hash table.png|droite|Cache hash table]]
 
[[File:Cache hash table.png|droitevignette|Cache hash table]]
Les données présentes dans le cache sont (pré)chargées depuis la mémoire : toute donnée présente dans le cache est la copie d'une donnée en mémoire RAM. Pour faire la correspondance entre une ligne de cache et l'adresse mémoire correspondante, on ajoute des bits supplémentaires à chaque ligne de cache, qui contiennent une partie (voir la totalité) des bits de l'adresse mémoire correspondante. Ces bits supplémentaires forment ce qu'on appelle le '''tag'''. Quand notre cache reçoit une demande de lecture ou écriture, il va comparer le tag de chaque ligne avec les bits de poids fort de l'adresse à lire ou écrire. Si une ligne contient ce tag, alors c'est que cette ligne correspond à l'adresse, et c'est un défaut de cache sinon. Cela demande de comparer le tag avec un nombre de lignes de cache qui peut être conséquent, et qui varie suivant l'organisation du cache.
 
Les données présentes dans le cache sont (pré)chargées depuis la mémoire, :ce qui fait que toute donnée présente dans le cache est la copie d'une donnée en mémoire RAM. Pour faire la correspondance entre une ligne de cache et l'adresse mémoire correspondante, on ajoute des bits supplémentaires à chaquela ligne de cache, quimémorise contiennenttout uneou partie (voirde lal'adresse totalité)mémoire descorrespondante. Les bits de l'adresse mémoire correspondante.qui Cessont bitsmémorisés supplémentairesdans la ligne de cache forment cedce qu'on appelle le '''tag'''. QuandLors notred'un cacheaccès reçoitmémoire, unele demandecache deextrait lecturele outag écriture,de ill'adresse vaà comparerlire leou tagécrire, deet chaquecompare lignecelui-ci avec les bitstag de poidschaque fortligne de l'adresse à lire ou écrirecache. Si une ligne contient ce tag, alors c'est que cette ligne correspond à l'adresse, et c'est un défaut de cache sinon. Cela demande de comparer le tag avec un nombre de lignes de cache qui peut être conséquent, et qui varie suivant l'organisation du cache.
[[File:Tag d'une ligne de cache.png|centre|Tag d'une ligne de cache.]]
 
[[File:Tag d'une ligne de cache.png|centre|vignette|upright=2|Tag d'une ligne de cache.]]
Sur certains caches assez anciens, on pouvait transférer nos lignes de caches morceaux par morceaux. Ces caches avaient des lignes de cache divisées en sous-secteurs, ces sous-secteurs étant des morceaux de ligne de cache qu'on pouvait charger indépendamment les uns des autres (mais qui sont consécutifs en RAM). Chaque secteur avait ses propres bits de contrôle, mais le tag était commun à tous les secteurs.
 
Sur certains caches assez anciens, on pouvait transférer nosles lignes de caches morceaux par morceaux. Ces caches avaient des lignes de cache divisées en sous-secteurs, ces sous-secteurs étant des morceaux de ligne de cache qu'on pouvait charger indépendamment les uns des autres (mais qui sont consécutifs en RAM). Chaque secteur avait ses propres bits de contrôle, mais le tag était commun à tous les secteurs.
[[File:Cache à secteurs.png|centre|Cache à secteurs.]]
 
[[File:Cache à secteurs.png|centre|vignette|upright=2|Cache à secteurs.]]
===Adresses physiques ou logiques ?===
 
===L'adressage physique ou logique des caches===
L’interaction entre caches et mémoire virtuelle donne lieu à un petit problème : l'adresse utilisée lors de l'accès au cache est-elle une adresse physique ou virtuelle ? Et bien cela varie suivant le processeur : certains caches utilisent une correspondance entre une adresse virtuelle et une ligne de cache, tandis que d'autres l'effectuent avec l'adresse physique. Notre cache peut donc être placé aussi bien avant qu'après la MMU. On parle de cache '''virtuellement tagué''' dans le premier cas et de cache '''physiquement tagué''' dans le second. Un cache virtuellement tagué n'a pas besoin d'attendre que la MMU ait fini de traduire l'adresse logique en adresse physique pour vérifier la présence de la donnée dans le cache : ces caches sont donc plus rapides. Mais les problèmes arrivent facilement quand on utilise plusieurs programmes : une adresse logique correspond à des adresses physiques différentes suivant le programme. Pour éviter toute confusion, on peut rajouter des bits de contrôle pour identifier le programme qui possède la ligne de cache. On peut aussi vider le cache en changeant de programme. Les caches physiquement tagués ont les avantages et inconvénients inverses : moins rapides, ils permettent un partage du cache entre plusieurs programmes aisément.
 
L’interaction entre caches et mémoire virtuelle donne lieu à un petit problème : l'adresse utilisée lorspour deles l'accès au cachetags est-elle une adresse physique ou virtuelle ? EtLa bien celaréponse varie suivant le processeur : certains caches utilisent une correspondance entre une l'adresse virtuelle et une ligne de cache, tandis que d'autres l'effectuent avecprennent l'adresse physique. Notre cache peut donc être placé aussi bien avant qu'après la MMU. On parle de cache '''virtuellement tagué''' dans le premier cas et de cache '''physiquement tagué''' dans le second. Un cache virtuellement tagué n'a pas besoin d'attendre que la MMU ait fini de traduire l'adresse logique en adresse physique pour vérifier la présence de la donnée dans le cache : ces caches sont donc plus rapides. Mais les problèmes arrivent facilement quand on utilise plusieurs programmes : une adresse logique correspond à des adresses physiques différentes suivant le programme. Pour éviter toute confusion, on peut rajouter des bits de contrôle pour identifier le programme qui possède la ligne de cache. On peut aussi vider le cache en changeant de programme. Les caches physiquement tagués ont les avantages et inconvénients inverses : moins rapides, ils permettent un partage du cache entre plusieurs programmes aisément.
 
{|
40 555

modifications

Menu de navigation