Регистры процессора и согласованность кэша
-
21-09-2019 - |
Вопрос
Какова связь между регистрами процессора и кэшем процессора, когда речь заходит о протоколах согласованности кэша, таких как 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 был обновлен).
заставляет ли установка барьера памяти "сбрасывать" все регистры?каково отношение регистров к кэшу?а как насчет регистров и барьеров памяти?
Решение
Здесь нет никаких отношений.Используйте ключевое слово "volatile".
Другие советы
Протокол MESI, используемый на платформе x86, гарантирует согласованность кэша, т.е.изменения в кэше одного процессора автоматически распространяются на кэши других процессоров.Следовательно изменчивый ключевое слово на x86 и x64 полезно только для предотвращения переупорядочивания.