Команда Linux perf для ссылок на кеш

Я хочу измерить частоту промахов в кеше моего кода. Мы можем использовать список перфомансов, чтобы показать поддерживаемые события. На моем настольном компьютере установлен процессор Intel (R) Core (TM) i5-2400 @ 3,10 ГГц, список производительности содержит ссылки на кэш и промахи кеша, например:

  cpu-cycles OR cycles                               [Hardware event]
  stalled-cycles-frontend OR idle-cycles-frontend    [Hardware event]
  stalled-cycles-backend OR idle-cycles-backend      [Hardware event]
  instructions                                       [Hardware event]
  cache-references                                   [Hardware event]
  cache-misses                                       [Hardware event]

Я думаю, что промахи в кэше сопоставляются с аппаратными событиями LLC-промахи в соответствии с руководством разработчика программного обеспечения для архитектур Intel (я подтверждаю это, сравнивая perf stat -e r412e и perf stat -e cache-misses , они дали практически идентичный результат). Но как считать кеш-ссылки? Я не нашел события или способа получить общие ссылки кеша с использованием существующих аппаратных событий. Так что мне интересно, точны ли эти ссылки на кеш на моем компьютере?


person Robert    schedule 07.06.2014    source источник
comment
Я вижу ссылки на кэш чуть ниже промахов кеша. Что такое точный час?   -  person Milind Dumbare    schedule 10.06.2014
comment
Я имею в виду, что хотя вам даются ссылки на кеш, мне было интересно, как они подсчитываются, это точно? Я не нашел счетчика событий в руководстве Intel для ссылок на кеш.   -  person Robert    schedule 10.06.2014


Ответы (3)


В Intel я не думаю, что perf предоставляет событие для измерения общего количества ссылок на кеш, потому что такое событие не существует на аппаратном уровне. Вы должны иметь возможность вычислить эту информацию самостоятельно, используя событие аппаратного кэша, о котором сообщает perf list:

L1-dcache-loads                                    [Hardware cache event]
L1-dcache-load-misses                              [Hardware cache event]
L1-dcache-stores                                   [Hardware cache event]
L1-dcache-store-misses                             [Hardware cache event]
L1-dcache-prefetches                               [Hardware cache event]
L1-dcache-prefetch-misses                          [Hardware cache event]
L1-icache-loads                                    [Hardware cache event]
L1-icache-load-misses                              [Hardware cache event]
L1-icache-prefetches                               [Hardware cache event]
L1-icache-prefetch-misses                          [Hardware cache event]
LLC-loads                                          [Hardware cache event]
LLC-load-misses                                    [Hardware cache event]
LLC-stores                                         [Hardware cache event]
LLC-store-misses                                   [Hardware cache event]
LLC-prefetches                                     [Hardware cache event]
LLC-prefetch-misses                                [Hardware cache event]

События, не помеченные -misses, представляют количество ссылок в связанном кэше.

Примечание: этот предыдущий вопрос и этот справочная страница о perf_event_open (используется perf для внутреннего использования) может помочь.

person Manuel Selva    schedule 11.06.2014
comment
Не все события из perf list можно сопоставить с аппаратными счетчиками производительности ... - person osgx; 16.03.2015

Если вы посмотрите на arch / x86 / kernel / cpu / perf_event_intel.c в коде ядра. Вы увидите это

"PERF_COUNT_HW_CACHE_REFERENCES = 0x4f2e". 

В то время как

"PERF_COUNT_HW_CACHE_MISSES= 0x412e"

В руководстве по архитектуре X86 указано, что 0x4f2e - это «Это событие подсчитывает запросы, исходящие от ядра, которые ссылаются на строку кэша в кэше последнего уровня». Так что я считаю, что это правильно.

person Milind Dumbare    schedule 10.06.2014
comment
да. Эти два события являются событиями архитектурной производительности в процессорах Intel. 0x4f2e - это ссылка LLC, которая описывается как ссылки на кэш с наибольшей задержкой, а 0x412e - это промахи LLC, которые описываются как самые длинные промахи в кэше. Я получил это из этого руководства Руководство Intel. Однако я думаю, что ссылки LLC - это просто обращения к памяти, которые попадают в LLC, но не включают попадания в кеш в L1 и L2. Так что это не совсем так. - person Robert; 11.06.2014
comment
Таким образом, 0x4f2e - это просто ссылки на кеш, которые попадают в LLC, но не включают ссылки на кеш, которые попадают в L1 и L2. - person Robert; 11.06.2014

Я попробовал инструмент под названием Vtune от Intel, я получил некоторые подсказки о том, как измерить общее количество ссылок на кеш. Они могут измерять коды микроопераций и фильтровать те инструкции, которые загружаются или сохраняются, чтобы получить общее количество ссылок на кэш. Но я не уверен, что инструмент perf также использует этот метод.

person Robert    schedule 11.06.2014
comment
ocperf.py из pmu-tools github.com/andikleen/pmu-tools может использовать любое событие на Intel по символическому имени (скрипт просто программирует инструмент perf); включены несколько полезных скриптов - person osgx; 16.03.2015