Quand un CPU Cache Vidé vers la Mémoire Principale?

0
370

Si vous êtes juste de commencer à apprendre les Processeurs multi-core, la mise en cache, de cohérence de cache et de la mémoire des œuvres, il peut sembler un peu déroutant au premier abord. Avec cela à l’esprit, aujourd’hui, les super-Utilisateur Q&Un post a les réponses à un lecteur curieux de la question.

Aujourd’hui, la Question Et la Réponse session nous vient de courtoisie de super-Utilisateur—une subdivision de Stack Exchange, l’un piloté par la communauté de regroupement de Q&A des sites web.

La Question

SuperUser lecteur CarmeloS veut savoir quand un CPU cache est vidé vers la mémoire principale:

Si j’ai un PROCESSEUR à deux cœurs et chaque cœur dispose de son propre cache L1, est-il possible que Core1 et Core2 les deux cache la même partie de la mémoire en même temps? Si c’est possible, quelle sera la valeur de la mémoire principale serait si les deux Core1 et Core2 ont modifié leurs valeurs dans le cache?

Quand un CPU cache vidé vers 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 à deux cœurs et chaque cœur dispose de son propre cache L1, est-il possible que Core1 et Core2 les deux 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érons deux threads s’exécutant le même code. Vous voulez que le code dans les deux caches L1.

Si c’est possible, quelle sera la valeur de la mémoire principale serait si les deux Core1 et Core2 ont modifié leurs valeurs dans le cache?

L’ancienne valeur sera dans la mémoire principale, qui n’a pas d’importance étant donné que ni le cœur de le lire. Avant d’éjecter une modification de la valeur de cache, il doit être écrit à la mémoire. Généralement, une variante de la MESI protocole est utilisé. Dans la tradition de la mise en œuvre de MESI, si une valeur est modifiée dans une cache, il ne peut pas être présent à tous dans toutes les autres cache à ce même niveau.

Suivie par la réponse du sleske:

Oui, avoir deux caches cache la même zone de mémoire peut se produire et est en fait un problème qui se produit beaucoup dans la pratique. Il existe plusieurs 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 contrôle tous les caches et les mises à jour en conséquence
  • Chaque processeur surveille les zones de mémoire qu’il a mis en cache, et quand il détecte une écriture, il jette son (maintenant invalide) cache

Le problème de cohérence de cache et de l’article de Wikipédia sur le sujet a une belle vue d’ensemble du problème et des solutions possibles.

Et notre réponse finale de Kimberly W:

Pour répondre à la question dans ton post du titre, il dépend de ce que le protocole de mise en cache. Si c’est l’écriture en arrière, le cache ne seront vidées de retour à la mémoire principale lorsque le contrôleur de cache n’a pas d’autre choix que de mettre un nouveau cache de bloc déjà occupé l’espace. Le bloc précédemment occupé l’espace est supprimé et que sa valeur est écrite à la mémoire principale.

L’autre protocole write-through. Dans ce cas, à chaque fois que le cache de bloc est écrit sur le niveau n, le bloc correspondant au niveau n+1 est mis à jour. Il est semblable au concept de remplir un formulaire avec du papier carbone sous; peu importe ce que vous écrivez sur le dessus est copié sur la feuille ci-dessous. C’est plus lent, car il est évident qu’elle implique plus de l’écriture des opérations, mais les valeurs entre les caches sont plus cohérentes. Dans l’écriture régime de remboursement, seul le plus haut niveau de cache qui serait le plus up-to-date de valeur pour un bloc de mémoire.

Quelque chose à ajouter à l’explication? Le son off dans les commentaires. Envie d’en lire plus de réponses à partir d’autres tech-savvy Pile utilisateurs Exchange? Découvrez le fil de discussion ici.

Crédit Image: Lemsipmatt (Flickr)