Вопрос

Когда моя программа выполняет операцию загрузки с семантикой получения / операцию сохранения с семантикой выпуска или, возможно, полную блокировку, это приводит к аннулированию кэша процессора.
Мой вопрос заключается в следующем:какая часть кэша на самом деле признана недействительной?только строка кэша, в которой содержалась переменная, которую я использовал для получения / выпуска?или, возможно, весь кэш недействителен?(L1 + L2 + L3 ..и так далее?).Есть ли разница в этом вопросе, когда я использую семантику приобретения / выпуска или когда я использую полный забор?

Это было полезно?

Решение

Я не эксперт в этом, но я наткнулся на этот документ, возможно, он полезен http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2009.04.05a.pdf

Другие советы

Когда вы выполняете загрузку без ограждений или мьютексов, загруженное значение потенциально может поступать откуда угодно, то есть из кэшей, регистров (посредством оптимизации компилятора) или оперативной памяти...но из вашего вопроса следует, что вы уже знали это.

В большинстве реализаций мьютекса, когда вы приобретаете мьютекс, ограждение всегда применяется либо явно (например, mfence, барьер и т.д.), Либо неявно (например, префикс lock для блокировки шины на x86).Это приводит к тому, что строки кэша всех кэшей в пути становятся недействительными.

Обратите внимание, что недействителен не весь кэш, а только соответствующие строки кэша для ячейки памяти.Сюда также входят строки для мьютекса (который обычно реализуется как значение в памяти).

Конечно, есть детали, зависящие от конкретной архитектуры, но в целом это работает именно так.

Также обратите внимание, что это не единственная причина для аннулирования кэшей, поскольку могут быть операции на одном процессоре, для которых потребуется аннулировать кэши на другом.Выполнив поиск в Google по запросу "протоколы согласованности кэша", вы получите много информации по этому вопросу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top