Allocation en écriture vs sans allocation : défaut d’écriture, trafic, associations

L’allocation en écriture (write allocate) et la non-allocation (no-write-allocate) sont des politiques qui décident si une ligne est chargée dans le cache lorsqu’une écriture fait défaut. Avec l’allocation en écriture, le cache lit d’abord la ligne au niveau inférieur, puis effectue l’écriture dans le cache. Sans allocation, la ligne n’est pas chargée et l’écriture est envoyée directement au niveau inférieur. C’est un choix distinct de celui entre write-back et write-through, qui déterminent quand une écriture réussie atteint le niveau inférieur, mais l’allocation en écriture est généralement associée au write-back et la non-allocation au write-through.

CritèreAllocation en écritureSans allocation en écriture
En cas de défaut d’écritureLit la ligne entière au niveau inférieur, la place dans le cache puis y écritLaisse le cache intact et envoie l’écriture directement au niveau inférieur
Remplissage de ligne (lecture)Nécessaire. Sur les systèmes multicœurs, c’est une lecture pour possession (RFO) qui invalide les copies des autres cœurs avant l’écriture : un défaut de store apparaît donc comme une lecture sur le bus mémoireInutile ; seules les données écrites sont envoyées au niveau inférieur
Association habituelleWrite-back : les écritures suivantes dans la ligne chargée réussissent et sont absorbées sans trafic mémoire, ce qui amortit le coût de la lecture initialeWrite-through : chaque écriture part de toute façon au niveau inférieur, charger la ligne ne réduirait donc pas le trafic d’écriture
Trafic vers le niveau inférieurPlus faible quand la même ligne est écrite plusieurs fois ou que les données écrites sont reluesChaque écriture en défaut part à chaque fois, mais aucune lecture supplémentaire n’est générée
Gros volumes de données seulement écrites (effacement de mémoire, écriture de résultats)Chaque ligne est lue uniquement pour être écrasée puis réécrite plus tard, ce qui double à peu près le trafic, et des données utiles sont évincées du cacheNi lecture ni pollution du cache : adapté à ce type de données
Lecture juste après l’écritureLa ligne est dans le cache, la lecture réussit doncLa ligne n’est pas dans le cache, la lecture fait donc défaut et charge la ligne
Techniques d’implémentationPour les données seulement écrites, les stores non temporels (streaming) contournent le cache et envoient des écritures regroupées directement en mémoire principale ; certaines ISA ont aussi une instruction qui met à zéro une ligne entière sans lire son ancien contenuUn tampon d’écriture masque la latence d’écriture et fusionne souvent plusieurs écritures dans la même ligne en un seul transfert
UsagesCourant dans les caches write-back ; la plupart des caches L1 à L3 des CPU sont en write-backCourant dans les caches write-through, comme un petit L1 adossé à un L2 en write-back, ou dans les processeurs embarqués simples

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Allocation en écriture
Lorsque les données écrites seront bientôt relues ou réécrites, comme dans une boucle qui met à jour les éléments d’un tableau : des écritures présentant une localité temporelle.
Sans allocation en écriture
Lorsqu’on écrit une grande quantité de données qui ne seront pas relues avant longtemps. Cela évite des lectures inutiles et garde le cache disponible pour les données utiles.
Côté logiciel
Même avec un cache à allocation en écriture, les stores non temporels évitent la lecture des lignes pour les grands tampons seulement écrits. Les données écrites ne restent cependant pas dans le cache : les relire immédiatement est donc plus lent.

Questions fréquentes

Quelle est la différence entre allocation en écriture et non-allocation ?

En cas de défaut d’écriture, l’allocation en écriture charge la ligne dans le cache puis y écrit. La non-allocation ne charge pas la ligne et écrit directement au niveau inférieur.

Le write-through utilise-t-il toujours la non-allocation ?

Pas toujours. La propagation d’une écriture réussie (write-back ou write-through) et le chargement ou non d’une ligne en cas de défaut sont des choix distincts. En pratique, toutefois, le write-through est généralement associé à la non-allocation et le write-back à l’allocation en écriture. Dans un cache write-through, un store qui réussit met à jour la copie en cache et est aussi écrit au niveau inférieur ; un store en défaut est normalement envoyé directement vers le bas sans charger la ligne.

Pourquoi l’allocation en écriture est-elle lente pour les données seulement écrites ?

Parce que chaque ligne qui sera simplement écrasée est d’abord lue en mémoire principale. Cette lecture, plus la réécriture ultérieure, double à peu près le trafic et évince aussi d’autres données qui auraient été réutilisées. Les stores non temporels évitent cette lecture.

Vérifier vos connaissances

Quelle politique, lors d’un défaut d’écriture, écrit directement au niveau inférieur sans charger la ligne ?

  1. AAllocation sur écriture
  2. BÉcriture différée
  3. CNon-allocation sur écriture
Afficher la réponse et l'explication

Réponse : C. Non-allocation sur écriture

La politique qui, lors d’un défaut d’écriture, écrit directement au niveau inférieur sans charger la ligne est la non-allocation sur écriture, souvent associée à l’écriture immédiate. Pour des données écrites puis non relues, elle évite des chargements inutiles. L’allocation sur écriture charge au contraire la ligne avant d’écrire ; avantageuse lorsque la donnée écrite est réutilisée rapidement, elle est souvent associée à l’écriture différée. L’écriture différée détermine le traitement des écritures en succès, ce qui constitue un axe distinct du chargement ou non lors d’un défaut.

Pour écrire de gros volumes de données qui ne seront pas relus avant longtemps, quel est le principal avantage des écritures qui contournent le cache (écritures non temporelles) ?

  1. ALes données écrites restent longtemps dans le cache et sont plus rapides à relire ensuite
  2. BLe cache n’est pas rempli par des données qui ne seront pas réutilisées
  3. CL’ordre des écritures n’étant plus garanti, les erreurs de programme sont plus faciles à détecter
Afficher la réponse et l'explication

Réponse : B. Le cache n’est pas rempli par des données qui ne seront pas réutilisées

Une écriture ordinaire, avec allocation sur écriture, charge la ligne depuis la mémoire principale avant d’écrire ; même des données seulement écrites génèrent un trafic de lecture et évincent d’autres données réutilisées. Les écritures non temporelles regroupent les écritures et les envoient directement en mémoire principale, sans polluer le cache et sans chargement inutile. Les données écrites ne restant pas dans le cache, une relecture immédiate est au contraire plus lente. Le changement de l’ordonnancement est un effet secondaire, et non un avantage.

Pour un traitement qui écrit de nombreuses fois dans la même ligne, quelle est la principale raison pour laquelle l’écriture différée est plus avantageuse que l’écriture immédiate ?

  1. ALes écritures restent dans le cache, et une seule écriture en mémoire principale suffit lors de l’éviction
  2. BLa mémoire principale est mise à jour à chaque écriture, ce qui supprime tout traitement à l’éviction
  3. CLe contenu du cache et celui de la mémoire principale concordent toujours, ce qui rend la gestion de la cohérence inutile
Afficher la réponse et l'explication

Réponse : A. Les écritures restent dans le cache, et une seule écriture en mémoire principale suffit lors de l’éviction

En écriture différée, les écritures répétées dans une même ligne restent dans le cache ; il suffit de réécrire une fois la ligne modifiée lors de son éviction. Le trafic vers la mémoire principale et la consommation diminuent ainsi fortement. La mise à jour de la mémoire principale à chaque écriture caractérise l’écriture immédiate, qui génère un transfert à chaque écriture dans la même ligne. La concordance permanente entre cache et mémoire principale est aussi une propriété de l’écriture immédiate ; en écriture différée, il existe des périodes de divergence.

  1. Parmi les politiques d'écriture du cache, quelle description de l'écriture différée (write-back) est correcte ?
  2. Dans un cache à écriture immédiate, quel est le but principal d’un tampon d’écriture ?
  3. Dans un cache à écriture différée, quel est le rôle du bit modifié (dirty bit) associé à chaque ligne ?

Questions d'entraînement sur Hiérarchie mémoire

Termes clés expliqués

Allocation en écriture (write allocate)
Politique qui, lors d'un défaut de cache en écriture, charge la ligne dans le cache avant d'écrire. Souvent combinée à l'écriture différée (write-back). La politique qui écrit directement au niveau inférieur sans charger est la non-allocation en écriture (no-write allocate).
Écriture immédiate (write-through)
Méthode qui écrit dans le niveau inférieur (mémoire principale, etc.) en même temps que dans le cache. Le niveau inférieur est toujours à jour, mais le trafic d'écriture est important ; on la combine avec un tampon d'écriture.
Ligne de cache
Unité de transfert de données entre le cache et le niveau inférieur, aussi appelée bloc de cache. Elle fait 64 octets sur la plupart des CPU ; les bits de poids faible de l'adresse donnent la position (offset) dans la ligne.
Mémoire cache
Mémoire rapide de faible capacité placée près du CPU. Elle conserve les données fréquemment utilisées pour compenser l'écart de vitesse avec la mémoire principale. Réalisée principalement en SRAM.
Localité temporelle
Propriété selon laquelle une donnée ou une instruction déjà accédée a de fortes chances d'être de nouveau accédée prochainement. Les variables réutilisées dans une boucle en sont un exemple ; c'est l'une des raisons de l'efficacité des caches.
Cohérence de cache
Mécanisme qui maintient la cohérence du contenu lorsque les caches de plusieurs cœurs d'un CPU multicœur contiennent des données de même adresse. Lorsqu'un cœur écrit, les anciennes copies des autres cœurs sont par exemple invalidées.

Comparatifs associés