Делает недействительной кеш процессора - PullRequest
7 голосов
/ 06 февраля 2010

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

Ответы [ 2 ]

3 голосов
/ 07 февраля 2010

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

2 голосов
/ 07 февраля 2010

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

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

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

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

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

...