我认为我应该熟悉x86 SIMD扩展。但在我开始之前,我遇到了麻烦。我无法很好地了解哪些内容仍然相关。
x86架构几十年来积累了大量的数学/多媒体扩展:
较新的超集是旧的,反之亦然?或者它们是互补的吗?
有些人已被弃用吗?哪些仍然相关?我听说过传统的SSE"。
他们中的一些是否相互排斥?即他们共用相同的硬件部件吗?
我应该一起使用哪种方法来最大化现代Intel / AMD CPU的硬件利用率?为了论证,让我们假设我可以找到适当的指令用途...如果没有别的话,用CPU加热我的房子。
答案 0 :(得分:11)
我最近更新了SSE,AVX和x86(以及SSE2,avx2)的代码维基。他们涵盖了很多这方面的内容。 tl; dr summary:AVX汇总所有以前的SSE版本,并提供这些指令的3操作数版本。还有256b版本的大多数FP(AVX)和int(AVX2)insn。
有关各种SSE版本的摘要,请参阅维基百科或knm241更详细的答案。
我们并没有想到让SSE过时的问题。更像是,将AVX视为相同旧SSE指令的新版本和更好版本。例如,它们仍然位于非AVX名称下的参考手册中(PSHUFB
,而不是VPSHUFB
。)只要您使用VZEROUPPER
,就可以混合使用AVX和SSE代码当需要避免将VEX与非VEX insn混合时的性能问题(在Intel上)。因此,处理必须调用可能运行非VEX SSE指令的库,或者代码使用SSE FP数学的情况,以及只有在CPU支持时才能运行某些AVX代码的情况下,会有一些烦恼。
如果CPU兼容性不成问题,传统SSE版本的矢量指令将真正过时,就像现在的MMX一样。 AVX / AVX2在各方面都至少略好一些,如果你把VEX编码的128b版本算作AVX而不是SSE。有时您仍然使用128b寄存器,因为您的数据只有大块的数据块,但更多时候使用256b寄存器来同时执行相同操作两倍的数据。
SSE / AVX / x87-FP /整数指令都使用相同的执行端口。你不能通过混合它们来完成更多的并行工作。 (Haswell除外,其中4个ALU端口中的一个只能处理非矢量insn,如GP reg操作和分支)。
答案 1 :(得分:8)
它们是互补的。
每个新指令集扩展都添加新指令,最终添加新的编程模型(例如新寄存器)。
没有弃用,出于兼容性原因,几乎不可能弃用指令。但是,如果传播范围不广,可能会缺少某些可选扩展或从较新型号(如AMD的FMA4)中删除。 有些是残留的,例如,使用SSE +可以更有效地完成FPU和MMX所能完成的一切。
它们并非相互排斥,因为您可以使用其中一种或另一种,毕竟它们不是操作模式(例如真实与受保护模式)。
唯一可能的“冲突”是在MMX和FPU之间,因为它们共享同一组寄存器的下半部分但具有不同的编程模型。
新的向量寄存器从128位增长到256位,再到512位,每次先前的寄存器都成为新寄存器的低位。
您可以将它们一起使用,它们提供实现简单操作的特定硬件支持。
它们就像乐高积木一样,只受你想象力(或设计师的想象力)的限制。
这是一个简单的指令集扩展列表 仅列出了一些功能,有关完整参考,请参阅第9章至第14章中的Intel Manual Vol1。
另请参阅https://hjlebbink.github.io/x86doc/以获取英特尔第2卷(指令集参考)手册的目录,其中包含添加了对该手册条目的说明的扩展名列表。
<强> MMX 强>
引入八个64位寄存器(MM0-MM7)和指令,用于处理八个有符号/无符号字节,四个有符号/无符号字,两个有符号/无符号双字。
<强>的3DNow!强>
添加对MMX的单精度浮点操作数的支持。支持的操作很少,例如加法,减法,乘法。
<强> SSE 强>
引入8个/ 16个128位寄存器(XMM0-XMM7 / 15)和指令以使用4个单精度浮点操作数。也在MMX寄存器上添加整数运算。 (SSE的MMX整数部分有时称为MMXEXT,并且是在没有xmm寄存器和SSE的浮点部分的几个非Intel CPU上实现的。)
<强> SSE2 强>
介绍使用2个双精度浮点操作数的指令,以及128位xmm寄存器中的压缩字节/字/双字/ qword整数。
<强> SSE3 强>
添加一些不同的指令(主要是浮点),包括一种特殊的未对齐负载(lddqu
),它在Pentium 4上更好,同步指令,水平add / sub。
<强> SSSE3 强>
同样是一组不同的指令,大多数是整数。第一个从寄存器而不是硬编码(pshufb
)获取其控制操作数的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 强>
添加融合乘法添加和相关说明。
<强> AVX2 强>
添加对整数数据类型的支持。
AVX512F
添加8个/ 32个512位寄存器(ZMM0-ZMM7 / 31)和8个64位屏蔽寄存器(k0-k7)。将大多数先前的指令提升到512位宽。 AVX512的可选部分添加了指数和指令的指令。倒数(AVX512ER),散射/聚集预取(AVX512PF),散射冲突检测(AVX512CD),压缩,扩展。
IMCI(Intel Xeon Phi)
AVX512早期开发用于第一代英特尔至强唱片(Knight's Corner)协处理器。