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

Contenu supprimé Contenu ajouté
Ligne 155 :
[[File:Cache write-through.png|centre|vignette|upright=2|Cache write-through.]]
 
Avec les caches '''Write-Through''', toute écriture dans le cache est propagée en RAM. Cette stratégie augmente le nombre d'écritures dans la mémoire RAM, ce qui peut saturer le bus reliant le processeur à la mémoire. De plus, on ne peut écrire dans ces caches lorsqu'une écriture en RAM a lieu en même temps : cela forcerait à effectuer deux écritures simultanées, en comptant celle imposée par l'écriture dans le cache. Les performances de ces caches sont donc légèrement moins bonnes que pour les caches ''write back''. Par contre, ils sont utiles pourdans maintenirles laarchitectures cohérenceavec desplusieurs cachesprocesseurs, comme nous le verrons dans les architectureschapitres avecsur plusieursles processeursarchitectures multiprocesseurs.
 
[[File:Cache write-back.png|centre|vignette|upright=2|Cache write-back.]]
 
===Les caches ''Write-backthrough''===
 
Sans optimisations particulière, on ne peut écrire dans un cache ''write-through'' pendant qu'une écriture en RAM a lieu en même temps : cela forcerait à effectuer deux écritures simultanées, en comptant celle imposée par l'écriture dans le cache.
En suivant la procédure habituelle de remplacement des lignes de cache, on doit rapatrier la ligne en RAM avant d'en charger une nouvelle. On peut améliorer la situation en faisant l'inverse : on charge la nouvelle ligne pendant que l'ancienne donnée soit rapatriée en RAM. Ainsi, la nouvelle ligne est disponible plus tôt pour le processeur, diminuant son temps d'attente. Pour implémenter cette technique, on doit mémoriser l'ancienne ligne de cache temporairement dans un '''cache d’éviction''' (ou write-back buffer).
 
Pour éviter ces temps d'attentescela, certains processeurs avec un cachecaches ''write-through'' intègrent un '''tampon d’écriture''', qui sert de file d'attente pour les écriture en RAM. C'est une mémoire FIFO dans laquelle on place temporairement les données à transférerécrire duen cacheRAM, vers laelles RAMattendent en attendant que la RAM soit libre. On n'a pasGrâce à se soucier du fait que la mémoire soit occupéelui, etle onprocesseur peut continuerécrire àdans écrireun dedanscache tantmême quesi celui-ci nd'estautres pasécritures plein,sont évitanten les temps d'attente dusdans àle latampon RAMd'écriture. Par souci d'efficacité, des écritures à la même adresse en attente dans le tampon d’écriture sont fusionnées en une seule. Cela fait un peu de place dans le tampon d’écriture, et lui permet d'accumuler plus d'écritures avant de devoir bloquer le cache. Il est aussi possible de fusionner des écritures à adresses consécutives de la mémoire en une seule écriture en rafale. Ainsi, si la taille d'une ligne de cache est petite, comparée à ce qu'une mémoire accepte en écriture en rafale, on peut gagner un peu de performances. Dans les deux cas, on parle de '''combinaison d'écriture'''.
[[File:Cache d’éviction.png|centre|vignette|upright=2|Cache d’éviction]]
 
ResteMais àla gérertechnique ledu castampon d'écriture a cependant un léger défaut qui se manifeste dans une situation bien précise : quand le processeur veut lire une donnée en attente dans le tampon d’écriture. La première manière de gérer cette situation est de mettre en attente la lecture tant que la donnée n'a pas été écrite en mémoire RAM. On peut aussi lire la donnée directement dans le tampon d'écriture, cette optimisation portant le nom de '''''store-to-load forwading'''''. Dans tous les cas, il faut détecter le cas où une lecture accède à une donnée dans le tampon d'écriture. Pour cela, chaque entrée du tampon d’écriture contient un comparateur : àA chaque lecture, l'adresse à lire est envoyée àau cetampon comparateurd'écriture, qui vérifie quesi l'adresseune deécriture laen lectureattente etse l'adresse de la donnéefait à écrirecette sont différentesadresse. SiPour jamais ces deux adresses sont identiquescela, alorsle latampon lecture souhaite lire la donnée présente dans l'entrée, et la lectured’écriture est misedonc enforcément attente.une Sinon,mémoire la lecture a lieu sans attenteassociative.
Les caches directement adressés ou associatifs par voie possèdent aussi un tampon d’écriture amélioré, qui devient un cache en supplément du cache principal. Pour limiter les défauts par conflit de ces caches, des scientifiques ont eu l'idée d'insérer un cache pour stocker les données virées du cache. En faisant ainsi, si une donnée est virée du cache, on peut alors la retrouver dans ce cache spécialisé. Ce cache s'appelle le '''cache de victime'''. Ce cache de victime est géré par un algorithme de suppression des lignes de cache de type FIFO. Petit détail : ce cache utilise un tag légèrement plus long que celui du cache directement adressé au-dessus de lui. L'index de la ligne de cache doit en effet être contenu dans le tag du cache de victime, pour bien distinguer deux adresses différentes, qui iraient dans la même ligne du cache juste au-dessus.
 
===Les caches ''Write-throughback''===
[[File:Victim Cache Implementation Example.svg|centre|vignette|upright=2|Cache de victime.]]
 
Les caches ''write-back'' ont beau avoir des performances supérieures à celles des caches ''write-through'', il existe des optimisations qui permettent d'améliorer leurs performances. Ces optimisations consistent à ajouter des caches spécialisés à côté du cache proprement dit. Ces caches permettent de mémoriser des données qui sont éliminées du cache par les algorithmes de remplacement de ligne cache, sans pour autant faire une écriture en RAM.
===Les caches ''Write-through''===
 
En suivant la procédure habituelle de remplacement des lignes de cache, on doit rapatrier la ligne en RAM avant d'en charger une nouvelle. On peut améliorer la situation en faisant l'inverse : on charge la nouvelle ligne pendant que l'ancienne donnée soit rapatriée en RAM. Ainsi, la nouvelle ligne est disponible plus tôt pour le processeur, diminuant son temps d'attente. Pour implémenter cette technique, on doit mémoriser l'ancienne ligne de cache temporairement dans un '''cache d’éviction''' (ou ''write-back buffer'').
 
[[File:Cache d’éviction.png|centre|vignette|upright=2|Cache d’éviction]]
 
Les caches directement adressés ou associatifs par voie possèdent aussi un tampon d’écriture amélioré, qui devient un cache en supplémentsupplémen séparé du cache principal. Pour limiter les défauts par conflit de ces caches, des scientifiques ont eu l'idée d'insérer un cache pour stocker les données virées du cache. En faisant ainsi, si une donnée est virée du cache, on peut alors la retrouver dans ce cache spécialisé. Ce cache s'appelle le '''cache de victime'''. Ce cache de victime est géré par un algorithme de suppression des lignes de cache de type FIFO. Petit détail : ce cache utilise un tag légèrement plus long que celui du cache directement adressé au-dessus de lui. L'index de la ligne de cache doit en effet être contenu dans le tag du cache de victime, pour bien distinguer deux adresses différentes, qui iraient dans la même ligne du cache juste au-dessus.
Pour éviter ces temps d'attentes, certains processeurs avec un cache write-through intègrent un '''tampon d’écriture''', une mémoire FIFO dans laquelle on place temporairement les données à transférer du cache vers la RAM en attendant que la RAM soit libre. On n'a pas à se soucier du fait que la mémoire soit occupée, et on peut continuer à écrire dedans tant que celui-ci n'est pas plein, évitant les temps d'attente dus à la RAM. Par souci d'efficacité, des écritures à la même adresse en attente dans le tampon d’écriture sont fusionnées en une seule. Cela fait un peu de place dans le tampon d’écriture, et lui permet d'accumuler plus d'écritures avant de devoir bloquer le cache. Il est aussi possible de fusionner des écritures à adresses consécutives de la mémoire en une seule écriture en rafale. Ainsi, si la taille d'une ligne de cache est petite, comparée à ce qu'une mémoire accepte en écriture en rafale, on peut gagner un peu de performances. Dans les deux cas, on parle de '''combinaison d'écriture'''.
 
[[File:Victim Cache Implementation Example.svg|centre|vignette|upright=21|Cache de victime.]]
Reste à gérer le cas où le processeur veut lire une donnée en attente dans le tampon d’écriture. La première manière de gérer cette situation est de mettre en attente la lecture tant que la donnée n'a pas été écrite en mémoire. On peut aussi lire la donnée directement dans le tampon d'écriture, cette optimisation portant le nom de '''store-to-load forwading'''. Dans tous les cas, il faut détecter le cas où une lecture accède à une donnée dans le tampon d'écriture. Pour cela, chaque entrée du tampon d’écriture contient un comparateur : à chaque lecture, l'adresse à lire est envoyée à ce comparateur, qui vérifie que l'adresse de la lecture et l'adresse de la donnée à écrire sont différentes. Si jamais ces deux adresses sont identiques, alors la lecture souhaite lire la donnée présente dans l'entrée, et la lecture est mise en attente. Sinon, la lecture a lieu sans attente.
 
==Comportement d’allocation sur écriture==