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ère | Allocation en écriture | Sans allocation en écriture |
|---|---|---|
| En cas de défaut d’écriture | Lit la ligne entière au niveau inférieur, la place dans le cache puis y écrit | Laisse 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émoire | Inutile ; seules les données écrites sont envoyées au niveau inférieur |
| Association habituelle | Write-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 initiale | Write-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érieur | Plus faible quand la même ligne est écrite plusieurs fois ou que les données écrites sont relues | Chaque é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 cache | Ni lecture ni pollution du cache : adapté à ce type de données |
| Lecture juste après l’écriture | La ligne est dans le cache, la lecture réussit donc | La ligne n’est pas dans le cache, la lecture fait donc défaut et charge la ligne |
| Techniques d’implémentation | Pour 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 contenu | Un tampon d’écriture masque la latence d’écriture et fusionne souvent plusieurs écritures dans la même ligne en un seul transfert |
| Usages | Courant dans les caches write-back ; la plupart des caches L1 à L3 des CPU sont en write-back | Courant 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.