X86 不同的mmx、sse和avx版本是互补的还是相互的超集?
我想我应该熟悉x86 SIMD扩展。但在我开始之前,我就遇到了麻烦。我找不到关于其中哪些仍然相关的好的概述 数十年来,x86体系结构积累了大量数学/多媒体扩展: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上,我应该一起使用哪一个来
- MMX
- 现在李>
- SSE
- SSE2
- SSE3
- SSSE3
- SSE4
- AVX
- AVX2
- AVX512
- 我忘了什么吗
在现代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
添加一些不同的指令(主要是浮点指令),包括一种特殊的未对齐加载(
),它在奔腾4、同步指令、水平添加/订阅上更好lddqu
- SSSE3
又是一组不同的指令,大部分是整数。从寄存器而不是硬编码(
)获取其控制操作数的第一次随机洗牌。更多的水平处理、洗牌、打包/解包、mul+附加字节和一些专门的整数add/mul内容pshufb
- 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的早期开发