Jae*_*Lee 4 debugging x86 assembly intel intel-tsx
我想利用 Intel TSX 来编写无锁代码。
xbegin
my_inst1
my_inst2
xend
Run Code Online (Sandbox Code Playgroud)
但是,由于某些原因,我在 TSX 执行 TSX 中的一条指令中止。
我想知道哪条指令产生了错误并使 TSX 中止。
有没有办法知道哪个指令产生了错误?
我的第一次尝试是在 TSX 区域中执行每条指令后增加全局计数器。但是,当故障发生时,对计数器的更新也会回滚,因为它会回滚 TSX 区域中的每次写入。
有什么技巧可以调试 TSX 执行吗?
使用perf record
(或访问HW PERF的计数器的其他方式),用于像一个事件rtm_retired.aborted
为任何中止,和/或tx_mem.abort_conflict
或tx_mem.abort_capacity
以查看是否任一那些是用于中止原因。(您可以在一次运行中记录多个事件,然后查看哪个在 中触发perf report
)
tx_exec.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(硬件锁定省略,您在lock
ed 指令上添加一个额外的前缀)。
perf list
在输出中使用并搜索“abort”以查找相关事件。
归档时间: |
|
查看次数: |
179 次 |
最近记录: |