x86 - 对齐与未对齐 x86 SIMD 指令之间的选择

标签 x86 sse simd avx avx512

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可以使用。在对齐访问案例(见下文)中讨论的相同惩罚也适用于此。此外,跨越高速缓存线或虚拟页面边界的访问总是会对所有处理器造成损失。
  • 对齐访问:
  • 在 Intel Nehalem 及更高版本(包括 Silvermont 及更高版本)和 AMD Bulldozer 及更高版本上:预解码后,它们以完全相同的方式对相同的操作数执行。这包括对移动消除的支持。对于获取和预解码阶段,它们为相同的操作数消耗相同的资源。
  • 在 Nehalem 和 Bonnell 之前以及 Bulldozer 之前:它们被解码为不同的融合域 uops 和未融合域 uops。 movups/vmovups在管道的前端和后端消耗更多资源(最多两倍)。换句话说,movups/vmovups速度最高可达 movaps/vmovaps 的两倍在延迟和/或吞吐量方面。

  • 因此,如果您不关心较旧的微体系结构,那么两者在技术上是等效的。尽管如果您知道或期望数据对齐,则应使用对齐指令来确保数据确实对齐,而无需在代码中添加显式检查。

    关于x86 - 对齐与未对齐 x86 SIMD 指令之间的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52147378/

    相关文章:

    x86 - 像 Denormals-Are-Zero (DAZ) 这样的非规范标志会影响比较的相等性吗?

    c - 希望提高内联汇编的效率,有人可以提供建议吗?

    delphi - 如何在 Delphi 32 中探测计算机是否支持 SSE2?

    c# - .NET 中的快速矢量数学 - 有哪些选项?

    c++ - 通过AVX指令向量化间接访问

    c - 如何将 AVX/SIMD 与嵌套循环和 += 格式一起使用?

    c++ - GDB 在操作 SSE2 寄存器时报告 EXC_BAD_ACCESS

    assembly - assembly 模数 x86

    c - 如何初始化范围从0到N的SIMD vector ?

    c++ - SSE 加载/存储内存事务