如何将 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 汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章