AMD: счетчик производительности для циклов при пропуске TLB

#performance #amd #perf #tlb #mmu

#Производительность #amd #perf #tlb #mmu

Вопрос:

Я ищу AMD конкретные счетчики производительности, которые подсчитывают циклы, потребляемые при обходе страниц при TLB возникновении промахов. Я знаю, что у Intel есть такие доступные показатели.

Но существуют ли такие на AMD? Я заглянул в http://developer.amd.com/wordpress/media/2013/12/56255_OSRR-1.pdf но не нашел ничего похожего на то, что мне нужно.

Я также заглянул в perf исходный код https://elixir.bootlin.com/linux/latest/source/arch/x86/events/amd/core.c#L248 Похоже, у него нет ни того, ни другого.

Может быть, у него разные имена? Есть предложения?

Комментарии:

1. «потребляется» — вы имеете в виду, что просмотр страницы активен, а ядро остановлено, операции ввода-вывода не выполняются? Потому что в некоторых случаях OoO exec может скрывать некоторую задержку при переходе по странице. (И если переход инициируется предварительной выборкой TLB, в идеале он полностью скрывает задержку, и вы не получаете пропуска TLB или тот, который завершается достаточно быстро, чтобы не быть проблемой. Но на практике более вероятно, что спекулятивные ранние переходы по страницам просто сокращают время простоя, а не полностью скрывают его, особенно когда OoO exec уже должен работать, чтобы скрыть другие задержки.)

Ответ №1:

Мне кажется, вы ищете события, похожие на процессоры Intel *.WALK_DURATION или *.WALK_ACTIVE AMD Zen. Таких событий с одинаковым точным значением нет, но есть похожие события.

Ближайшими событиями являются поля данных производительности IBS IbsTlbRefillLat и IbsItlbRefillLat , которые измеряют количество циклов, необходимых для выполнения промаха L1 DTLB или L1 ITLB, соответственно, в случае промаха для выбранной выборки команд или uop. Обратите внимание, что in perf record , IbsTlbRefillLat может быть захвачен с ibs_fetch помощью PMU и IbsItlbRefillLat может быть захвачен с ibs_op помощью PMU.

Событие Core::X86::Pmc::Core::LsTwDcFills также полезно. Он подсчитывает количество заполнений кэша данных L1 для обходов таблицы страниц, которые пропускаются в L1 для каждого источника данных (локальные L2, L3 на одном кристалле, L3 на другом кристалле, DRAM или IO на том же кристалле, DRAM или IO на другом кристалле). Обходы, выполняемые из более отдаленных источников, стоят дороже и, вероятно, окажут большее влияние на производительность. Это событие не учитывает переходы, которые попадают в кэш данных L1, хотя есть другие события, которые учитывают пропуски TLB L2. Кроме того, это событие учитывается только для пропусков DTLB L2, а не для пропусков ITLB.

В текущих версиях восходящего ядра LsTwDcFills отсутствует в списке perf list и поэтому perf не знает событие по имени. Итак, вам нужно будет указать код события, используя синтаксис cpu/event=0x5B, umask=0x0/ . Это событие представляет любое прохождение таблицы страниц для загрузки или хранения данных, для которых выделен MAB (это означает, что прохождение было пропущено в L1D). Вы можете отфильтровать счетчик в соответствии с ответом, указав соответствующее значение umask, как определено в руководстве. Например, событие cpu/event=0x5B, umask=0x48/ представляет собой обход, когда ответ пришел из локальной или удаленной основной памяти.

Один из хороших подходов к использованию всех этих средств мониторинга в качестве небольшой части общей методологии анализа производительности микроархитектуры — это первый мониторинг LsTwDcFills . Если он превышает некоторый порог по сравнению с общим количеством обращений к памяти (исключая выборку команд), затем выполните захват IbsTlbRefillLat для выборочных операций ввода-вывода, чтобы определить, где в вашем коде происходят эти дорогостоящие обходы. Аналогично, для обходов с выборкой инструкций используйте событие Core::X86::Pmc::Core::BpL1TlbMissL2Hit для подсчета общего количества обходов, и если количество слишком велико по отношению к общему количеству выборок, используйте IbsItlbRefillLat , чтобы определить, где в вашем коде происходят самые дорогостоящие обходы.

Комментарии:

1. Хади Брейс, спасибо за комментарии. perf версия, которая у меня есть, не поддерживает ibs_fetch ibs_op аргументы и, поэтому мне приходится вводить необработанные значения. Раньше я libpfm4 получал список всех доступных событий, поддерживаемых процессором, однако в нем не было списка IbsTlbRefillLat и IbsItlbRefillLat .

2. @Mark IbsTlbRefillLat и IbsItlbRefillLat на самом деле не являются событиями, поэтому они не будут отображаться в списке поддерживаемых событий. Это дополнительная информация, которую можно получить с помощью выборки IBS. ibs_fetch И ibs_op должно поддерживаться, если вы не используете очень старую версию ядра. Укажите версию perf, версию ядра, модель вашего процессора и покажите вывод команды dir /sys/bus/event_source/devices/ . Покажите точные команды и ошибки, которые вы получаете. (Отредактируйте свой вопрос, чтобы включить эту информацию.)