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

Aller à la navigation Aller à la recherche
m
[[File:Cache Coherency Generic.svg|centre|vignette|upright=1.5|Cohérence des caches.]]
 
==La hiérarchie mémoire des caches==
==On n’a pas qu’un seul cache !==
 
[[File:Cache Hierarchy.png|vignette|Hiérarchie de caches]]
On pourrait croire qu'un seul gros cache est largement suffisant pour compenser la lenteur de la mémoire. Hélas, nos processeurs sont devenus tellement rapides que nos caches sont eux mêmes trop lents ! Pour rappel, plus une mémoire peut contenir de données, plus elle est lente. Et nos caches ne sont pas épargnés. Après tout, qui dit plus de cases mémoires à adresser dans un cache, dit décodeur ayant plus de portes logiques : les temps de propagation s'additionnent et cela finit par se sentir. Si on devait utiliser un seul gros cache, celui-ci serait beaucoup trop lent. La situation qu'on cherche à éviter avec la mémoire principale (la RAM) revient de plus belle.
 
On pourrait croire qu'un seul gros cache est largement suffisant pour compenser la lenteur de la mémoire. Hélas, nosles processeurs sont devenus tellement rapides que nosles caches sont eux mêmes troptrès lents ! Pour rappel, plus une mémoire peut contenir de données, plus elle est lente. Et nosles caches ne sont pas épargnés. Après tout, qui dit plus de cases mémoires à adresser dans un cache, dit décodeur ayant plus de portes logiques : les temps de propagation s'additionnent et cela finit par se sentir. Si on devait utiliser un seul gros cache, celui-ci serait beaucouptrès gros et donc trop lent. La situation qu'on cherche à éviter avec la mémoire principale (la RAM) revient de plus belle.
===Hiérarchie de caches===
 
Même problème, même solution : si on a décidé de diviser la mémoire principale en plusieurs mémoires de taille et de vitesse différentes, on peut bien faire la même chose avec la mémoire cache. Depuis environ une vingtaine d'années, nosun cachesprocesseur sont segmentés encontient plusieurs sous-caches de capacités très différentes : les caches L1, L2 et parfois un cache L3. Certains de ces caches sont petits, mais très rapides : c'est ceux auxquels on va accéder en priorité. Viennent ensuite d'autres caches, de taille variable, mais plus lents. L’accèsLes auprocesseurs cacheont est simple : on commence par vérifier si notre adresse correspond àdonc une donnéehiérarchie dude cachecaches le plus rapide (qui estse souventfait lede plus petit)en :plus j'aicomplexe nomméavec le cache L1. Si elle n’y est pastemps, on effectue la même vérification pour le cacheavec de niveau inférieur (le L2). Si une donnée est présente dans un des caches, on la charge directement dans le séquenceur (instruction) ouplus en entréeplus desde unitésniveaux de calcul (donnée). Dans le cas contraire, on vérifie le cache du niveau inférieur. Et on répète cette opération, jusqu’à avoir vérifié tous les caches : on doit alors aller chercher la donnée en mémoire.
[[File:Cache Hierarchy.png|vignette|Hiérarchie de caches]]
 
===Le fonctionnement d'une hiérarchie de caches===
 
Un accès mémoire dans une hiérarchie de cache fonctionne comme suit : on commence par vérifier si la donnée recherchée est dans le cache le plus rapide, à savoir le cache L1. Si c'est le cas,n on la charge depuis ce cache directement. Si elle n’y est pas, on vérifie si elle est dans le cache de niveau inférieur, le cache L2. Et rebelote ! Si elle n'y est pas, on vérifie le cache du niveau inférieur. Et on répète cette opération, jusqu’à avoir vérifié tous les caches. Si la donnée n'est dans aucun cache, on doit alors aller chercher la donnée en mémoire.
 
[[File:Hiérarchie de caches.png|centre|vignette|upright=2|Hiérarchie de caches]]
Même problème, même solution : si on a décidé de diviser la mémoire principale en plusieurs mémoires de taille et de vitesse différentes, on peut bien faire la même chose avec la mémoire cache. Depuis environ une vingtaine d'années, nos caches sont segmentés en plusieurs sous-caches : les caches L1, L2 et parfois un cache L3. Certains de ces caches sont petits, mais très rapides : c'est ceux auxquels on va accéder en priorité. Viennent ensuite d'autres caches, de taille variable, mais plus lents. L’accès au cache est simple : on commence par vérifier si notre adresse correspond à une donnée du cache le plus rapide (qui est souvent le plus petit) : j'ai nommé le cache L1. Si elle n’y est pas, on effectue la même vérification pour le cache de niveau inférieur (le L2). Si une donnée est présente dans un des caches, on la charge directement dans le séquenceur (instruction) ou en entrée des unités de calcul (donnée). Dans le cas contraire, on vérifie le cache du niveau inférieur. Et on répète cette opération, jusqu’à avoir vérifié tous les caches : on doit alors aller chercher la donnée en mémoire.
 
Notons que du point de vue de cette vérification, il faut distinguer les caches inclusifs et exclusifs. Ils se distinguent par le fait que les caches exclusifs peuvent avoir des données en doublon dans plusieurs niveaux de cache, alors que les caches inclusifs font que la donnée est présente dans un seul cache, pas les autres.
[[File:Hiérarchie de caches.png|centre|Hiérarchie de caches]]
 
Ces caches sont organisés différemment, et leur contenu varie suivant le cache. Dans les '''caches exclusifs''', le contenu d'un cache n'est pas recopié dans le cache de niveau inférieur. Ainsi, le cache ne contient pas de donnée en double et on utilise 100 % de la capacité du cache, ce qui améliore le taux de succès. Par contre, le temps d'accès est plus long, vu qu'il faut vérifier tous les caches de niveau inférieur. Par exemple, si une donnée n'est pas dans le cache L1, on doit vérifier l'intégralité du cache L2, puis du cache L3. De plus, assurer qu'une donnée n'est présente que dans un seul cache nécessite aux différents niveaux de caches de communiquer entre eux pour garantir que l'on a pas de copies en trop d'une ligne de cache, ce qui peut prendre du temps.
 
[[File:Caches exclusifs.png|centre|vignette|upright=2|Caches exclusifs]]
 
Dans le cas des '''caches inclusifs''', le contenu d'un cache est recopié dans les caches de niveau inférieur. Par exemple, le cache L1 est recopié dans le cache L2 et éventuellement dans le cache L3.
 
[[File:Caches inclusifs.png|centre|vignette|upright=2|Caches inclusifs]].
 
Maintenir cette inclusion demande toutefois d'échanger des données entre mémoires cache, toute éviction de donnée devant être propagée aux caches de niveau inférieur et supérieur. Premièrement, toute donnée chargée dans un cache doit aussi l'être dans tous les caches de niveau inférieur. Cette contrainte est respectée en maintenant une hiérarchie entre caches lors des accès. Par exemple, si un défaut de cache a lieu dans le L1, celui-ci doit déclencher une lecture dans le L2, lecture qui déclenchera potentiellement un défaut de cache dans le L3, et ainsi de suite jusqu'à trouver la bonne donnée : tous les caches seront parcourus dans l'ordre descendant jusqu'à trouver la donnée. Chaque défaut de cache chargera la donnée dans le cache correspondant, ce qui fait que tous les caches parcourus auront une copie de la donnée.
40 555

modifications

Menu de navigation