在8位字段上使用CMPXCHG指令比在32位字段上使用CMPXCHG指令更糟吗?

问题描述 投票:0回答:1

我想问问在8位存储字段上使用CMPXCHG指令是否比在32位字段上使用CMPXCHG指令在任何方面都要差,我正在使用C11 stdatomic.h来实现几个同步方法。

非常感谢。 :)

c assembly x86 c11
1个回答
0
投票

不,没有罚款。现代的x86 CPU可以将单个字节与对齐的dword或qword进行加载并存储到其L1d高速缓存中,而不会有任何损失。 Can modern x86 hardware not store a single byte to memory?答案:可以零罚分1

[asm周围的asm指令处理寄存器中的一个窄整数,如果与[u]int32_t相比有任何额外成本,也应该忽略不计。参见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上,您希望原子xchg的字与字节价格一样便宜,但这对于cmpxchg来说实在是太过希望了。但是,几乎所有非x86 ISA都具有LL / SC,而不是xchg / cmpxchg。

© www.soinside.com 2019 - 2024. All rights reserved.