Определить, находится ли область памяти в кеше процессора - PullRequest
8 голосов
/ 25 марта 2009

Операционная система может определить, находится ли страница памяти в DRAM или в разделе подкачки; например, просто попробуйте получить к нему доступ, и если произошла ошибка страницы, это не так.

Однако возможно ли то же самое с кэшем ЦП?

Есть ли какой-нибудь эффективный способ узнать, загружена ли данная ячейка памяти в строку кэша или узнать, когда это происходит?

Ответы [ 3 ]

6 голосов
/ 25 марта 2009

В общем, я не думаю, что это возможно. Он работает для DRAM и файла подкачки, поскольку это управляемый ресурс ОС, кеш управляется самим ЦП.

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

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

Что ты пытаешься сделать? Если вы хотите что-то принудительно вставить в память, существующие процессоры x86 поддерживают предварительную загрузку памяти в кэш неблокирующим способом, например, в Visual C ++ вы можете использовать _mm_prefetch для извлечения строки в кэш.

EDIT: Я сам этого не делал, поэтому пользуйтесь на свой страх и риск. Чтобы определить ошибки кэширования для профилирования, вы можете использовать некоторые специфичные для архитектуры регистры. http://download.intel.com/design/processor/manuals/253669.pdf, Приложение A содержит «События настройки производительности». Его нельзя использовать для определения того, находится ли отдельный адрес в кэше или когда он загружен в кэш, но его можно использовать для общей статистики. Я считаю, что именно это использует vTune (феноменальный профилировщик для этого уровня).

5 голосов
/ 25 марта 2009

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

Это один из тех случаев, который отражает научный принцип, согласно которому вы не можете измерить что-то, не влияя на то, что вы измеряете.

1 голос
/ 26 апреля 2009

X86 не знаю, как определить, находится ли адрес в кеше НО вот как узнать, был ли адрес БЫЛ в кеше

rdtsc
save timestamp
mov eax,address
rdtsc read timestamp counter
calculate timestamp difference
if < threshold then was in cache

Порог должен быть определен из документации или опытным путем

на некоторых машинах есть счетчики попаданий / промахов в кэше, которые одинаково хорошо работают

...