在 8 位字段上使用 CMPXCHG 指令在任何方面都比在 32 位字段上更糟糕吗?

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 位字段上使用它更糟糕。

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

不,lock cmpxchg [mem], reg 8 与 32 位 没有惩罚。现代 x86 CPU 可以加载并存储到它们的 L1d 缓存中,与对齐的 dword 或 qword 相比,单个字节没有损失。 答案:它可以零惩罚1 因为他们花费晶体管使未对齐的 loads/stores 更快。

处理寄存器中窄整数的周围 asm 指令与 [u]int32_t 相比,如果有任何额外成本,也应该可以忽略不计。请参阅 - 大多数编译器都知道如何小心使用部分寄存器,而现代 CPU(Haswell 及更高版本,以及所有非 Intel 处理器)不会将低位 8 与寄存器的其余部分分开重命名,因此唯一的危险是错误的依赖。取决于你在做什么,最好使用 unsigned 本地临时文件和 _Atomic uint8_t,或者最好让你的本地人也 uint8_t.

脚注 1:与某些非 x86 CPU 不同,在这些 CPU 中字节存储实际上是通过缓存 RMW 周期实现的 ()。在那些 CPU 上,您希望 atomic xchg 对于字和字节来说同样便宜,但是对于 cmpxchg 来说,这太过分了。但是几乎所有非 x86 ISA 都有 LL/SC 而不是 xchg / cmpxchg,所以即使是原子交换也是单独的 LL 和 SC 指令,并且 SC 将需要一个 RMW 周期来提交到缓存。