我想我应该熟悉x86 SIMD扩展.但在我开始之前,我遇到了麻烦.我无法找到关于哪些仍然相关的良好概述.
几十年来,x86架构积累了大量的数学/多媒体扩展:
较新的超集是旧的超集,反之亦然?或者它们是互补的吗?
有些人已被弃用吗?哪些仍然相关?我听说过"遗留SSE".
有些是互斥的吗?即他们共享相同的硬件部分?
我应该一起使用哪个来最大化现代Intel/AMD CPU的硬件利用率?为了争论,让我们假设我可以找到适当的指令用途...如果没有别的话,用CPU加热我的房子.
Pet*_*des 14
我最近更新了SSE,AVX和x86(以及SSE2,avx2)的标签维基.他们涵盖了很多这方面的内容.tl; dr summary:AVX汇总所有以前的SSE版本,并提供这些指令的3操作数版本.还有256b版本的大多数FP(AVX)和int(AVX2)insns.
有关各种SSE版本的摘要,请参阅维基百科或knm241更详细的答案.
我们并没有真正想到让SSE过时的问题.更像是,将AVX视为相同旧SSE指令的新版本和更好版本.它们仍然在非AVX名称下的参考手册中(例如PSHUFB,不是VPSHUFB.)您可以混合AVX和SSE代码,只要您VZEROUPPER在需要时使用以避免混合VEX与非VEX insn的性能问题(在英特尔).因此,处理必须调用可能运行非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操作和分支).
小智 12
它们是互补的.
每个新指令集扩展添加新指令并最终添加新编程模型(例如新寄存器).
没有被弃用,出于兼容性原因,几乎不可能弃用指令.然而,如果不是很广泛的话,可能不存在或从较新的模型(如AMD的FMA4)中删除一些可选扩展.
有些是退休的,例如,使用SSE +可以更有效地完成FPU和MMX可以完成的所有工作.
它们不是相互排斥的,因为你可以使用一个或另一个,毕竟它们是指令而不是操作模式(例如真实与受保护模式).
唯一可能的"冲突"是在MMX和FPU之间,因为它们共享同一组寄存器的下半部分但具有不同的编程模型.
新的向量寄存器从128位增长到256位,再到512位,每次先前的寄存器都成为新寄存器的低位.
您可以将它们一起使用,它们提供实现简单操作的特定硬件支持.
它们就像乐高积木一样,只受你想象力(或设计师的想象力)的限制.
这里是这个指令集扩展的简单列表.
仅列出了一些功能,有关完整参考,请参阅第9章到第14章中的英特尔手册第1卷.
另请参阅https://hjlebbink.github.io/x86doc/以获取英特尔第2卷(指令集参考)手册的目录,其中包含一些扩展列表,其中添加了对该手册条目的说明.
MMX
引入8个64位寄存器(MM0-MM7)和指令,用于处理8个有符号/无符号字节,4个有符号/无符号字,2个有符号/无符号双字.
支持3DNow!
添加对MMX的单精度浮点操作数的支持.支持的操作很少,例如加法,减法,乘法.
SSE
引入8个/ 16个128位寄存器(XMM0-XMM7/15)以及使用4个单精度浮点操作数的指令.也在MMX寄存器上添加整数运算.(SSE的MMX整数部分有时称为MMXEXT,并且是在没有xmm寄存器和SSE的浮点部分的几个非Intel CPU上实现的.)
SSE2
介绍使用2个双精度浮点操作数的指令,以及128位xmm寄存器中的压缩字节/字/双字/ qword整数.
SSE3
添加一些不同的指令(主要是浮点),包括一种特殊的未对齐load(lddqu),它在Pentium 4,同步指令,水平add/sub上更好.
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
添加融合乘法添加和关联指令.
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)协处理器.
| 归档时间: |
|
| 查看次数: |
4838 次 |
| 最近记录: |