9
votes

Protocole de cache Mesi

Je lisais sur le protocole de cohérence de cache MESI Snooping , que je suppose que le protocole qui est utilisé dans les processeurs multicœurs modernes X86 (veuillez me corriger si je me trompe). Maintenant que cet article le dit à un endroit.

Un cache qui détient une ligne dans l'état modifié doit snoop (intercepter) tout tenté de lire (de tous les autres caches du système) de la Emplacement de la mémoire principale correspondant et insérez les données qu'il contient. C'est généralement fait en forçant la lecture à l'arrière (c'est-à-dire réessayer plus tard), puis écrivez les données à la mémoire principale et à modifier la ligne de cache à l'état partagé.

Maintenant ce que je ne comprends pas, c'est pourquoi les données doivent être écrites dans la mémoire principale. La cohérence de cache ne peut-elle pas conserver le contenu dans les caches synchronisées sans aller à la mémoire (sauf si la ligne de cache n'est vraiment expulsée)? Je veux dire que si un noyau lit constamment et l'autre écrit constamment, pourquoi ne pas conserver les données dans la mémoire cache et continuer à mettre à jour les données dans le cache. Pourquoi encourager la performance de la rédaction à la mémoire principale?

En d'autres termes, les noyaux ne peuvent pas lire les données, lire directement dans le cache du noyau d'écriture et modifier leur cache en conséquence?


0 commentaires

5 Réponses :


1
votes

Ce que je ne comprends pas, c'est pourquoi les données doivent être écrites dans le Mémoire principale p>

Le processeur A A est celui modifié code> ligne. Maintenant, le processeur B tente de lire ce même cache (modifié par a) de la mémoire principale. Étant donné que le contenu de la mémoire principale est invalide maintenant (car une modification du contenu), A Snooping de toute autre tentative de lecture de cette ligne. Donc, afin d'autoriser le processeur B (et d'autres) de lire cette ligne, A doit l'écrire à la mémoire principale. P>

I mean if one core is constantly reading and the other constantly writing,


3 commentaires

Ce que je voulais dire par ne pas écrire à la mémoire était que nous ne pouvons pas faire de telle sorte que le mécanisme de cohérence de cache lit les données du cache du noyau d'écriture et la transmettent à ceux qui le lisent. Est-il nécessaire de commencer par écrire en mémoire et ensuite la lire à partir de là. Les noyaux de lecture ne peuvent-ils pas lire directement dans la cache du noyau d'écriture?


Une ligne modifiée ne peut être conservée que par un processeur aussi longtemps que c'est le seul processeur qui possède cette copie (MESI). Ce que vous dites ne peut pas faire, parce que c'est plus cher. Supposons que les deux A & B partagent que la ligne et B l'obtiennent directement de la ligne de cache d'A et d'une autre, selon C, a besoin de cette ligne pour une écriture, puis A & B aura lieu à la nageur. Comme les copies partagées grandissent, il aura alors un impact plus important sur la performance due à la nageur effectuée par tous les processeurs «partagés». C'est pourquoi cela n'est pas fait.


De plus, Mesi utilise un cache à dos d'écriture pour réduire les écrits à la mémoire principale dans la mesure du possible.



3
votes

Le protocole MESI n'autorise pas plus d'un cache de conserver la même ligne de cache dans un état modifié. Donc, si une ligne de cache est modifiée et souhaite être lue à partir de l'autre cache du processeur, elle doit alors être d'abord écrite à la mémoire principale, puis lire, de sorte que les deux processeurs se cache maintenant partager que ligne (état partagé)


0 commentaires

2
votes

Parce que les caches ne sont généralement pas capables d'écrire directement les uns dans les autres (comme cela prendrait plus de bande passante).


0 commentaires

6
votes

Maintenant ce que je ne comprends pas, c'est pourquoi les données doivent être écrites dans la mémoire principale. Net la cohérence de cache conserve le contenu dans les caches synchronisées sans aller la mémoire (sauf si la ligne de cache n'est vraiment expulsée)?

Cela se produit.

J'ai sur mon ordinateur portable une icore 5 qui ressemble à ceci; xxx

lorsque deux noyaux logiques fonctionnent sur le mêmes données, ils ne déménagent pas vers la mémoire principale; Ils échangent sur les caches L1 et L2. De même, lorsque les noyaux des deux processeurs fonctionnent, ils échangent des données sur le cache L3. La mémoire principale n'est pas utilisée à moins que l'expulsion se produise.

mais un processeur plus simple pourrait en effet être moins intelligent sur les choses.


0 commentaires

1
votes

En fait, je ne pense pas que le cache de lecture doit aller à la mémoire principale. À Mesi, lorsqu'un processeur demande un bloc modifié par l'un de ses pairs, il délivre une erreur de lecture sur le bus (ou tout support d'interconnexion), qui est diffusé à chaque processeur.

Le processeur qui maintient le bloc dans l'état "modifié" attrape l'appel et émettez une copie sur le bus - tenant l'ID de bloc et la valeur - tout en modifiant son propre état de copie sur "partagé". Cette copie reçue est reçue par le processeur demandeur, qui écrira le bloc dans son cache local et l'étiquetera comme "partagé".

Cela dépend de la mise en œuvre si la récupération de la copie émise par le processeur de possession passe à la mémoire principale ou non.

EDIT: Notez que le protocole Moesi ajoutez un état "appartenant" très similaire à "partagé" et permet à un processeur qui détient une copie d'un bloc, dans l'état appartenant, de copier la valeur dans le bus s'il Attrape une erreur écrite / lecture diffusée pour ce bloc.


0 commentaires