英特尔 TSX 前缀是否作为 NOP 在 AMD 上(安全地)执行?

Are Intel TSX prefixes executed (safely) on AMD as NOP?

我有一个应用程序的 MASM 同步代码,运行在 Intel 和 AMD x86 机器上都有。

我想使用 Intel TSX 前缀增强它,特别是 XACQUIRE 和 XRELEASE。

如果我为 Intel 正确修改我的代码,当我尝试在 AMD 机器上 运行 时会发生什么?英特尔表示,这些设计是为了向后兼容,大概意味着它们什么都不做 在没有 TSX 的 Intel CPU 上。

我知道 AMD 还没有实现 TSX。但是这些前缀在 AMD CPU 上对 运行 安全吗?这种行为是否记录在 AMD 手册中的某个地方,或者假设这是安全的并且将永远安全是在玩火吗?

xacquire/xrelease are just F2/F3 REP prefixes 并被所有 CPU 不支持该功能 的 安全地忽略,包括非英特尔。这就是英特尔为前缀选择该编码的原因。它甚至比必须解码为单独指令的 NOP 还要好。

通常(跨供应商),CPUs 会忽略他们不理解的 REP 前缀。 因此新扩展可以使用 REP 作为其编码的一部分,如果它是对他们在旧 CPUs 上解码为其他东西很有用,而不是 #UD.

我认为 AMD 在 locked 指令或 mov-stores 上为 rep 前缀引入不兼容的含义是不合理的 - 这会破坏已经使用这些的真实世界二进制文件前缀。例如,我很确定主流 GNU/Linux 发行版中的一些 libpthread 构建已经使用它来启用硬件锁省略,并且不使用动态 CPU 分派到 运行 基于CPU此 ID。


使用 REP 作为向后兼容的新指令的强制性前缀已经在之前完成,例如rep nop = pauserep bsf = tzcnt。 (对编译器有用,因为 tzcnt 在某些 CPU 上更快,并且如果已知输入非零则给出相同的结果。)并且 rep ret 作为 AMD pre-Bulldozer 的解决方法分支预测器被 GCC 广泛使用 - What does `rep ret` mean?。毫无意义的 REP 在 AMD 上确实有效(被默默忽略)。

(反之 正确。您不能编写依赖于 future 忽略的无意义 REP 前缀的软件 CPUs。一些后来的扩展可能会给它一个意义,例如像 rep bsr,其中 运行s 作为 lzcnt 并给出不同的结果。这就是英特尔记录影响的原因无意义的前缀为“未定义”。)


I'd like to enhance it using the Intel TSX prefixes, specifically XACQUIRE and XRELEASE.

不幸的是,微代码更新显然禁用了所有 Intel CPUs 上 TSX 的 HLE(硬件锁省略)部分。 (也许是为了缓解 TAA side-channel attacks)。这是使 32 字节块末尾的 jcc 在 uop 缓存中不可缓存的相同更新,因此很难通过对现有代码进行基准测试来判断无 HLE 部分对性能有何影响。

https://news.ycombinator.com/item?id=21533791 / (是的,没了,但原因可能不是特定的 Spectre。IDK 如果它会回来。)

如果你想在 x86 上使用硬件事务内存,我认为你唯一的选择是 RTM (xbegin/xend),TSX 的另一半。在最近的微码更新后,操作系统也可以禁用它;我不确定典型系统的默认值是什么,这可能会在未来发生变化,因此在将开发时间投入任何事情之前需要检查一下。

据我所知,没有一种方法可以使用 RTM,但可以透明地回退到锁定; xbegin / xend 是非法指令,如果 CPUID 特征位不存在,会出现 #UD 错误。

如果你想要透明的向后兼容,你应该使用 HLE,所以它(和一般的 TSX)经历了如此艰难的时期,反复被微码更新禁用,真是太遗憾了。 (以前在 Haswell 和 Broadwell 中,因为可能存在正确性错误。它正在变成 Charlie Brown situation。)