Cache Hit/Miss для значения в C/С++ Program

Это мое требование, я знаю, что некоторые алгоритмы хорошо используют Cache, некоторые не делают, некоторые делают больше ввода-вывода, чем другие, в конкретном наборе данных и т.д. Я бы хотел увидеть и проанализировать, что происходит сам.

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

Спасибо большое!

Ответы

Ответ 1

Если вы действительно хотите знать, когда ваши кэши попадают/отсутствуют, у современных процессоров есть счетчики производительности, которые вы можете использовать именно для этой цели. Я использовал их для академических исследований. Самый простой способ использовать их - perfmon2. Perfmon2 имеет как библиотеку, которую вы можете связать с вашей программой, так и отдельную программу, которая будет контролировать существующую программу. Например, здесь автономная программа, записывающая все запросы чтения и пропусков кэша данных уровня 1:

pfmon -eL1D_CACHE_LD:MESI,L1D_CACHE_LD:I_STATE your_program

Для справки, Приложение A этот документ (PDF) содержит документацию Intel о том, какие аппаратные счетчики доступны.

Ответ 2

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

Ответ 3

Я не знаю, сможет ли AMD CodeAnalyst показать этот уровень детализации, но не мешает проверить.

Ответ 4

Зависит от конкретного компилятора, ОС и конкретной модели процессора, на котором вы работаете. Ничто (что я знаю) на языке C/С++ дает вам доступ к тому, что происходит на уровне кеша.

Существуют различные инструменты измерения, но они будут в значительной степени независимы от языка.

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