[英]Is it worse in any aspect to use the CMPXCHG instruction on an 8-bit field than on a 32-bit field?
我想问一下,在 8 位 memory 字段上使用CMPXCHG
指令是否在任何方面都比在 32 位字段上使用它更糟糕。
我正在使用 C11 stdatomic.h来实现几个同步方法。
不, lock cmpxchg [mem], reg
8 vs. 32-bit 没有任何惩罚。 现代 x86 CPU 可以加载和存储到其 L1d 高速缓存,而不会对单字节与对齐的 dword 或 qword 造成任何损失。 现代 x86 硬件不能将单个字节存储到 memory 吗? 答案:它可以零惩罚1因为他们花费晶体管来快速进行甚至未对齐的加载/存储。
处理寄存器中窄 integer 的周围 asm 指令与[u]int32_t
相比,如果有任何额外成本,也应该可以忽略不计。 请参阅为什么 GCC 不使用部分寄存器? - 大多数编译器都知道如何小心使用部分寄存器,现代 CPU(Haswell 及更高版本,以及所有非 Intel)不会将低 8 与寄存器的 rest 分开重命名,因此唯一的危险是错误的依赖关系。 根据您正在做什么,最好使用带有_Atomic uint8_t
的unsigned
本地临时文件,或者最好让您的本地人也使用uint8_t
。
脚注 1:与某些非 x86 CPU 不同,其中字节存储实际上是通过缓存 RMW 周期实现的( 是否有任何现代 CPU 缓存字节存储实际上比字存储慢? )。 在那些 CPU 上,您希望 atomic xchg 对于 word 和 byte 而言一样便宜,但对于 cmpxchg 来说,希望太大了。 但是几乎所有非 x86 ISA 都有 LL/SC 而不是 xchg / cmpxchg,因此即使是原子交换也是单独的 LL 和 SC 指令,并且 SC 将需要一个 RMW 周期来提交缓存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.