L'acces a la memoire ce fait quasi exclusivement par ligne. On demande une addresse, et on recupere les n octets suivant qui sont directement mis dans une ligne du cache. La plus part des memoire aujourd'hui sont capables de gerer plusieurs requetes en simultannees de maniere asynchrone (vive le pipeline) qui sont souvent utilises par le prefetch.
C'est vraiment simplifier car il y a plein de mecanique supplementaire qui rentre en ligne de compte. Par exemple les TLB miss qui peuvent aussi impacter lourdement les requetes memoires si jamais les donnees ne sont pas toutes dans la meme page de memoire virtuelle.
Enfin tu as souvent des caches differents pour les data et les instructions, aussi bien au niveau de la TLB que des caches memoire proprement dit, donc grosso modo les meme regles existe quand on ecrit du code (compact avec le moin de saut inutile possible, dans l'ideal des sauts que sur des boucles, car dans ce cas la on arrive a maintenir dans le cache la ligne du debut de la boucle). Par contre, il faut eviter de mettre des grosses data dans le code (typiquement des chaines de caractere), car elles seront dans ce cas la dans les caches instructions et non data (Ca ne concerne pas les constantes numeriques qui peuvent tenir sous la forme d'une valeur immediate dans une instruction). Ca arrive des fois lorsqu'on initialize des variables dans des fonctions.
Bon, c'est super simplifie encore comme description du systeme memoire, car il y a vraiment beaucoup de chose qui peuvent intervenir, mais pour simplifier, plus tu utilises la memoire de maniere contigue et compact, aussi bien pour les instructions que les data plus tu es efficace. Et ne pas oublier que lorsque tu alloues de la memoire, c'est pour l'utiliser.
PS: L'approche la plus extremiste de cette demarche est de compresser les donnees en RAM comme explique lors de [1]. Ca marche exessivement bien sur les bases de donnees, mais ca n'est pas forcement trivial a utiliser.
# Fonctionnement des mecanismes de cache
Posté par cedric . En réponse au journal La mémoire, goulot d'étranglement : optimiser le cache processeur.. Évalué à 6.
C'est vraiment simplifier car il y a plein de mecanique supplementaire qui rentre en ligne de compte. Par exemple les TLB miss qui peuvent aussi impacter lourdement les requetes memoires si jamais les donnees ne sont pas toutes dans la meme page de memoire virtuelle.
Enfin tu as souvent des caches differents pour les data et les instructions, aussi bien au niveau de la TLB que des caches memoire proprement dit, donc grosso modo les meme regles existe quand on ecrit du code (compact avec le moin de saut inutile possible, dans l'ideal des sauts que sur des boucles, car dans ce cas la on arrive a maintenir dans le cache la ligne du debut de la boucle). Par contre, il faut eviter de mettre des grosses data dans le code (typiquement des chaines de caractere), car elles seront dans ce cas la dans les caches instructions et non data (Ca ne concerne pas les constantes numeriques qui peuvent tenir sous la forme d'une valeur immediate dans une instruction). Ca arrive des fois lorsqu'on initialize des variables dans des fonctions.
Bon, c'est super simplifie encore comme description du systeme memoire, car il y a vraiment beaucoup de chose qui peuvent intervenir, mais pour simplifier, plus tu utilises la memoire de maniere contigue et compact, aussi bien pour les instructions que les data plus tu es efficace. Et ne pas oublier que lorsque tu alloues de la memoire, c'est pour l'utiliser.
PS: L'approche la plus extremiste de cette demarche est de compresser les donnees en RAM comme explique lors de [1]. Ca marche exessivement bien sur les bases de donnees, mais ca n'est pas forcement trivial a utiliser.
[1]: http://wiki.whatthehack.org/index.php/Database_Compression_Between_(...)