C语言 在 8 位字段上使用 CMPXCHG 指令在任何方面是否比在 32 位字段上使用更差?



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

我正在使用 C11stdatomic.h来实现几种同步方法。

不,lock cmpxchg [mem], reg8 位与 32 位没有惩罚。 现代 x86 CPU 可以加载并存储到其 L1d 缓存中,与对齐的 dword 或 qword 相比,单个字节不会受到任何惩罚。 现代 x86 硬件不能将单个字节存储到内存中吗?答:它可以零惩罚1,因为他们花费晶体管来快速制造未对齐的负载/存储。

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

脚注 1:与某些非 x86 CPU 不同,在一些非 x86 CPU 上,字节存储实际上是通过缓存 RMW 周期实现的(是否有任何现代 CPU 的缓存字节存储实际上比字存储慢? 在这些CPU上,你会希望原子xchg对于word和byte一样便宜,但这对cmpxchg来说太过分了。 但是几乎所有非x86 ISA都有LL/SC而不是xchg/cmpxchg,所以即使是原子交换也是单独的LL和SC指令,SC需要RMW周期才能提交到缓存。

最新更新