X86 不同的mmx、sse和avx版本是互补的还是相互的超集?

X86 不同的mmx、sse和avx版本是互补的还是相互的超集?,x86,sse,avx,mmx,X86,Sse,Avx,Mmx,我想我应该熟悉x86 SIMD扩展。但在我开始之前,我就遇到了麻烦。我找不到关于其中哪些仍然相关的好的概述 数十年来,x86体系结构积累了大量数学/多媒体扩展: MMX 现在 SSE SSE2 SSE3 SSSE3 SSE4 AVX AVX2 AVX512 我忘了什么吗 新的是旧的超集,反之亦然?或者它们是互补的 他们中有人不赞成吗?其中哪些仍然相关?我听人提到过“遗产SSE” 其中有些是相互排斥的吗?即,它们是否共享相同的硬件部件 在现代Intel/AMD CPU上,我应该一起使用哪一个来

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

数十年来,x86体系结构积累了大量数学/多媒体扩展:

  • MMX
  • 现在
  • SSE
  • SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • 我忘了什么吗
新的是旧的超集,反之亦然?或者它们是互补的

他们中有人不赞成吗?其中哪些仍然相关?我听人提到过“遗产SSE”

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


在现代Intel/AMD CPU上,我应该一起使用哪一个来最大限度地提高硬件利用率?为了便于讨论,让我们假设我可以找到指令的适当用法。。。如果没有其他东西的话,用CPU给我的房子供暖。

它们是互补的

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

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

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

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

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


下面是此指令集扩展的简单列表。
仅列出了一些功能,完整参考请参见第9章至第14章

另请参阅英特尔第2卷(指令集参考)手册的目录,以及向该手册条目添加指令的扩展列表

  • MMX
    介绍八个64位寄存器(MM0-MM7)和使用八个有符号/无符号字节、四个有符号/无符号字、两个有符号/无符号DWORD的指令

  • 3DNow
    将对单精度浮点操作数的支持添加到MMX。支持的操作很少,例如加法、减法、乘法

  • SSE
    介绍八个/十六个128位寄存器(XMM0-XMM7/15)和使用四个单精度浮点操作数的指令。在MMX寄存器上也添加整数操作。(SSE的MMX整数部分有时称为MMXEXT,在一些没有xmm寄存器和SSE的浮点部分的非英特尔CPU上实现。)

  • SSE2
    介绍使用2个双精度浮点操作数和128位xmm寄存器中的压缩字节/字/dword/qword整数的指令

  • SSE3
    添加一些不同的指令(主要是浮点指令),包括一种特殊的未对齐加载(
    lddqu
    ),它在奔腾4、同步指令、水平添加/订阅上更好

  • SSSE3
    又是一组不同的指令,大部分是整数。从寄存器而不是硬编码(
    pshufb
    )获取其控制操作数的第一次随机洗牌。更多的水平处理、洗牌、打包/解包、mul+附加字节和一些专门的整数add/mul内容

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

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

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

  • FMA
    加法、乘法、加法和相关指令

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


  • 添加八个/三十二个512位寄存器(ZMM0-ZMM7/31)和八个64位掩码寄存器(k0-k7)。将最前面的指令提升到512位宽。AVX512的可选部分为指数和倒数(AVX512ER)、分散/聚集预取(AVX512PF)、分散冲突检测(AVX512CD)、压缩和扩展添加指令

  • IMCI(英特尔至强Phi)
    第一代英特尔至强Phi(骑士角)协处理器AVX512的早期开发


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

有关各种SSE版本的摘要,请参见维基百科,