Question

Quelle est la relation entre les registres du CPU et le cache du processeur en matière de cache des protocoles de cohérence tels que MESI? Si une certaine valeur est stockée dans le cache du CPU, et est également stockée dans un registre, alors ce qui se passera si la ligne de cache sera marqué comme « sale »? à ma connaissance il n'y a pas gurentee que le registre mettra à jour sa valeur, même si le cache a été mis à jour (en raison de MESI).

Hench ce code:

 static void Main()  
  {  
  bool complete = false;   
  var t = new Thread (() =>  
  {  
    bool toggle = false;  
    while (!complete) toggle = !toggle;  
  });  
  t.Start();  
  Thread.Sleep (1000);  
  complete = true;  
  t.Join();        // Blocks indefinitely  
}

(supposons que le compilateur n'a pas optimisé la charge pour l'extérieur de la boucle « complète »)
à ma connaissance, la mise à jour « complète » n'est pas visible au second fil puisque sa valeur est maintenue à l'intérieur d'un registre (le cache du CPU 2 a été mise à jour cependant).

ne plaçant les forces de barrière de mémoire pour « débusquer » tous les registres? Quelle est la relation des registres à la cache? Qu'en est-il des registres et des barrières de mémoire?

Était-ce utile?

La solution

Il n'y a pas de relation. Utilisez le mot-clé "volatile".

Autres conseils

protocole MESI utilisé dans la plate-forme x86 garantit la cohérence de la mémoire cache, à savoir les changements dans une mémoire cache du processeur sont automatiquement propagées vers d'autres caches du processeur. Par conséquent, volatile mot-clé sur x86 et x64 est utile que pour éviter réordonnancement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top