当前位置: 首页 > 知识库问答 >
问题:

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

谷善
2023-03-14

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

我用的是C11标准温度。h来实现两种同步方法。

共有1个答案

淳于亦
2023-03-14

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

如果与int32\t相比有任何额外成本,那么处理寄存器中窄整数的asm指令也应该可以忽略不计。查看GCC为什么不使用部分寄存器?-大多数编译器都知道如何小心使用部分寄存器,而现代CPU(Haswell和更高版本,以及所有非Intel)不会将低位8与寄存器的其余部分分开重命名,因此唯一的危险是错误依赖。根据您的具体操作,最好使用带有原子uint8\t的无符号本地临时变量,或者最好使您的本地变量也具有原子uint8\t。

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

 类似资料:
  • 问题内容: 我正在使用ColdFusion 8和SQL Server 2008 R2。 我试图查询一列值以获取具有范围内的值的行。该列应为数字,但不是。它被设置为varchar(由其他人)。有100,000多行数据。这是数据的伪样本: 我的查询如下所示: 该查询不会运行,因为where语句的列是varchar,并且出现转换错误,因此我必须将where语句更改为此: 现在,当我运行这样的查询时,它会

  • 问题内容: 64位CPU(amd64)在兼容模式下支持32位Intel指令。另外,如果ELF标头说它是32位可执行文件,则64位Linux安装允许运行包含32位指令的ELF。 我想知道是否可以在ELF内放入一些汇编指令,从而在程序中间将CPU切换为32位兼容模式(然后再返回)。如果内核不允许这些汇编指令,也许有什么方法可以使内核将已经运行的进程切换为32位? 出于好奇,这主要是一个问题,因为我真的

  • 问题内容: 我在使用批量API(C#NEST v5.4)插入文档时遇到问题。我有一个文档数组,在数组中有我的ID。 我的代码是: 如何 使用描述符手动 插入 _id ? 提前致谢! 问题答案: 您可以使用类似的方法在上设置索引名称。鉴于以下POCO 例如,使用递增计数器设置ID 产生以下请求

  • 问题内容: 我正在开发一个指令,该指令根据在模板中定义的click事件(ng- click)来显示和隐藏其内容。在某些使用该指令的视图上,我希望能够知道该指令当前是显示还是隐藏其内容,因此我可以响应DOM更改。该指令具有单独的作用域,当该指令被“切换”时,我试图通知父作用域。我正在尝试通过将回调函数传递给使用该指令的指令来实现此目的,该指令可以在指令的状态更改(即隐藏或显示)时调用 我不确定该指令

  • 在C/C中,可以对SIMD(如AVX和AVX2)指令使用内部函数。有没有办法在Rust中使用SIMD?

  • 我有这样的记录: 如何选择指定字段?例如,我想通过userId=“id10”选择记录,然后只返回crmId字段值? 操作:findOne