热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在x86ASM中原子地移动64位值?

如何解决《如何在x86ASM中原子地移动64位值?》经验,为你挑选了1个好方法。

首先,我发现了这个问题:如何以原子方式读取x86 ASM中的值? 但它有点不同,在我的情况下,我想在32位应用程序中原子地分配一个浮点(64位双倍)值.

来自:"英特尔®64和IA-32架构软件开发人员手册,Volume3A"

奔腾处理器(以及更新的处理器)保证以下额外的内存操作将始终以原子方式执行:

读取或写入在64位边界上对齐的四字

实际上是否可以使用一些组装技巧?



1> Peter Cordes..:

在64位x86 asm中,您可以使用整数mov rax, [rsi],或x87或SSE2. 只要地址是8字节对齐(或在Intel p6和更高版本的CPU上:不跨越缓存行边界),加载或存储将是原子的.


在32位x86 asm中,只使用整数寄存器的唯一选择是lock cmpxchg8b,但这对于纯负载或纯存储来说很糟糕.(您可以通过设置expected = desired = 0将其用作加载,但只读内存除外).(GCC /铛采用lock cmpxchg16batomic在64位模式,但一些编译器简单地选择将16个字节的对象不是无锁).

所以答案是:不要使用整数寄存器:fild qword/ fistp qword可以复制任何位模式而不更改它.(只要x87精度控制设置为完整的64位尾数).对于Pentium及更高版本的对齐地址,这是原子的.

在现代x86上,使用SSE2 movq加载或存储.例如

; atomically store edx:eax to qword [edi], assuming [edi] is 8-byte aligned
movd   xmm0, eax
pinsrd xmm0, edx            ; SSE4.1
movq   [edi], xmm0

只有SSE1可用,请使用movlps.(对于加载,您可能希望打破对xmm寄存器的旧值的错误依赖性xorps).

使用MMX,movq来往/来自mm0-7作品.


gcc 在32位模式下按优先顺序使用SSE2 movq,SSE1 movlps或x87 fild/ .不幸的是,Clang 即使在SSE2可用时也会使用:LLVM bug 33109..fstpstd::atomic-m32lock cmpxchg8b

某些版本的gcc已配置-msse2为默认情况下启用-m32(在这种情况下,您可以使用-mno-sse2-march=i486查看gcc在没有它的情况下执行的操作).

我将加载和存储函数放在Godbolt编译器资源管理器上,以便通过x87,SSE和SSE2查看来自gcc的asm.来自clang4.0.1和ICC18.

gcc作为int-> xmm或xmm-> int的一部分在内存中反弹,即使SSE4(pinsrd/ pextrd)可用.这是一个错过优化(gcc bug 80833).在64位模式下,它有利于ALU movd + pinsrd/pextrd,-mtune=intel或者-mtune=haswell显然不是32位模式或者不是这种用例(XMM中的64位整数而不是正确的矢量化).无论如何,请记住,只有加载或存储atomic shared必须是原子的,其他加载/存储到堆栈是私有的.


推荐阅读
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • 主函数:CStringGetCPUIDString()Copyright(C)shangweixiao2011 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温Linux内核:互斥和同步相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • A题这题贼水,直接暴力就可以了。用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段。1#include<stdio.h>2intn;3boolvi ... [详细]
  • 1引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着JavaSE1.6对Synchronized进行 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 文章目录Golang定时器Timer和Tickertime.Timertime.NewTimer()实例time.AfterFunctime.Tickertime.NewTicke ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
author-avatar
星空下的舞者j
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有