如何将 SSE 汇编代码转换为 AVX1/2 汇编代码?

Posted

技术标签:

【中文标题】如何将 SSE 汇编代码转换为 AVX1/2 汇编代码?【英文标题】:How to transform SSE assembly code to AVX1/2 assembly code? 【发布时间】:2020-01-30 03:49:06 【问题描述】:

我正在尝试以 NASM 或 MASM(英特尔语法)将函数从 AVX 转换为 AVX2。特别是:

vmovapd xmm0, XMMWORD PTR [rax]

像魅力一样工作。

vmovapd ymm0, YMMWORD PTR [rax]

抛出异常:

Exception levée à 0x00007FF73F7818EC dans x64asm.exe:0xC0000005: 违反 d'accès lors de la Lecture de l'emplacement 0xFFFFFFFFFFFFFFFF.

我不明白我做错了什么。

【问题讨论】:

您的第一个版本是旧版 SSE,而不是 AVX1。 AVX1 包括双倍压缩。无论如何,大概你的指针只有 16 字节对齐,而不是 32。你可以使用vmovupd,或者增加你所指向的任何东西的对齐。没有更多上下文就不可能说更多。我的法语生疏了,但如果 0xFFFFFFFFFFFFFFFF 是您尝试从中加载的 RAX 中的地址,那么真正的错误是更早的并且您已经损坏了您的指针。 vmovapd xmm0, [rax]vmovapd ymm0, [rax] 都是 AVX1 指令:AVX1 添加了 256 位版本的 SIMD FP 指令(以及所有遗留 SSE 指令的 VEX 编码,其中内存操作数可以错位,除了对齐 -所需的负载/存储,例如vmovapd/ps); AVX2 还添加了 256 位版本的整数 SIMD 指令,以及一些车道交叉洗牌。您真正要问的是如何将矢量扩大到 256 位。另见***.com/tags/avx/info 和***.com/tags/avx2/info 【参考方案1】:

没关系,这是由于数组未对齐。

感谢您的宝贵时间和解释。

【讨论】:

以上是关于如何将 SSE 汇编代码转换为 AVX1/2 汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 M 文件转换为 RISC-V 汇编代码?

在汇编中将无符号字符转换为浮点数(为浮点向量计算做准备)

NEON 汇编代码,如何将 BYTE 转换为浮点数?

怎样能将汇编语言转换成c语言

内联汇编中的 sse 约束不起作用

SSE 内联汇编和可能的 g++ 优化错误