Я пытаюсь измерить, сколько раз ссылки на память пропускают какой-либо кэш процессора и нуждаются в получении строки кеша из памяти. У меня есть очень простая программа, которая загружает 100 миллионов 4-байтовых целых чисел в массив, а затем сканирует или исследует случайным образом. Я измеряю время, а затем использую perf для сообщения о различных событиях, связанных с кэшем: LLC-load, LLC-load-misses, LLC-store, LLC-store-misses. Я использую Pop OS 18.10 (вариант Ubuntu 18.10).
Я запускаю программу тремя способами:
1) Просто загрузите массив (целых 100 м).
2) Загрузить массив и сканировать в физическом порядке.
3) Загрузите массив и прочитайте 100 м случайных мест расположения массива.
# 3 в 40 раз медленнее, чем # 2, что неудивительно.
У меня возникли некоторые проблемы, когда я узнал, какие перф события нужно исследовать, и как интерпретировать результаты:
Я обнаружил события LLC- *, прибегая к помощи Google, но они не упоминаются "списком перфектов".
Я вычитаю количество событий прогона только для загрузки (# 1) из прогонов загрузки и сканирования (# 2, # 3). Числа, как правило, ниже от физического сканирования (# 2) по сравнению с произвольным доступом (# 3). Но, прочитав документацию и посмотрев на цифры, я не совсем понимаю, что представляют собой различные события.
Считает ли перф события или отбирает их? Если это истинный счет, то я действительно не могу понять числа, которые я вижу. (Например, количество событий LLC-load-misses не совпадает с количеством передач строки кэша, которые должны быть необходимы.)