2010-02-06 4 views
6

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

+0

Что вы используете для аннулирования кэша процессора (ассемблер, вызов ОС?), А также к какой архитектуре/процессору относится это? –

+0

@Johannes Rudolph, предположим, что фактический код написан на C# (volatiles, Interlocked operations, MemoryBarriers), но в конечном итоге он переводится на соответствующий код операции ассемблера. В моей личной ситуации я работаю с SMP-машиной с чипсетом Intel (особенно Xeon). Но я хотел бы знать, как этот процесс недействительности происходит в более «общем» спектре (AMD/Intel, SMP/NUMA и т. Д.), – 2010-02-07 12:23:43

ответ

2

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^