assembly - 从 XMM 迁移到 YMM

标签 assembly masm sse simd avx

考虑:

movdqa xmm0, xmmword ptr [rcx]
movdqa xmm1, xmmword ptr [rcx + 16]
movdqa xmm2, xmmword ptr [rcx + 32]
movdqa xmm3, xmmword ptr [rcx + 48]

上面的代码工作正常。 rcx 是 32 位 uint 数组的第一个元素的地址。

但是,当尝试以类似的方式使用 ymm 时:

vmovdqa ymm0, ymmword ptr [rcx]
vmovdqa ymm1, ymmword ptr [rcx + 32]

代码随机抛出sigsegvs:Exception thrown at 0x00007FF95ACC102C (Asm.dll) in Asm.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF..

为什么,我怎样才能让它发挥作用?

我的 CPU 是 i5-10210u(支持 AVX-256)。在 X64 发布/调试中运行。

最佳答案

rcx 是否对齐到 32 字节? movdqa xmm, m128需要16字节对齐但是vmovdqa ymm,m256需要32字节对齐,所以如果你只是移植代码到AVX2而不增加对齐,它不会工作。

要么将对齐增加到 32 字节,要么使用 vmovdqu 来回避所有对齐问题。与 SSE 指令相反,AVX 指令的内存操作数通常没有对齐要求(vmovdqa 是少数异常(exception)之一)。如果可能的话,对齐输入数据仍然是个好主意,因为跨缓存行的内存访问会产生额外的惩罚。

关于assembly - 从 XMM 迁移到 YMM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64682761/

相关文章:

assembly - 使用 SSE(IA32 程序集)执行简单的算术运算

assembly - MIPS 32 位无符号乘法,不使用 mult 或 div

c - 在 C 源代码中省略内联 ASM 代码

assembly - 伪操作和机器操作的区别?

assembly - 汇编中意外的无限循环

c - 矢量化代码随机减速的原因

assembly - MIPS中的div divu

winapi - WriteFile字符串字节长度导致崩溃

visual-studio-2010 - masm 中以字母开头的十六进制值

sse - 在 SIMD 操作的上下文中,非打包指令和打包指令有什么区别?