2009-03-25 5 views
6

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

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

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

ответ

6

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

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

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

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

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

+0

Спасибо. Мне интересно, потому что я собираюсь писать ядра. Я заинтересован в профилировании пропусков строки кэша на реальном оборудовании. Я не понимал, насколько они вредны для современных процессоров, пока я не увидел слайды Херба Саттера: http://is.gd/oWwp –

+0

Есть способы профилировать это в аппаратном обеспечении, vtune делает. – Michael

+0

Многие современные процессоры имеют счетчики производительности, которые могут предоставлять все виды информации, включая статистику, связанную с кешем. – sigjuice

6

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

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

+0

Ну, очень легко проверить, что в кеше находится * *. Просто прочитайте от него, и вуаля, это будет в кеше. ;) Трюк заключается в проверке, есть ли что-то * не * в кеше. :) – jalf

+1

Если вы гарантируете, что ваш код запущен из неспариваемой памяти, простой акт запуска программы не повлияет на кеш. –

+0

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

1

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

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

порог должен быть определен в соответствии с документацией или эмпирически

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