Каковы накладные расходы на использование последней записи Intel?

Последняя ветвь записи относится к коллекции пар регистра (MSR), которая хранит исходные и целевые адреса, связанные с недавно выполненными ветвями. http://css.csail.mit.edu/6.858/2012/readings/ia32/ia32-3b.pdf документ содержит больше информации, если вы заинтересованы.

  • a) Может ли кто-нибудь дать представление о том, сколько LBR замедляет выполнение программными программами - как CPU, так и IO?
  • b) Будет ли отклонено предсказание ветвления, когда трассировка LBR включена?

Ответ 1

В документе Ресурсы трассировки Intel для выполнения кода (работники Arium, Craig Pedersen и Jeff Acampora, 29 апреля 2012 г.) перечислены три варианта трассировки ветвей:

  • Флаг последней ветки (LBR) в DebugCtlMSR и соответствующие LastBranchToIP и LastBranchFromIP MSR, а также LastExceptionToIP и LastExceptionFromIP MSR.

  • Хранилище трассировки брандмауэра , используя либо RAM-RAM, либо системную DRAM.

  • Трассировка архитектурного события (AET) удалена с порта XDP и сохранена снаружи в подключенном зондирующем зонде.

Как сказано на стр. 2, LBR сохраняет информацию в MSR, "не препятствует какой-либо производительности в реальном времени", но полезно только для очень короткого кода ( "эффективный трассировка экрана очень мелкая и обычно могут отображаться только сотни инструкций".). Сохраняет информацию только о 4-16 ветвях.

BTS позволяет захватывать многие пары ветвей "От" и "В" и сохраняет их в кеше (Cache-as-RAM, CAR) или в системной DRAM. В случае CAR глубина/длина трассы ограничены размерами кеша (и некоторой константой); с длиной следа DRAM практически неограничен. В документе оцениваются накладные расходы BTS от 20 до 100 процентов из-за дополнительных хранилищ памяти. BTS на Linux прост в использовании с предлагаемой перфомантной записью (еще не в ванили) или проектом btrax. В презентации perf branch приведены некоторые сведения о организации BTS: есть буфер BTS, который содержит поля "от", "до" и "предсказанный флаг". Таким образом, предсказание ветвления не отключается при использовании BTS. Кроме того, когда буфер BTS заполняется до максимального размера, генерируется прерывание. Модуль обработки BTS в ядре (подсистема perf_events или модуль ядра btrax) должен копировать данные из буфера BTS в другое место в случае такого прерывания.

Таким образом, в режиме BTS есть два источника накладных расходов: Хранилище кэшей/памяти и прерывания от переполнения буфера BTS.

AET использует внешний агент для сохранения данных отладки и трассировки. Этот агент подключается через eXtended Debug Port (XDP) и взаимодействует с In-Target Probe (ITP). Накладные расходы AET "могут оказать значительное влияние на производительность системы, которая может быть на несколько порядков выше" в соответствии с этой статьей, поскольку AET может генерировать/захватывать больше типов событий. Но собранное хранилище данных является внешним по отношению к отлаженной платформе.

Бумага "Резюме" гласит: 

LBR не имеет накладных расходов, но очень мелкий (4-16 мест расположения веток, в зависимости от на CPU). Данные трассировки доступны сразу из reset.

BTS намного глубже, но оказывает влияние на производительность ЦП и требует встроенная оперативная память. Данные трассировки доступны, как только инициализируется CAR.

AET требуется специальное аппаратное обеспечение ITP и не доступно на всех CPU архитектуры. Это имеет преимущество хранения данных трассировки вне доски.