我正在编写一些包含 RTM 事务区域的程序。我已经使用
cpuid
指令检查了我的机器是否支持 HLE 和 RTM。但是,我注意到 xbegin
指令总是返回零(rax 寄存器中的值),这表明事务已中止。所以我使用 xbegin
和 xend
指令编写了一个非常简单的演示,并且不在它们之间插入任何指令。
上面描述的代码是:
int main() {
asm volatile(".byte 0xc7, 0xf8, 0x03, 0x00, 0x00, 0x00" ::"r"(-1ul)); // xbegin machine code
asm volatile(".byte 0x0f, 0x01, 0xd5"); // xend machine code
return 0;
}
对应的汇编代码为:
00000000000005fa <main>:
5fa: 48 c7 c0 ff ff ff ff mov $0xffffffffffffffff,%rax
601: c7 f8 03 00 00 00 xbeginq 60a <main+0x10>
607: 0f 01 d5 xend
60a: b8 00 00 00 00 mov $0x0,%eax
60f: c3 retq
在此代码中,我将
xbegin
中的后备地址设置为xend
的下一条指令的地址。因此,无论事务是否中止,代码都可以正常完成执行。然后我使用 perf
来分析此代码的执行情况,我发现此事务由于 HLE 不友好的指令而中止。我不知道原因。
$ sudo perf stat -e rtm_retired.start ./demo
Performance counter stats for './demo':
1 rtm_retired.start
0.000614539 seconds time elapsed
0.000634000 seconds user
0.000000000 seconds sys
$ sudo perf stat -e rtm_retired.commit ./demo
Performance counter stats for './demo':
0 rtm_retired.commit
0.000657118 seconds time elapsed
0.000616000 seconds user
0.000000000 seconds sys
$ sudo perf stat -e rtm_retired.aborted_unfriendly ./demo
Performance counter stats for './demo':
1 rtm_retired.aborted_unfriendly
0.000617362 seconds time elapsed
0.000609000 seconds user
0.000000000 seconds sys
我的机器配置:
CPU: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
microcode: 0xf0
OS: Linux 5.4.0-150-generic, Ubuntu 18.04.1
更新: 我注意到一篇文章,这意味着英特尔已经通过微码更新禁用了 TSX。他们添加了一个新的 CPUID 位来指示这一更改。我检查了这一点,发现它是在我的处理器上设置的。所以RTM区域无法成功执行。
我注意到一篇文章,这意味着英特尔已经通过微码更新禁用了 TSX。他们添加了一个新的 CPUID 位来指示这一更改。我检查了这一点,发现它是在我的处理器上设置的。所以RTM区域无法成功执行。