Используйте 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» в выходных данных, чтобы найти соответствующие события.