从 XMM 迁移到 YMM
Migrating from XMM to YMM
考虑:
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 中 Release/Debug.
对于 256 位 AVX 操作,您的内存在 64 字节边界上对齐?
rcx 是否对齐到 32 字节? movdqa xmm, m128
需要16字节对齐但是vmovdqa ymm, m256
需要32字节对齐,所以如果你只是把代码移植到AVX2而不增加对齐,是行不通的。
要么将对齐增加到 32 字节,要么使用 vmovdqu
来回避所有对齐问题。与 SSE 指令相反,AVX 指令的内存操作数通常没有对齐要求(vmovdqa
是少数例外之一)。如果可能的话,对齐输入数据仍然是个好主意,因为跨缓存行的内存访问会产生额外的惩罚。
考虑:
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 中 Release/Debug.
对于 256 位 AVX 操作,您的内存在 64 字节边界上对齐?
rcx 是否对齐到 32 字节? movdqa xmm, m128
需要16字节对齐但是vmovdqa ymm, m256
需要32字节对齐,所以如果你只是把代码移植到AVX2而不增加对齐,是行不通的。
要么将对齐增加到 32 字节,要么使用 vmovdqu
来回避所有对齐问题。与 SSE 指令相反,AVX 指令的内存操作数通常没有对齐要求(vmovdqa
是少数例外之一)。如果可能的话,对齐输入数据仍然是个好主意,因为跨缓存行的内存访问会产生额外的惩罚。