Quand le cache du processeur est-il vidé de nouveau dans la mémoire principale?


18

Si j'ai un processeur avec deux cœurs, chaque cœur a son propre cache L1, est-il possible que Core1 et Core2 mettent en cache une même partie de la mémoire en même temps?
Si c'est possible, quelle sera la valeur de la mémoire principale si Core1 et Core2 ont modifié leur valeur dans le cache?

Réponses:


26

Si j'ai un processeur avec deux cœurs, chaque cœur a son propre cache L1, est-il possible que Core1 et Core2 mettent en cache une même partie de la mémoire en même temps?

Oui. Les performances seraient terribles si ce n'était pas le cas. Considérez deux threads exécutant le même code. Vous voulez ce code dans les deux caches L1.

Si c'est possible, quelle sera la valeur de la mémoire principale si Core1 et Core2 ont modifié leur valeur dans le cache?

L'ancienne valeur sera dans la mémoire principale, ce qui n'aura pas d'importance car aucun CPU ne la lira. Avant d'éjecter une valeur modifiée du cache, elle doit être écrite en mémoire. Généralement, une variante du protocole MESI est utilisée. Dans l'implémentation traditionnelle de MESI, si une valeur est modifiée dans un cache, elle ne peut pas du tout être présente dans un autre cache de ce même niveau.


15

Oui, cela (avoir deux caches en cache dans la même région de mémoire) peut se produire, en fait c'est un problème qui se produit souvent dans la pratique. Il existe différentes solutions, par exemple:

  • les deux caches peuvent communiquer pour s'assurer qu'elles ne sont pas en désaccord
  • vous pouvez avoir une sorte de superviseur qui surveille tous les caches et les met à jour en conséquence
  • chaque processeur surveille les zones de mémoire qu'il a mises en cache, et lorsqu'il détecte une écriture, il jette son cache (désormais invalide)

Le problème est appelé cohérence du cache . L' article de Wikipédia sur le sujet a un bon aperçu du problème et des solutions possibles.


2

Pour répondre à la question dans votre titre, cela dépend du protocole de mise en cache. S'il s'agit d'une réécriture, le cache ne sera vidé de nouveau dans la mémoire principale que lorsque le contrôleur de cache n'a pas d'autre choix que de placer un nouveau bloc de cache dans l'espace déjà occupé. Le bloc qui occupait précédemment l'espace est supprimé et sa valeur est réécrite dans la mémoire principale.

L'autre protocole est à écriture directe. Dans ce cas, chaque fois que le bloc de cache est écrit au niveau n, le bloc correspondant au niveau (n + 1) est mis à jour. (Le concept est similaire au remplissage d'un formulaire avec du papier carbone en dessous; tout ce que vous écrivez en haut est copié sur la feuille ci-dessous.) C'est plus lent car cela implique évidemment plus d'opérations d'écriture, mais les valeurs entre les caches sont plus cohérentes. Dans le schéma d'écriture différée, seul le cache de plus haut niveau aurait la valeur la plus à jour pour un bloc de mémoire particulier.


1
Je me demande quel pourcentage de lecteurs ici ont déjà utilisé du papier carbone. :)
Barmar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.