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

使用gcc内联汇编加载和存储YMM寄存器

我正在尝试使用gcc内联asm加载和存储YMM寄存器。我使用vmovdqa来做这件事。为了将__m256i存储到特定的YMM寄存器(比如YMM10),我使

我正在尝试使用 gcc 内联 asm 加载和存储 YMM 寄存器。我使用 vmovdqa 来做这件事。

为了将 __m256i 存储到特定的 YMM 寄存器(比如 YMM10),我使用以下代码

__m256i addr;
//load value to addr
asm ("vmovdqa %0,%%ymm10nt"
:
: "x" (addr)
:);

为了将 YMM10 中的值加载到变量,我使用以下代码

__m256i readbuff;
asm ("vmovdqa %%ymm10,%0nt"
: "=x" (readbuff)
:
:);

我在这里面临的问题是,在我用一个值加载 YMM10 之后,我只使用了加载了值的寄存器的一半。我的意思是只加载了 128 位,另一半全为零。

我做错了什么吗?我不确定要使用什么指令 - vmovdqa、vmovaps、vmovups。请就此给我建议。

回答


你似乎试图用内联汇编做的事情的整体设计被破坏了。这不是内联汇编的工作方式。这可能是一个 XY 问题;您希望代码执行某些操作,而您选择了一种不可行的方法。

我的意思是只加载了 128 位,另一半全为零。

听起来 GCCveroupper在你的 asm 语句之间做了某处,可能是在函数调用边界。 您没有告诉 GCC YMM10 是您希望稍后阅读的输出。(有点类似于GCC 不会在我的内联 asm 函数调用周围推送寄存器,即使我有 clobbers错误地使用内联 asm)。在这种情况下,GCC 踩到了您的数据;在其他情况下,您可能会破坏 GCC 放在那里的一些数据,稍后再读取。

可以用另一个__m256i变量告诉 GCC 你的 asm 语句中的数据,register __m256i ymm10 asm("ymm10")如果你真的想说服编译器使 asm 变得更糟,而不是让它__m256i像往常一样将变量保存在寄存器中,也许是这样。

但真的不要。您可以使用或其他方式查看GCC 的 asm 输出gcc -S foo.c -o- | less。(不要忘记通常的-O3 -march=native或其他什么)。 如何从 GCC/clang 程序集输出中去除“噪音”? 在某些 YMM 寄存器上使用您自己的vmovdqa指令,而 GCC 出于自己的目的使用其他 YMM 寄存器,只会使 asm 变得更糟。 https://gcc.gnu.org/wiki/DontUseInlineAsm

另请参阅https://stackoverflow.com/tags/inline-assembly/info以获取解释如何正确使用 GNU C 内联 asm 的指南和文档。(但您可能根本不需要 asm。)


请注意,"x" (addr)需要 GCC 已经__m256i addr在另一个 YMM 寄存器中,所以它甚至不是从内存“加载”,它只是在 GCC 已经从内存加载它之后复制 YMM 寄存器(如有必要)。这就是为什么我如此强烈地说这是毫无意义的。






推荐阅读
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 开源实习机会 | Compiler SIG 正式发布实习任务,诚邀您加入申请!
    对编译技术充满兴趣却苦于无从入手?当前疫情形势下,外出实习变得困难重重?现在,Compiler SIG 正式发布了一系列实习任务,为有志之士提供了宝贵的机会。无论你是初学者还是有一定基础的学生,都能在这里找到适合自己的实践项目。我们诚挚邀请您的加入,共同探索编译技术的无限可能! ... [详细]
  • 在CentOS 6.3系统中无法找到g++编译器的解决方案
    在CentOS 6.3系统中,若遇到无法找到g++编译器的问题,可以通过以下步骤解决:首先确保系统已正确配置YUM源,然后使用命令 `yum install gcc-c++` 安装 g++ 编译器。此外,建议检查环境变量设置,确保 `/usr/bin` 路径已包含在内,以避免命令未被识别的情况。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • SSL 错误:目标主机名与备用证书主题名称不匹配
    在使用 `git clone` 命令时,常见的 SSL 错误表现为:无法访问指定的 HTTPS 地址(如 `https://ip_or_domain/xxxx.git`),原因是目标主机名与备用证书主题名称不匹配。这通常是因为服务器的 SSL 证书配置不正确或客户端的证书验证设置有问题。建议检查服务器的 SSL 证书配置,确保其包含正确的主机名,并确认客户端的证书信任库已更新。此外,可以通过临时禁用 SSL 验证来排查问题,但请注意这会降低安全性。 ... [详细]
  • WebStorm 是一款强大的集成开发环境,支持多种现代 Web 开发技术,包括 Node.js、CoffeeScript、TypeScript、Dart、Jade、Sass、LESS 和 Stylus。它为开发者提供了丰富的功能和工具,帮助高效构建和调试复杂的 Node.js 应用程序。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 将JavaScript文件嵌入HTML文档是Web开发中的基本操作。常见的方法是通过在HTML文件中使用``标签来引用外部的.js文件。这种方法不仅保持了代码的整洁性,还便于管理和维护。此外,还可以利用模块化脚本和异步加载技术进一步提升页面性能。 ... [详细]
  • 本文详细解析了LeetCode第215题,即高效寻找数组中前K个最大元素的问题。通过使用快速选择算法(partition),可以在平均时间复杂度为O(N)的情况下完成任务。本文不仅提供了算法的具体实现步骤,还深入探讨了partition算法的工作原理及其在不同场景下的应用,帮助读者更好地理解和掌握这一高效算法。 ... [详细]
author-avatar
平凡特产小店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有