英特尔 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 在 lock
ed 指令或 mov-stores 上为 rep
前缀引入不兼容的含义是不合理的 - 这会破坏已经使用这些的真实世界二进制文件前缀。例如,我很确定主流 GNU/Linux 发行版中的一些 libpthread 构建已经使用它来启用硬件锁省略,并且不使用动态 CPU 分派到 运行 基于CPU此 ID。
使用 REP 作为向后兼容的新指令的强制性前缀已经在之前完成,例如rep nop
= pause
或 rep 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。)
我有一个应用程序的 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 在 lock
ed 指令或 mov-stores 上为 rep
前缀引入不兼容的含义是不合理的 - 这会破坏已经使用这些的真实世界二进制文件前缀。例如,我很确定主流 GNU/Linux 发行版中的一些 libpthread 构建已经使用它来启用硬件锁省略,并且不使用动态 CPU 分派到 运行 基于CPU此 ID。
使用 REP 作为向后兼容的新指令的强制性前缀已经在之前完成,例如rep nop
= pause
或 rep 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 /
如果你想在 x86 上使用硬件事务内存,我认为你唯一的选择是 RTM (xbegin
/xend
),TSX 的另一半。在最近的微码更新后,操作系统也可以禁用它;我不确定典型系统的默认值是什么,这可能会在未来发生变化,因此在将开发时间投入任何事情之前需要检查一下。
据我所知,没有一种方法可以使用 RTM,但可以透明地回退到锁定; xbegin / xend 是非法指令,如果 CPUID 特征位不存在,会出现 #UD
错误。
如果你想要透明的向后兼容,你应该使用 HLE,所以它(和一般的 TSX)经历了如此艰难的时期,反复被微码更新禁用,真是太遗憾了。 (以前在 Haswell 和 Broadwell 中,因为可能存在正确性错误。它正在变成 Charlie Brown situation。)