SIMD指令一般有两种:
A. 使用对齐的内存地址的那些,如果地址未在操作数大小边界对齐,则会引发一般保护 (#GP) 异常:
movaps xmm0, xmmword ptr [rax]
vmovaps ymm0, ymmword ptr [rax]
vmovaps zmm0, zmmword ptr [rax]
B. 那些使用未对齐内存地址的,不会引发这样的异常:
movups xmm0, xmmword ptr [rax]
vmovups ymm0, ymmword ptr [rax]
vmovups zmm0, zmmword ptr [rax]
但我只是好奇,为什么我要用脚射击并使用第一组的对齐内存指令?
最佳答案
movups/vmovups
可以使用。在对齐访问案例(见下文)中讨论的相同惩罚也适用于此。此外,跨越高速缓存线或虚拟页面边界的访问总是会对所有处理器造成损失。 movups/vmovups
在管道的前端和后端消耗更多资源(最多两倍)。换句话说,movups/vmovups
速度最高可达 movaps/vmovaps
的两倍在延迟和/或吞吐量方面。 因此,如果您不关心较旧的微体系结构,那么两者在技术上是等效的。尽管如果您知道或期望数据对齐,则应使用对齐指令来确保数据确实对齐,而无需在代码中添加显式检查。
关于x86 - 对齐与未对齐 x86 SIMD 指令之间的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52147378/