34

我想我应该熟悉 x86 SIMD 扩展。但在我还没开始之前,我就遇到了麻烦。我找不到关于其中哪些仍然相关的很好的概述。

x86 架构几十年来积累了大量的数学/多媒体扩展:

  • MMX
  • 3D现在!
  • 上证所
  • SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • 我是不是忘记了什么?

新的是否是旧的超集,反之亦然?或者它们是互补的?

其中一些是否已弃用?其中哪些仍然相关?我听说过对“旧版 SSE”的提及。

其中一些是相互排斥的吗?即它们是否共享相同的硬件部件?

我应该一起使用哪个来最大限度地提高现代 Intel / AMD CPU 的硬件利用率?为了争论,让我们假设我可以找到指令的适当用途……如果没有别的,用 CPU 加热我的房子。

4

2 回答 2

21

它们是互补的。

每个新的指令集扩展都会添加新指令并最终添加新的编程模型(例如新寄存器)。

没有一个被弃用,出于兼容性原因,弃用指令几乎是不可能的。然而,一些可选扩展可能不存在或从较新的型号(如 AMD 的 FMA4)中删除,如果不是很广泛。
但是有些是退化的,例如可以使用 FPU 和 MMX 完成的所有事情都可以使用 SSE+ 更有效地完成。

从某种意义上说,它们不是相互排斥的,您可以使用其中一种或另一种,毕竟它们是指令而不是操作模式(例如真实模式与保护模式)。
唯一可能的“冲突”是在 MMX 和 FPU 之间,因为它们共享同一组寄存器的下部,但具有不同的编程模型。
新的向量寄存器已经从 128 位增长到 256 位和 512 位,每次以前的寄存器都变成了新寄存器的低位部分。

您可以一起使用它们,它们提供特定的硬件支持来实现简单的操作。

它们就像乐高积木,你只受你的想象力(或设计师的想象力)的限制。


这里是这个指令集扩展的简单列表。
仅列出了部分特性,完整参考请参见Intel Manual Vol1第 9 至 14 章。

另请参阅https://hjlebbink.github.io/x86doc/以获取英特尔第 2 卷(指令集参考)手册的目录,其中包含在该手册条目中添加说明的扩展列表。

  • MMX
    引入了 8 个 64 位寄存器 (MM0-MM7) 和指令来处理 8 个有符号/无符号字节、4 个有符号/无符号字、2 个有符号/无符号 dword。

  • 3D现在!
    向 MMX 添加对单精度浮点操作数的支持。支持的操作很少,例如加法、减法、乘法。

  • SSE
    引入了 8 个/16 个 128 位寄存器 (XMM0-XMM7/15) 和指令来处理四个单精度浮点操作数。也在 MMX 寄存器上添加整数操作。(SSE 的 MMX 整数部分有时称为 MMXEXT,并在一些没有 xmm 寄存器和 SSE 浮点部分的非 Intel CPU 上实现。)

  • SSE2
    引入指令以使用 2 个双精度浮点操作数,以及 128 位 xmm 寄存器中的压缩字节/字/双字/qword 整数。

  • SSE3
    添加了一些不同的指令(主要是浮点),包括一种lddqu在 Pentium 4 上更好的特殊类型的非对齐加载()、同步指令、水平加/减。

  • SSSE3
    同样是一组不同的指令,主要是整数。第一个从寄存器而不是硬编码 ( pshufb) 中获取其控制操作数的 shuffle。更多的水平处理、shuffle、打包/解包、mul+add on bytes,以及一些专门的整数 add/mul 东西。

  • SSE4 (SSE4.1, SSE4.2)
    增加很多指令:通过为所有整数数据类型(尤其是32位整数一直缺乏)提供min和max等操作来填补很多空白,以前整数min 仅适用于无符号字节和有符号 16 位。还有缩放、FP 舍入、混合、线性代数运算、文本处理、比较。也是读取视频内存或将其复制回主内存的非临时负载。(以前只有 NT 商店可用。)

  • AESNI
    添加对加速 AES 对称加密/解密的支持。

  • AVX 添加八个/十六个 256 位寄存器 (YMM0-YMM7/15)。
    支持所有以前的浮点数据类型。三操作数指令。

  • FMA
    Add Fused Multiply Add 和相关指令。

  • AVX2
    添加对整数数据类型的支持。

  • AVX512F
    增加 8 个/32 个 512 位寄存器 (ZMM0-ZMM7/31) 和 8 个 64 位掩码寄存器 (k0-k7)。将大多数先前的指令提升到 512 位宽。AVX512 的可选部分添加了指数和倒数指令 (AVX512ER)、分散/聚集预取 (AVX512PF)、分散冲突检测 (AVX512CD)、压缩、扩展。

  • IMCI(英特尔至强
    融核) AVX512 的早期开发,用于第一代英特尔至强融核(Knight's Corner)协处理器。

于 2015-07-18T16:12:13.897 回答
21

我最近更新了SSEAVXx86(和SSE2avx2)的标签 wiki。他们涵盖了很多内容。tl;dr 摘要:AVX 汇总了所有以前的 SSE 版本,并提供了这些指令的 3 操作数版本。还有大多数 FP (AVX) 和 int (AVX2) insns 的 256b 版本。

有关各种 SSE 版本的摘要,请参阅维基百科或 knm241 的更详细的答案。

我们真的不认为这会使 SSE 过时。更像是,将 AVX 视为相同旧 SSE 指令的新版本和更好版本。它们仍在非 AVX 名称下的参考手册中(例如PSHUFB,不是VPSHUFB。)您可以混合 AVX 和 SSE 代码,只要您VZEROUPPER在需要时使用以避免将 VEX 与非 VEX insns 混合使用(关于英特尔)。因此,在处理您必须调用可能运行非 VEX SSE 指令的库,或者您的代码使用 SSE FP 数学,但只有在 CPU 支持的情况下才能运行一些 AVX 代码的情况时,会有些烦恼。

如果 CPU 兼容性不是问题,那么向量指令的旧版 SSE 版本将真正过时,就像现在的 MMX 一样。如果将 VEX 编码的 128b 版本算作 AVX,而不是 SSE,那么 AVX/AVX2 至少在各方面都要好一些。有时您仍然会使用 128b 寄存器,因为您的数据仅以那么大的块的形式出现,但更常见的是使用 256b 寄存器一次对两倍的数据执行相同的操作。

SSE/AVX/x87-FP/integer 指令都使用相同的执行端口。通过混合它们,您无法并行完成更多工作。(Haswell 除外,其中 4 个 ALU 端口之一只能处理非向量 insn,如 GP reg ops 和分支)。

于 2015-07-18T19:02:05.690 回答