SIMD指令的内存操作数对齐与数据移动
1. SSE、AVX和AVX2内存操作数对齐
SSE和AVX指令通常允许访问各种内存操作数大小。标量指令可操作单数据元素,能访问字节、字、双字和四字大小的内存操作数,在很多方面,这类内存访问与非SIMD指令的内存访问类似。不过,SSE、AVX和AVX2指令集扩展还会访问内存中的打包或向量操作数,且对打包内存操作数的访问有严格规则。
- SSE指令的内存对齐 :SSE指令一次可访问最多128位(16字节)的内存。多数多操作数SSE指令可指定XMM寄存器或128位内存操作数作为源(第二个)操作数。一般来说,这些内存操作数必须位于16字节对齐的内存地址(即内存地址的低4位必须为0)。几乎所有SSE、AVX和AVX2指令在尝试访问未16字节对齐地址上的128位对象时,都会产生内存对齐错误,所以要确保SSE打包操作数正确对齐。可以使用
align 16指令来保证16字节打包数据对象的16字节对齐,但在以字节、字或双字对齐类型定义的段中使用align 16,MASM会报错,它在段落、页或任何align(n)(n大于或等于16)选项下才能正常工作。 - AVX指令的内存对齐 :使用AVX指令访问256位(32字节)内存操作数时,必须确保这些操作数从32字节地址边界开始。由于默认段对齐是段落(16字节)对齐,且段的对齐必须大于或等于段内任何
align指令的操作数字段,所以align 32不起作用。要定义AV
超级会员免费看
订阅专栏 解锁全文
43

被折叠的 条评论
为什么被折叠?



