Dew*_*ewr 6 c x86 assembly instruction-set c11
我想问一下CMPXCHG在8位内存字段上使用指令是否比在32位字段上使用指令更糟糕。
我正在使用C11 stdatomic.h来实现一些同步方法。
不,对于lock cmpxchg [mem], reg8位和32位,没有任何惩罚。现代的x86 CPU可以将单个字节与对齐的dword或qword进行加载并存储到其L1d高速缓存中,而不会有任何损失。 现代x86硬件能否不将单个字节存储到内存中?答案:它可以零罚款1,因为它们会花费晶体管使不对齐的负载/存储速度更快。
如果有任何额外的开销,则围绕寄存器中的窄整数的asm指令也应该忽略不计[u]int32_t。请参阅为什么GCC不使用部分寄存器?-大多数编译器都知道如何谨慎使用部分寄存器,而现代CPU(Haswell和更高版本,以及所有非Intel处理器)都不会与其余寄存器分开重命名低8,因此唯一的危险就是错误的依赖关系。根据您的实际工作,最好将unsigned本地临时对象与一起使用_Atomic uint8_t,或者最好也使您的本地人成为本地人uint8_t。
脚注1:与某些非x86 CPU上的字节存储实际上是通过缓存RMW周期实现的(是否存在任何现代CPU上,缓存的字节存储实际上比字存储慢?)。在那些CPU上,您希望原子xchg的字与字节价格一样便宜,但这对于cmpxchg来说实在是太过希望了。但是无论如何,几乎所有非x86 ISA都具有LL / SC而不是xchg / cmpxchg,因此,即使原子交换是单独的LL和SC指令,SC也将花费RMW周期来提交高速缓存。