【问题标题】:Is it worse in any aspect to use the CMPXCHG instruction on an 8-bit field than on a 32-bit field?在 8 位字段上使用 CMPXCHG 指令是否比在 32 位字段上更糟糕?
【发布时间】:2020-02-01 11:16:22
【问题描述】:

我想问一下,在 8 位内存字段上使用 CMPXCHG 指令是否会比在 32 位字段上使用它更糟糕。

我正在使用 C11 stdatomic.h 来实现几个同步方法。

【问题讨论】:

    标签: c assembly x86 c11 instruction-set


    【解决方案1】:

    不,lock cmpxchg [mem], reg 8 与 32 位没有任何惩罚。现代 x86 CPU 可以加载和存储到它们的 L1d 缓存,而不会对单个字节与对齐的 dword 或 qword 造成任何损失。 Can modern x86 hardware not store a single byte to memory? 回答:它可以零惩罚1,因为他们使用晶体管来快速进行未对齐的加载/存储。

    [u]int32_t 相比,处理寄存器中窄整数的周围 asm 指令的额外成本也应该可以忽略不计。请参阅Why doesn't GCC use partial registers? - 大多数编译器都知道如何小心使用部分寄存器,并且现代 CPU(Haswell 及更高版本以及所有非 Intel)不会将低 8 与寄存器的其余部分分开重命名,因此唯一的危险是错误的依赖关系。根据您正在做什么,最好将unsigned 本地临时人员与_Atomic uint8_t 一起使用,或者最好让您的本地人员也使用uint8_t

    脚注 1:与某些非 x86 CPU 不同,其中字节存储实际上是通过缓存 RMW 周期 (Are there any modern CPUs where a cached byte store is actually slower than a word store?) 实现的。在那些 CPU 上,您希望 atomic xchg 对于 word 和 byte 而言一样便宜,但对于 cmpxchg 来说,希望太大了。但是几乎所有非 x86 ISA 都有 LL/SC 而不是 xchg / cmpxchg,因此即使是原子交换也是单独的 LL 和 SC 指令,并且 SC 需要一个 RMW 周期来提交缓存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-04
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多