Можно ли отлаживать Intel TSX? - PullRequest
4 голосов
/ 16 января 2020

Я хотел бы использовать Intel TSX для программирования кода без блокировки.

xbegin
my_inst1
my_inst2
xend

Однако, по некоторым причинам, одна из моих инструкций внутри выполнения TSX прерывается TSX.

Я хотел бы знать, какая инструкция генерирует ошибку и делает прерывание TSX.

Есть ли какой-нибудь возможный способ узнать, какая команда вызвала ошибку?

Моя первая попытка была увеличить глобальный счетчик после выполнения каждой инструкции в области TSX. Однако, когда происходит сбой, обновления счетчиков также откатываются, потому что он выполняет откат каждой записи в области TSX.

Есть ли хитрость для отладки выполнения TSX?

1 Ответ

4 голосов
/ 17 января 2020

Используйте perf record (или другой способ доступа к счетчикам производительности HW) для события, такого как rtm_retired.aborted для любых прерываний, и / или tx_mem.abort_conflict или tx_mem.abort_capacity, чтобы увидеть, является ли один из них причиной прерываний. (Вы можете записать несколько событий за один прогон, а затем посмотреть, какие из них произошли в perf report)

Также может иметь значение tx_exe c .misc1..3. Начиная с perf list на моем рабочем столе Skylake.

tx_exec.misc1
[Подсчитывает, сколько раз выполнялся класс инструкций, которые могут вызвать прерывание транзакции. Так как это количество выполнений, оно не всегда может вызвать прерывание транзакции]

tx_exec.misc2
[Подсчитывает количество раз, когда класс инструкций (например, vzeroupper) может вызвать прерывание транзакции было выполнено внутри транзакционной области]

tx_exec.misc3
[Подсчитывает, сколько раз выполнение инструкции приводило к превышению поддерживаемого числа транзакционных гнезд]

См. также https://oprofile.sourceforge.io/docs/intel-skylake-events.php

Возможно, вам понадобится настроить параметры, чтобы получить разумное количество образцов для события, которое срабатывает не очень часто. Я не пробовал это, но, надеюсь, подсчеты должны появиться в самой виновной инструкции. rtm_retired.aborted - точное событие; другие не говорят об этом в выводе perf list.


Некоторые из событий RTM / TSX предназначены только для HLE (Hardware Lock Ellision, где вы добавляете дополнительный префикс к lock ed инструкция).

Используйте perf list и найдите «abort» в выходных данных, чтобы найти соответствующие события.

...