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/С++ дает вам доступ к тому, что происходит на уровне кеша.
Существуют различные инструменты измерения, но они будут в значительной степени независимы от языка.
Существуют некоторые "правила" для сведения к минимуму проблем с кешем и пейджингом, хотя мне потребуется некоторое время, чтобы подумать о достаточно подробном списке.