20Aug
Si vous commencez tout juste à apprendre comment les processeurs multi-cœurs, la mise en cache, la cohérence du cache et la mémoire fonctionnent, cela peut sembler un peu déroutant au premier abord. Dans cet esprit, le SuperUser Q & A post d'aujourd'hui a des réponses à la question d'un lecteur curieux.
Question d'aujourd'hui &La session de réponse nous est offerte par SuperUser, une subdivision de Stack Exchange, un regroupement communautaire de sites Web Q & A.
La question Lecteur
SuperUser CarmeloS veut savoir quand la mémoire cache d'un CPU est renvoyée dans la mémoire principale:
Si j'ai une CPU avec deux cœurs et que chaque core a son propre cache L1, est-ce possible que Core1 et Core2partie 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é leurs valeurs dans le cache?
Quand le cache d'un CPU est-il renvoyé à la mémoire principale?
La réponse
SuperUser contributeurs David Schwartz, sleske, et Kimberly W ont la réponse pour nous. Tout d'abord, David Schwartz:
Si j'ai un processeur avec deux cœurs et que chaque cœur a son propre cache L1, est-il possible que Core1 et Core2 mettent en cache la même partie de la mémoire en même temps?
Oui, la performance serait terrible 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é leurs valeurs dans le cache?
L'ancienne valeur sera dans la mémoire principale, ce qui n'aura aucune importance car aucun core ne le lira. Avant d'éjecter une valeur modifiée du cache, elle doit être écrite en mémoire. Typiquement, 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 être présente dans aucun autre cache au même niveau.
Suivi de la réponse de sleske:
Oui, avoir deux caches cache la même région de mémoire peut arriver et est en fait un problème qui se produit beaucoup dans la pratique. Il existe différentes solutions, par exemple:
- Les deux caches peuvent communiquer pour s'assurer qu'ils ne sont pas en désaccord
- Vous pouvez avoir une sorte de superviseur qui surveille tous les caches et les met à jour
- Chaque processeur surveille les zones de mémoire qu'il a mises en cache, etquand il détecte une écriture, il jette son cache( maintenant invalide).
Le problème est appelé cohérence du cache et l'article de Wikipédia sur le sujet présente un bon aperçu du problème et des solutions possibles.
Et notre réponse finale de Kimberly W:
Pour répondre à la question dans le titre de votre message, cela dépend du protocole de mise en cache. S'il s'agit d'une ré-écriture, le cache ne sera renvoyé à la mémoire principale que si 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 en écriture immédiate. 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. Il est similaire dans le concept de remplir un formulaire avec du papier carbone en dessous;tout ce que vous écrivez dessus est copié sur la feuille ci-dessous. Ceci est plus lent car il implique évidemment plus d'opérations d'écriture, mais les valeurs entre les caches sont plus cohérentes. Dans le schéma de réécriture, seul le cache de plus haut niveau aurait la valeur la plus à jour pour un bloc de mémoire particulier.
Avoir quelque chose à ajouter à l'explication? Sonnez dans les commentaires. Vous voulez lire plus de réponses d'autres utilisateurs de Stack Exchange? Découvrez le fil de discussion complet ici.
Crédit d'image: Lemsipmatt( Flickr)