Écriture différée vs mise en cache d'écriture directe?

93

Je crois comprendre que la principale différence entre les deux méthodes est que dans la méthode «écriture immédiate», les données sont écrites dans la mémoire principale via le cache immédiatement, tandis que dans la «réécriture», les données sont écrites dans un «dernier temps».

Nous devons encore attendre la mémoire dans le «dernier temps» alors quel est l'avantage de «l'écriture directe»?

Naftaly
la source
@EricWang Je pense que vous voulez dire qu'il write backa de meilleures performances?
wlnirvana
@wlnirvana Oui, vous avez raison, c'est mon erreur d'écriture. Je le supprimerais et ajouterais un nouveau commentaire ici pour éviter de futures induire en erreur.
Eric Wang
6
En termes simples, write backa de meilleures performances, car l'écriture dans la mémoire principale est beaucoup plus lente que l'écriture dans le cache du processeur, et les données peuvent être courtes pendant (cela peut changer plus tôt et il n'est pas nécessaire de mettre l'ancienne version en mémoire). C'est complexe, mais plus sophistiqué, la plupart des mémoires des processeurs modernes utilisent cette politique.
Eric Wang
Je vois qu'une réponse explicative a été donnée. Je vous conseille de regarder les balises Write-Allocate, Write-NoAllocate après avoir couvert l'algorithme de réécriture.
Çağlayan DÖKME
La réponse à votre question est qu'avec la mise en cache d'écriture directe, lors de l'écriture dans le même bloc, une seule écriture dans la mémoire principale est nécessaire. Voir ma réponse pour plus de détails.
qwr

Réponses:

111

L'avantage de l'écriture directe dans la mémoire principale est qu'elle simplifie la conception du système informatique. Avec l'écriture directe, la mémoire principale a toujours une copie à jour de la ligne. Ainsi, lorsqu'une lecture est effectuée, la mémoire principale peut toujours répondre avec les données demandées.

Si la réécriture est utilisée, les données mises à jour se trouvent parfois dans un cache du processeur et parfois dans la mémoire principale. Si les données se trouvent dans un cache de processeur, ce processeur doit alors empêcher la mémoire principale de répondre à la demande de lecture, car la mémoire principale peut avoir une copie périmée des données. C'est plus compliqué que l'écriture directe.

En outre, l'écriture directe peut simplifier le protocole de cohérence du cache car il n'a pas besoin de l' état Modifier . L' état Modifier indique que le cache doit réécrire la ligne de cache avant d'invalider ou d'expulser la ligne. En écriture directe, une ligne de cache peut toujours être invalidée sans réécriture car la mémoire a déjà une copie à jour de la ligne.

Une dernière chose - sur une architecture à écriture différée, un logiciel qui écrit dans des registres d'E / S mappés en mémoire doit prendre des mesures supplémentaires pour s'assurer que les écritures sont immédiatement envoyées hors du cache. Sinon, les écritures ne sont pas visibles à l'extérieur du cœur tant que la ligne n'est pas lue par un autre processeur ou que la ligne n'est pas expulsée.

Craig S. Anderson
la source
7
Pour les E / S mappées en mémoire, ces adresses sont généralement mappées comme non mises en cache. L'écriture directe peut également être utilisée pour augmenter la fiabilité (par exemple, si L1 a uniquement une protection de parité et L2 a ECC). L'écriture directe est également plus populaire pour les caches plus petits qui n'utilisent pas d'allocation d'écriture (c'est-à-dire qu'un échec d'écriture n'alloue pas le bloc au cache, ce qui réduit potentiellement la demande de capacité L1 et de lecture L2 / de bande passante de remplissage L1) car une grande partie du matériel l'exigence d'écriture directe est déjà présente pour une telle écriture.
Paul A. Clayton
1
est-il possible de vérifier si ma méthode de cache dans mon noyau est en écriture différée ou en écriture directe?
ArtificiallyIntelligence
4
Il peut être trompeur de dire que la réécriture est plus complexe car le processeur doit empêcher la mémoire principale de répondre à la demande de lecture. C'est plus que le cache garde une trace de quelles données sont des données (non alignées avec la mémoire principale) et ce qui ne l'est pas en utilisant des "bit (s) sales", il est donc possible de ne pas vérifier du tout la mémoire principale.
steviejay
@Shaowu "lshw" commande qui affiche des capacités de cache comme "écriture
différée
Je ne comprends toujours pas quelles sont les étapes réelles de la réécriture, mais sachez que c'est compliqué ... Pouvez-vous fournir plus de ressources / détails à ce sujet?
qwerty9898 du
10

Regardons cela à l'aide d'un exemple. Supposons que nous ayons un cache mappé direct et que la politique de réécriture soit utilisée. Nous avons donc un bit valide, un bit sale, une balise et un champ de données dans une ligne de cache. Supposons que nous ayons une opération: écrire A (où A est mappé sur la première ligne du cache).

Ce qui se passe, c'est que les données (A) du processeur sont écrites sur la première ligne du cache. Le bit valide et les bits d'étiquette sont définis. Le bit sale est mis à 1.

Un bit sale indique simplement que la ligne de cache a été écrite depuis sa dernière mise en cache!

Supposons maintenant qu'une autre opération soit effectuée: lisez E (où E est également mappé à la première ligne de cache)

Puisque nous avons un cache mappé directement, la première ligne peut simplement être remplacée par le bloc E qui sera apporté de la mémoire. Mais comme le dernier bloc écrit dans la ligne (bloc A) n'est pas encore écrit dans la mémoire (indiqué par le bit sale), le contrôleur de cache émettra d'abord une réécriture dans la mémoire pour transférer le bloc A en mémoire, puis il remplacera la ligne par le bloc E en émettant une opération de lecture dans la mémoire. Le bit sale est maintenant mis à 0.

La politique de réécriture ne garantit donc pas que le bloc sera le même en mémoire et dans sa ligne de cache associée. Cependant, chaque fois que la ligne est sur le point d'être remplacée, une réécriture est effectuée dans un premier temps.

Une politique d'écriture directe est exactement le contraire. Selon cela, la mémoire aura toujours des données à jour. Autrement dit, si le bloc de cache est écrit, la mémoire sera également écrite en conséquence. (pas d'utilisation de bits sales)

Rajat
la source
7

peut-être que cet article peut vous aider à créer un lien ici

Écriture directe: l'écriture est effectuée de manière synchrone à la fois dans le cache et dans le magasin de sauvegarde.

Écriture différée (ou écriture différée): l'écriture est effectuée uniquement dans le cache. Un bloc de cache modifié est réécrit dans le magasin, juste avant d'être remplacé.

Écriture immédiate: lorsque les données sont mises à jour, elles sont écrites à la fois dans le cache et dans le stockage principal. Ce mode est facile à utiliser mais est lent dans l'écriture des données car les données doivent être écrites à la fois dans le cache et dans le stockage.

Réécriture: lorsque les données sont mises à jour, elles sont écrites uniquement dans le cache. Les données modifiées sont écrites dans le stockage principal uniquement lorsque les données sont supprimées du cache. Ce mode a une vitesse d'écriture de données rapide, mais les données seront perdues en cas de panne de courant avant que les données mises à jour ne soient écrites sur le stockage.

Shengmin Zhao
la source
3

L'écriture différée et l'écriture directe décrivent les politiques lorsqu'un succès d'écriture se produit, c'est-à-dire lorsque le cache contient les informations demandées. Dans ces exemples, nous supposons qu'un seul processeur écrit dans la mémoire principale avec un cache.

Écriture immédiate: les informations sont écrites dans le cache et la mémoire, et l'écriture se termine lorsque les deux sont terminés. Cela a l'avantage d'être plus simple à mettre en œuvre, et la mémoire principale est toujours cohérente (en synchronisation) avec le cache (pour le cas monoprocesseur - si un autre périphérique modifie la mémoire principale, alors cette politique ne suffit pas), et un échec de lecture n'entraîne jamais d'écriture dans la mémoire principale. L'inconvénient évident est que chaque hit d'écriture doit faire deux écritures, dont l'une accède à la mémoire principale plus lente.

Réécriture: les informations sont écrites dans un bloc du cache. Le bloc de cache modifié n'est écrit en mémoire que lorsqu'il est remplacé (en fait, une écriture différée ). Un bit spécial pour chaque bloc de cache, le bit sale , marque si le bloc de cache a été modifié ou non dans le cache. Si le bit modifié n'est pas défini, le bloc de cache est "propre" et un échec d'écriture n'a pas besoin d'écrire le bloc en mémoire.

L'avantage est que les écritures peuvent se produire à la vitesse du cache, et si l'écriture dans le même bloc, une seule écriture dans la mémoire principale est nécessaire (lorsque le bloc précédent est remplacé). Les inconvénients sont que ce protocole est plus difficile à implémenter, la mémoire principale peut ne pas être cohérente (pas synchronisée) avec le cache et les lectures qui entraînent un remplacement peuvent provoquer des écritures de blocs sales dans la mémoire principale.

Les politiques pour un échec d'écriture sont détaillées dans mon premier lien.

Ces protocoles ne prennent pas en charge les cas avec plusieurs processeurs et plusieurs caches, comme cela est courant dans les processeurs modernes. Pour cela, des mécanismes de cohérence de cache plus compliqués sont nécessaires. Les caches d'écriture directe ont des protocoles plus simples puisqu'une écriture dans le cache est immédiatement reflétée dans la mémoire.

Bonnes ressources:

qwr
la source
0

La réécriture est plus complexe et nécessite un protocole MOESI (Cache Coherence Protocol) compliqué, mais cela en vaut la peine car cela rend le système rapide et efficace.

Le seul avantage de l'écriture directe est qu'elle rend la mise en œuvre extrêmement simple et qu'aucun protocole compliqué de cohérence de cache n'est requis.

Gaurav Toshniwal
la source
1
WT a encore besoin d'un protocole de cohérence. Un magasin d'un cœur doit toujours invalider les copies dans d'autres caches afin qu'ils ne continuent pas à lire des données obsolètes indéfiniment. Atomic RMW a besoin d'un support spécial. Tout cela est plus facile avec WT, je pense, mais la cohérence requise est encore un peu compliquée.
Peter Cordes
Ou peut-être parliez-vous d'un système monocœur avec une hiérarchie de cache de L1 / L2 (et peut-être plus). Dans ce cas, vous n'avez pas vraiment besoin d'utiliser MESI / MOESI pour les caches internes qui récupèrent les caches externes, à moins que vous ne souhaitiez prendre en charge le DMA cohérent avec le cache qui peut accéder à la direction de cache la plus externe. Mais alors vous avez toujours besoin de cohérence pour qu'une écriture DMA invalide le cache interne.
Peter Cordes
1
Le protocole de cohérence du cache n'est nécessaire que s'il faut prendre en charge plusieurs caches / processeurs ou si quelque chose affecte la mémoire comme DMA. L'écriture directe a ses avantages même pour les systèmes à processeur unique, à savoir la vitesse d'écriture.
qwr
Pour DMA, le système d'exploitation peut vider explicitement le cache après les E / S. Étant un logiciel, il est moins efficace.
qwr