Регистры процессора и когерентность кэша - PullRequest
1 голос
/ 26 декабря 2009

Какова связь между регистрами ЦП и кешем ЦП, когда речь идет о протоколах когерентности кеша, таких как MESI? Если определенное значение сохраняется в кэше ЦП, а также хранится в регистре, то что произойдет, если строка кэша будет помечена как «грязная»? Насколько я понимаю, нет гарантии, что регистр обновит свое значение, даже если кэш был обновлен (из-за MESI).

Закрепите этот код:

 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  
}

(допустим, компилятор не оптимизировал загрузку для «завершения» вне цикла)
Насколько я понимаю, обновление до "complete" не видно для второго потока, поскольку его значение хранится в регистре (однако кэш CPU 2 был обновлен).

заставляет ли установка барьера памяти «сбрасывать» все регистры? какое отношение регистров к кешу? а как насчет регистров и барьеров памяти?

Ответы [ 2 ]

4 голосов
/ 26 декабря 2009

Нет никаких отношений. Используйте ключевое слово "volatile".

0 голосов
/ 26 декабря 2009

Протокол MESI, используемый на платформе x86, гарантирует согласованность кэша, то есть изменения в одном кэше процессора автоматически распространяются на другие кэши процессора. Поэтому ключевое слово volatile в x86 и x64 полезно только для предотвращения переупорядочения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...