【发布时间】:2020-02-01 11:16:22
【问题描述】:
我想问一下,在 8 位内存字段上使用 CMPXCHG 指令是否会比在 32 位字段上使用它更糟糕。
我正在使用 C11 stdatomic.h 来实现几个同步方法。
【问题讨论】:
标签: c assembly x86 c11 instruction-set
我想问一下,在 8 位内存字段上使用 CMPXCHG 指令是否会比在 32 位字段上使用它更糟糕。
我正在使用 C11 stdatomic.h 来实现几个同步方法。
【问题讨论】:
标签: c assembly x86 c11 instruction-set
不,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 周期来提交缓存。
【讨论】: