如何解决从XMM迁移到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中运行。
解决方法
rcx是否对齐为32个字节? movdqa xmm,m128
需要16字节对齐,而vmovdqa ymm,m256
需要32字节对齐,因此,如果仅将代码移植到AVX2而不增加对齐,则将无法使用。
要么将对齐方式增加到32字节,要么使用vmovdqu
避开所有对齐方式问题。与SSE指令相反,AVX指令的内存操作数通常没有对齐要求(vmovdqa
是少数例外之一)。如果可能,对齐输入数据仍然是一个好主意,因为跨缓存行的内存访问会产生额外的罚款。
您的内存在64字节边界上对齐以进行256位AVX操作吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。