Программный подсчет ошибок кэша

Мне нужно оценить время, затраченное функцией C++ в куче гипотез об эффективности иерархии памяти (e.g: время, затраченное, когда у нас есть промах кэша, удар кэша или ошибка страницы при чтении части массива), поэтому я хотел бы иметь некоторые библиотеки, которые позволяют мне подсчитывать ошибки промаха кэша / страницы, чтобы иметь возможность автоматически генерировать сводку производительности.

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

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

любое предложение приветствуется!

4 ответов


самые последние процессоры (как AMD, так и Intel) имеют регистры монитора производительности, которые могут использоваться для такого рода работы. Для Intel они описаны в справочном руководстве программиста, том 3B, глава 30. Для AMD это в руководстве BIOS и разработчика ядра.

в любом случае, вы можете подсчитать такие вещи, как хиты кэша, промахи кэша, запросы памяти, предварительные выборки данных и т. д. У них есть довольно специфические селекторы, поэтому вы можете получить количество (например) количества чтений на L2 кэш для заполнения строк в кэше инструкций L1 (исключая чтение L2 для заполнения строк в кэше данных L1).

существует модуль ядра Linux для предоставления доступа к MSRs (регистрам, специфичным для модели). Навскидку, я не знаю, дает ли он доступ к регистрам монитора производительности, но я ожидал бы, что это, вероятно, так.


похоже, теперь есть именно то, что я искал:perf_event_open.

Он позволяет вам делать интересные вещи, такие как инициализация/включение/отключение некоторых счетчиков производительности для последующей выборки их значений через единый и интуитивно понятный API (он дает вам специальный файловый дескриптор, в котором размещается структура, содержащая ранее запрошенную информацию).

Это решение только для linux, и функциональные возможности зависят от версия ядра, так что будьте осторожны:)


Intel VTune - это инструмент настройки производительности, что делает именно то, что вы просите; Конечно, он работает с процессорами Intel, так как он получает доступ к внутренним счетчикам процессоров, как объясняется Jerry Coffin, Так что это, вероятно, не работает на процессоре AMD. Он выставляет буквально undreds счетчиков, таких как хит/промахи кэша, скорости прогнозирования ветвей и т. д. реальная проблема с ним-это понимание, какие счетчики проверять;)


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

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

EDIT: я мог бы найти эту интересную статью, которая может вам помочь:http://lwn.net/Articles/417979/