Perf показывает L1-dcache-load-misses в блоке без доступа к памяти - PullRequest
2 голосов
/ 04 августа 2020

Ниже приведен блок кода, который помечает запись perf как ответственный за 10% всех пропусков L1-dcache, но этот блок полностью представляет собой перемещение между регистрами zmm. Это строка команды perf:

perf record -e L1-dcache-load-misses -c 10000 -a -- ./Program_to_Test.exe

Блок кода:

Round:
vmulpd zmm1,zmm0,zmm28
VCVTTPD2QQ zmm0{k7},zmm1
VCVTUQQ2PD zmm2{k7},zmm0
vsubpd zmm3,zmm1,zmm2
vmulpd zmm4,zmm3,zmm27
VCVTTPD2QQ zmm5{k7}{z},zmm4

VPCMPGTQ k2,zmm5,zmm26
VPCMPEQQ k3 {k7},zmm5,zmm26
KADDQ k1,k2,k3

VCVTQQ2PD zmm2{k7},zmm0
VDIVPD zmm1{k7},zmm2,zmm28 ; Divide by 100
VPXORQ zmm2{k7},zmm2,zmm2
vmovupd zmm2,zmm1
VADDPD zmm2{k1},zmm1,zmm25

Я получаю аналогичные результаты для этого блока кода с другими мерами L1, такими как l1d.replacement.

У меня вопрос, как может блок, который перемещается только в регистре zmm, генерировать промахи кэша L1? Я вообще не думал, что записывает go в память. Фактически, последний доступ к памяти находится на 10 инструкций выше этого блока кода; остальные 9 инструкций являются инструкциями «регистр-регистр».

1 Ответ

4 голосов
/ 06 августа 2020

Событие L1-dcache-load-misses сопоставляется с L1D.REPLACEMENT на Sandy Bridge и более поздних микроархитектурах (или сопоставляется с аналогичным событием на более старых микроархитектурах). Это событие не поддерживает точную выборку, что означает, что выборка может указывать на инструкцию, которая не могла сгенерировать событие, для которого выполняется выборка. (Обратите внимание, что L1-dcache-load-misses не поддерживается ни в одном текущем Atom.)

Начиная с Linux 3.11, запущенного на микроархитектуре Haswell + или Silvermont +, образцы могут быть захвачены с помощью указателей инструкций обработки событий, указав событие выборки, которое соответствует следующие два условия:

  • Событие поддерживает точную выборку. Вы можете использовать, например, любое из событий, которые представляют собой прерывание памяти или удаление инструкции. Точные названия и смысл событий зависят от микроархитектуры. Обратитесь к Intel SDM Volume 3 для получения дополнительной информации. Нет события, которое поддерживает точную выборку и имеет такое же точное значение, как L1D.REPLACEMENT. На процессорах, поддерживающих расширенную PEBS, только часть событий PEBS поддерживает точную выборку.
  • Точный уровень выборки включен для события. В Linux perf это можно сделать, добавив «: pp» к имени события или кодировке необработанного события или «pp» после завершающего sla sh необработанного события, указанного в синтаксисе PMU. Например, в Haswell для события mem_load_uops_retired.l1_miss:pp можно указать Linux perf.

С таким событием, когда счетчик событий переполняется, оборудование PEBS ставится на охрану, что означает, что оно сейчас ищем как можно раньше возможность собрать точный образец. Когда есть хотя бы одна инструкция, которая вызовет событие в течение этого временного окна, оборудование PEBS в конечном итоге будет запущено одной из этих инструкций со смещением в сторону инструкций с высокой задержкой. Когда инструкция, запускающая PEBS, удаляется, процедура микрокода PEBS выполнит и захватит запись PEBS, которая, помимо прочего, содержит IP-адрес инструкции, запустившей PEBS (который отличается от архитектурного IP-адреса). Указатель инструкции (IP), используемый perf для отображения результатов, является этим IP-адресом события. (Я заметил, что может быть незначительное количество образцов, указывающих на инструкции, которые не могли вызвать событие.)

В более старых версиях mircroarchitecures (до Haswell и Silvermont) также поддерживается уровень точной выборки «pp» . PEBS на этих процессорах будет фиксировать только архитектурное событие, которое указывает на инструкцию stati c, которая следует сразу за инструкцией запуска PEBS в программном порядке. Linux perf по возможности использует LBR, который содержит пары исходных и целевых IP-адресов, чтобы определить, является ли этот захваченный IP-адрес целью перехода. Если это так, он добавит исходный IP-адрес в качестве IP-адреса события в образец записи.

Некоторые микроархитектуры поддерживают одно или несколько событий с лучшим распределением выборки (насколько лучше зависит от микроархитектуры, события, счетчик и инструкции, выполняемые в то время, когда счетчик собирается переполниться). В Linux perf точное распределение можно включить, если оно поддерживается, указав точный уровень «ppp».

...