Une mémoire cache ou antémémoire est, en informatique, une mémoire qui enregistre temporairement des copies de données provenant d'une source, afin de diminuer le temps d'un accès ultérieur (en lecture) d'un matériel informatique (en général, un processeur) à ces données. Le principe du cache est également utilisable en écriture, et existe alors en trois modes possibles : write-through, write-back et write-around..

La mémoire cache, plus rapide et plus proche du matériel informatique qui demande la donnée, est plus petite — en raison de ses performances — que la mémoire pour laquelle elle sert d'intermédiaire. Commercialement, la notion de cache est apparue sur le macroordinateur IBM 360/85 en 1968.

Des mécanismes de mémoires cache peuvent être placés entre tous producteurs et consommateurs de données fonctionnant de façon asynchrone, par exemple processeur et mémoire vive, réseau et espace applicatif, disque dur

Techniquement, il est avantageux de gérer séparément les données non modifiables (illustrations d'un site distant, section de code d'un programme) et celles qui sont modifiables (formulaire, sections de données). Les processeurs ont par exemple le plus souvent des caches séparés pour le code et les données.

Dans le cas des microprocesseurs, taille et performance de ces caches, externes ou internes, peuvent très fortement influencer la vitesse de traitement des programmes. Il est possible de le mesurer par inhibition totale ou partielle du cache, ou par changement de sa taille s'il est externe.

Dans le cas des caches internes, la place utilisée par les transistors du cache dans le wafer conditionne son coût de fabrication. La mémoire cache est d'autant plus utile que l'algorithme à exécuter demande des accès répétitifs à de petites zones de mémoire : section de code qui se répète (boucle) ; callbacks en programmation objet ; etc.

Quand le processeur est capable de prédire grosso modo ses besoins futurs en données, il peut alimenter à l'avance le cache, ce qui se nomme du prefetch.

Dénomination Mémoire cache est la même expression que celle utilisée en anglais, à savoir L'expression est apparue dans « Structural aspects of the system/360 model 85 (II) the cache », J. S. Liptay, IBM Systems Journal, janvier 1968., qui a remplacé « », donné par son inventeur Maurice Vincent Wilkes en 1965. La Commission d'enrichissement de la langue française propose d'utiliser plutôt le terme « antémémoire ». Publié dans le Journal officiel du 20/04/2007..

La différence entre mémoire cache et mémoire tampon réside dans le fait que la mémoire cache duplique l'information, tandis que le tampon peut exprimer l'idée d'une salle d'attente, sans impliquer nécessairement de duplication. Le (tampon de cache) du disque ou (cache de disque) est à la fois un tampon où transite l'information et une mémoire cache qui recopie sous forme électronique les données stockées dans le disque sous forme magnétique.

La différence essentielle entre les caches disque et mémoire est que l'on dispose de très peu de temps dans le second cas pour déterminer où ranger ce que l'on cache. Lorsqu'on cache un disque, on peut choisir avec soin où placer chaque information en fonction des caractéristiques des pages. L'antémémoire des IBM 370, n'ayant droit qu'à un cycle mineur pour prendre sa décision, utilise arbitrairement les bits de poids faible de l'adresse mémoire comme adresse du cadre de page associé. Il revient alors au compilateur d'éviter de son mieux les collisions potentielles.

Fonctionnement Le cache contient une copie des données originelles lorsqu'elles sont coûteuses (en termes de temps d'accès) à récupérer ou à calculer par rapport au temps d'accès au cache. Une fois les données stockées dans le cache, on y accède directement par le cache plutôt qu'en les récupérant ou en les recalculant, ce qui diminue le temps d'accès moyen.

Le processus fonctionne ainsi : l'élément demandeur (microprocesseur) demande une information ; le cache vérifie s'il possède cette information. S'il la possède, il la retransmet à l'élément demandeur – on parle alors de succès de cache (cache hit en anglais). S'il ne la possède pas, il la demande à l'élément fournisseur (mémoire principale par exemple) – on parle alors de défaut de cache (cache miss) ; l'élément fournisseur traite la demande et renvoie la réponse au cache ; le cache la stocke pour utilisation ultérieure au besoin et la retransmet à l'élément demandeur ; si le cache ne dispose pas d'un emplacement libre utilisable pour cette donnée, il doit faire de la place en sortant du cache une donnée qui y est présente, choisie selon une politique de remplacement (ou politique d'éviction).

Si les mémoires cache permettent d'accroître les performances, c'est en partie grâce à deux principes qui ont été découverts à la suite d'études sur le comportement des programmes informatiques : le principe de localité spatiale qui indique que l'accès à une donnée située à une adresse X va probablement être suivi d'un accès à une zone très proche de X. C'est évidemment vrai dans le cas d'instructions exécutées en séquence, et plus vrai encore pour les boucles courtes. le principe de localité temporelle qui indique que l'accès à une zone mémoire à un instant donné a de fortes chances de se reproduire dans la suite immédiate du programme. C'est évidemment vrai dans le cas des boucles de quelques instructions seulement.

Concernant le calcul matriciel, le cache introduit en revanche de fortes dissymétries selon qu'on accède la matrice par lignes ou par colonnes, dissymétries d'autant plus importantes que la matrice est de grande taille. Un rapport du CNUCELinear algebra problems with APL2 : performance comparison on different platforms, Renzo Beltrame, rapport CNUCE (Centro Nazionale Universitario di Calcalo Electronico) C97-26, 1997 mentionne un écart de performances d'un facteur 8 à 10 pour des matrices dont la plus petite dimension est 50.

Divers niveaux de mémoire cache On trouve une zone de cache : dans les disques durs et la plupart des périphériques ; dans les serveurs proxy (dont les squids) ; dans les serveurs de pages dynamiques ; dans les mémoires gérées par les bases de données.

Dans les microprocesseurs, on différencie plusieurs niveaux de caches, souvent au nombre de trois : Le cache de premier niveau (L1), plus rapide et plus petit (cache de données pouvant être séparé du cache d'instructions) ; Le cache de second niveau (L2), moins rapide et plus gros ; Le cache de troisième niveau (L3), encore moins rapide et encore plus gros ; Ces derniers caches peuvent être situés dedans ou hors du microprocesseur.

Mémoire cache des microprocesseurs vignette|Différents niveaux de mémoire d'un microprocesseur.

Elle est très rapide, mais aussi très chère. Il s'agit souvent de SRAM.

La présence de mémoire cache permet d'accélérer l'exécution d'un programme. De ce fait, plus la taille de la mémoire cache est grande, plus la taille des programmes accélérés peut être élevée. Il y a cependant une limite au-delà de laquelle l'augmentation de la taille du cache ne sert plus à rien. En effet, dans les codes, il y a des branchements qui ne peuvent pas être prédits par les processeurs. À chaque branchement, la partie du code peut faire appel à une zone mémoire différente. C'est la raison pour laquelle, « l'horizon » au-delà duquel le microprocesseur ne peut voir s'il aura besoin de certaines données limite l’efficacité du cache. La taille du cache est un élément souvent utilisé par les constructeurs pour faire varier les performances d'un produit sans changer d'autres matériels. Par exemple, pour les microprocesseurs, on trouve des séries bridées (avec une taille de mémoire cache volontairement réduite), tels que les Duron chez AMD ou Celeron chez Intel, et des séries haut de gamme avec une grande mémoire cache comme les processeurs Opteron chez AMD, ou Pentium 4EE chez Intel. Autrement dit, la taille de la mémoire cache résulte d'un compromis coût/performance.

En programmation, pour profiter de l'accélération fournie par cette mémoire très rapide, il faut que les parties de programme tiennent le plus possible dans cette mémoire cache. Comme elle varie suivant les processeurs, ce rôle d'optimisation est souvent dédié au compilateur. Cela dit, un programmeur chevronné peut écrire son code d'une manière qui optimise l'utilisation du cache.

C'est le cas des boucles très courtes qui tiennent entièrement dans les caches de données et d'instruction, par exemple le calcul suivant (écrit en langage C) : long i; double s; s = 0.0; for (i = 1; i < 50000000; i++) s += 1.0 / i;

Définitions Une ligne le plus petit élément de données qui peut être transféré entre la mémoire cache et la mémoire de niveau supérieur. Un mot le plus petit élément de données qui peut être transféré entre le processeur et la mémoire cache.

Différents types de défauts de cache (miss) Il existe trois types de défauts de cache en système monoprocesseur et quatre dans les environnements multiprocesseurs. Il s'agit de : les défauts de cache obligatoires : ils correspondent à la première demande du processeur pour une donnée/instruction spécifique et ne peuvent être évités ; les défauts de cache capacitifs : l'ensemble des données nécessaires au programme excèdent la taille du cache, qui ne peut donc pas contenir toutes les données nécessaires ; les défauts de cache conflictuels : deux adresses distinctes de la mémoire de niveau supérieur sont enregistrées au même endroit dans le cache et s'évincent mutuellement, créant ainsi des défauts de cache ; les défauts de cohérence : ils sont dus à l'invalidation de lignes de la mémoire cache afin de conserver la cohérence entre les différents caches des processeurs d'un système multi-processeurs.

La correspondance (ou mapping) La mémoire cache ne pouvant contenir toute la mémoire principale, il faut définir une méthode indiquant à quelle adresse de la mémoire cache doit être écrite une ligne de la mémoire principale. Cette méthode s'appelle le mapping. Il existe trois types de mapping répandus dans les caches aujourd'hui : les mémoires caches complètement associatives (en anglais fully associative cache) ; les mémoires caches directes (en anglais direct mapped cache). les mémoires caches N-associatives (en anglais N-way set associative cache) ;

Cache pleinement associatif (en anglais fully associative cache)

Chaque ligne de la mémoire de niveau supérieur peut être écrite à n'importe quelle adresse de la mémoire cache. Cette méthode requiert beaucoup de logique car elle donne accès à de nombreuses possibilités. Ceci explique pourquoi l'associativité complète n'est utilisée que dans les mémoires cache de petite taille (typiquement de l'ordre de quelques kibioctets). Cela donne le découpage suivant de l'adresse :

Cache à correspondance préétablie (direct-mapped cache)

Chaque ligne de la mémoire principale ne peut être enregistrée qu'à une seule adresse de la mémoire cache, par exemple associée au modulo de son adresse. Cela crée de nombreux défauts de cache si le programme accède à des données en collision sur les mêmes adresses de la mémoire cache. La sélection de la ligne où la donnée sera enregistrée est habituellement obtenue par: Ligne = Adresse mod (Nombre de lignes x taille de la ligne en octets).

Une ligne de cache est partagée par de nombreuses adresses de la mémoire de niveau supérieur. Il nous faut donc un moyen de savoir quelle donnée est actuellement dans le cache. Cette information est donnée par le tag, qui est une information supplémentaire stockée dans le cache. L'index correspond à la ligne où est enregistrée la donnée. En outre, le contrôleur de la mémoire cache doit savoir si une adresse donnée contient une donnée ou non. Un bit additionnel (appelé bit de validité) est chargé de cette information.