【发布时间】: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 位。另见stackoverflow.com/tags/avx/info 和stackoverflow.com/tags/avx2/info