单指令多数据SIMD的SSE/AVX指令集和API

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#

Technologies

 MMX
 SSE
 SSE2
 SSE3
 SSSE3
 SSE4.1
 SSE4.2
 AVX
 AVX2
 FMA
 AVX-512
 KNC
 AMX
 SVML
 Other
目录

SSE

SIMD浮点寄存器

SIMD浮点数据类型

SIMD执行方式

数据格式

SIMD浮点控制/状态寄存器

概述

后续版本

寄存器

指令表

浮点指令

整数指令

其他指令

3D Now!和SSE的比较

AVX指令集

指令格式

未来指令格式

解决瓶颈

void _mm_2intersect_epi32 (__m128i a, __m128i b, __mmask8* k1, __mmask8* k2);
vp2intersectd
void _mm256_2intersect_epi32 (__m256i a, __m256i b, __mmask8* k1, __mmask8* k2);
vp2intersectd
void _mm512_2intersect_epi32 (__m512i a, __m512i b, __mmask16* k1, __mmask16* k2);
vp2intersectq
void _mm_2intersect_epi64 (__m128i a, __m128i b, __mmask8* k1, __mmask8* k2);
vp2intersectq
void _mm256_2intersect_epi64 (__m256i a, __m256i b, __mmask8* k1, __mmask8* k2);
vp2intersectq
void _mm512_2intersect_epi64 (__m512i a, __m512i b, __mmask8* k1, __mmask8* k2);
vp4dpwssd
__m512i _mm512_4dpwssd_epi32 (__m512i src, __m512i a0, __m512i a1, __m512i a2, __m512i a3, __m128i * b);
vp4dpwssd
__m512i _mm512_mask_4dpwssd_epi32 (__m512i src, __mmask16 k, __m512i a0, __m512i a1, __m512i a2, __m512i a3, __m128i * b);
SSE
SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是继MMX的扩展指令集。SSE指令集提供了70条新指令。AMD后来在Athlon XP中加入了对这个新指令集的支持。

SSE是 “因特网数据流单指令序列扩展 ( Internet Streaming SIMD Extensions)的缩写。SSE除保持原有的MMX指令外,又新增了70条指令,在加快浮点运算的同时,改善了内存的使用效率,使内存速度更快。它对游戏性能的改善十分显著,按Intel的说法,SSE对下述几个领域的影响特别明显:3D几何运算及动画处理、图形处理(如Photoshop)、视频编辑/压缩/解压(如MPEG和DVD)、语音识别以及声音压缩和合成等。 [1] 

SSE由一组队结构的扩展组成,用以提高先进的媒体和通信应用程序的性能。该扩展(包括新的寄存器、新的数据类型和新的指令)与单指令多数据(SIMD)技术相结合,有利于加速应用程序的运行。这个扩展与MMX技术相结合,将显著地提高多媒体应用程序的效率。 [1] 

典型的应用程序是:运动视频,图形和视频的组合,图像处理,音频合成,语音的识别、合成与压缩,电话、视频会议和2D,3D图形。对于需要有规律地访问大量数据的应用程序,也可以从流式SIMD扩展的高性能预取和存储方面获得好处。 [1] 

SSE定义了一种简单灵活的软件模式。这种新的模式引入了一种新的操作系统可视状态。为了增强并行性,它增加了一组新的寄存器。现存的各种软件,可以在不作修改的情况下继续在增加了SSE的IA处理器上正确运行。SSE引入了一组新的、通用的浮点指令,可对8个128位SIMD浮点寄存器组进行操作。SSE 指令系统使得程序设计人员能够去设计这样一类的算法,即SSE指令和MMX指令两者混合在一起的紧缩单精度浮点运算和紧缩整型运算的算法。SSE 提供了一些新的指令以控制整个MMX数据类型和32位数据类型的可高速缓存性,能够将数据流直接送存储器而不涉及Cache。SSE还提供了能够预取数据的新指令。SSE对于IA编程环境而言,提供了如下的新扩展: [1] 

●8个SIMD浮点寄存器(XMM0~XMM7);

●SIMD浮点数据类型(128位紧缩浮点数);

●SSE指令系统。 [1] 


SIMD浮点寄存器
IA的SSE提供了8个128位的通用寄存器,每个寄存器可以直接寻址。这些寄存器都是新的,需要能使用该类寄存器的操作系统支持。 [2] 

SIMD浮点寄存器保存着紧缩的128位数据。流式SIMD扩展指令访问SIMD浮点寄存器时,直接使用寄存器名XMM0~XMM7。SIMD浮点寄存器可被用以完成数据计算,但不能用来寻址存储器。寻址仍然使用整型寄存器来实现,并且采用标准的IA寻址方式以及通用寄存器名。 [2] 

MMX寄存器被映射为浮点寄存器。从MMX操作转换到浮点操作需要执行EMMS指令。由于SIMD浮点寄存器是一个独立的寄存器文件,因此MMX指令和浮点指令都能够与流式SIMD扩展指令混合在一起,而不需要执行如EMMS指令那样的特殊操作。 [2] 


SIMD浮点数据类型
IA流式SIMD扩展的基本数据类型是紧缩单精度浮点操作数,即4个32位,单精度浮点(SP ~ FP)数。新的SIMD整型指令可以按紧缩字节、紧缩字或者紧缩双字的数据类型进行操作。新的预取指令是在32字节或者更大的数据规模基础之上工作的,它不管这些数据属于何种类型。4个32位单精度浮点数编号为0~3,第0个数据位于寄存器的低32位之中。 [2] 

SSE与存储器之间的紧缩数据(单精度的浮点双字)传送,按64位的块或者128位的块来进行。但是,当按紧缩数据类型执行算术操作或者逻辑操作时,却按SIMD浮点寄存器中4个独立的双字并行地进行操作。新的SIMD整型指令遵循MMX指令的惯例,按MMX寄存器的数据类型,而不是按SIMD浮点128位寄存器的数据类型进行操作。 [2] 


SIMD执行方式
SSE使用单指令多数据(SIMD)技术,按照128位浮点寄存器中的单精度浮点数完成算术和逻辑操作。这种技术通过一条指令并行地处理多个数据元素,以提高软件的速度性能。流式SIMD扩展支持紧缩的单精度浮点数据类型的操作,其SIMD整型指令支持紧缩整型数据类型(字节、字、双字)的操作。SSE 指令能够在保护方式、实地址方式和虚拟8086方式下运行。 [2] 


数据格式
SSE的紧缩128位数据,编号为0~127。位0为最低有效位(ISB),127为最高有效位( MSB)。当存储数据时,128位的数据总是按“小端”法进行排序,即低地址的字节为低有效字节,高地址的字节为高有效字节。 [2] 

Pentium II处理器的SIMD浮点指令以32位单精度浮点数据为单位进行操作。SIMD浮点寄存器中的值与存储器中的128位数具有相同的格式。 [2] 

当存储器存储实型数时,单精度实型值按4个连续的字节存储在存储器中。128位的访问方式用于128位的存储器访问SIMD浮点寄存器之间的128位传送以及所有的逻辑展开/算术指令操作。32位的访问方式则用于32位的存储器访问、SIMD浮点寄存器之间的32位传送以及各种算术指令操作。其中,算术指令有128位操作的,也有32位操作的。 [2] 


SIMD浮点控制/状态寄存器
控制/状态寄存器MXCSR用来屏蔽/开放数值异常处理、设置舍入方式、设置清零方式和观察状态标志。该寄存器的内容可以通过LDMXCSR和FXRSTOR指令来加载,通过STMXSCRR和FXSAVE指令将它存入存储器。 [2] 

寄存器中的位5 ~位0表示是否检测到SIMD浮点数值异常。它们是“粘贴( Sticky)"标志,通过LDMXSCR指令对相应字段写0可以清除这些标志。如果LDMXCSR指令清除了相应的屏蔽位之后又对相应的异常标志置1,不会立即产生异常。只有在下一次SSE扩展处理时,出现了这种异常条件才会发生异常。SSE的每种异常只有一个异常标志,因此一次紧缩数据(4个SP浮点数)操作时,不能为每个数据操作提供异常报告。在同一条指令之内出现多个异常条件时,则修改相关的异常标志并且指示着这些条件中最后一个异常条件所发生的异常。在复位时,这些标志将被清除。 [2] 

位12~位7组成数值异常屏蔽。如果相应的位置1,则该种异常被屏蔽;如果相应的位被清除,则该种异常开放。在复位时,这些位全被置为1,意味着屏蔽所有的数值异常。

位14~位13为舍入控制字段。舍人控制除提供定向舍入、截尾舍入之外,还控制着公用的就近舍入方式。在复位时,舍入控制被置为就近舍入。

位15( FZ)用来启动“清洗为0( Flush To Zero)"方式。在复位时,该位被清除,为禁止“清洗为0”方式。MXCSR寄存器的其他位(位31 ~ 位16和位6)定义为保留位并清除为0。试图使用FXRSTOR或者LDMXCSR指令对保留位写人非0值,将引起通用保护异常。 [2] 

启动“清洗为0"方式,在下列情况下,会有如下的效果: [2] 

(1)回送0结果,且0值带有真实结果的符号;

(2)精度异常标志和下溢异常标志置为1。 [2] 

在应用程序中,下溢异常出现时,希望能以精度的轻微损失为代价而换得应用程序的快速运行,因此采用“清洗为0"方式。对于“清洗为0”的下溢是这样定义的:当计算结果规格化之前,指数部分处于不可规格化范围,则产生“清洗为0",而不管是否有精度损失。未屏蔽的下溢异常是早于“清洗为0”方式产生的,这就意味着,当下溢异常未被屏蔽时,产生了下溢条件的SSE指令,将调用异常处理程序,而不管“清洗为0"方式是否为“使能”状态。 [2] 

Intel在Pentium IV处理器中加入了SSE2指令集。与Pentium III处理器采用的SSE指令集相比,目前Pentium IV的整个SSE2指令集共有144条,其中包括原有的68组SSE指令及新增加76组SSE2的指令。全新的SSE2指令除了将传统整数MMX寄存器也扩展成128位(128bit MMX)位,另外还提供了128位SIMD整数运算操作和128位双精密度浮点运算操作。

概述
AMD后来在Athlon XP中加入了对SSE指令集的支持。这个指令集增加了对8个128位寄存器XMM0-XMM7的支持,每个寄存器可以存储4个单精度浮点数。使用这些寄存器的程序必须使用FXSAVE和FXRSTR指令来保持和恢复状态。但是在Pentium III对SSE的实现中,浮点数寄存器又一次被新的指令集占用了,但是这一次切换运算模式不是必要的了,只是SSE和浮点数指令不能同时进入CPU的处理线而已。

SSE指令集主要包括以下3种类型: [2] 

①是单指令多数据浮点运算指令,共50条。 PentiumⅢ芯片内增加了8个专门配套的128位浮点寄存器,一条指令可以同时处理4对单精度32位浮点数的运算,从而使 PentiumⅢ在语音数据处理以及图形的旋转、翻转和变形等三维空间浮点运算处理方面的整体性能有了很大的提高。 [2] 

②是内存连续数据流优先处理指令,共8条。典型的存储器连续数据流有音频数据流、视频数据流、数据库访问数据流与图形处理数据流等。通过采用新的数据预存取技术,减少了CPU处理连续数据流的中间环节,大大提高了连续数据流处理的效率,也明显改善了视频/音频信息处理的速度与质量。 [2] 

③增强MMX多媒体运算的新指令,共12条。它们采用了比 Pentium更先进的算法进一步增强和完善了MMX指令系统。 [2] 


后续版本
SSE2

SSE2是Intel在Pentium 4处理器的最初版本中引入的,但是AMD后来在Opteron 和Athlon 64处理器中也加入了SSE2的支持。SSE2指令集添加了对64位双精度浮点数的支持。这个指令集还增加了对CPU快取的控制指令。AMD对它的扩展增加了8个XMM寄存器,但是需要切换到64位模式(AMD64)才可以使用这些寄存器。 [3] 

SSE3

SSE3是Intel在P4的 Prescott版中引入的指令集。SSE3新增了13条指令,其中用于视频解码,两条用于线程同步,其余的用于复杂的数学运算、浮点数与整数之间的转换及SIMD浮点运算,使处理器对DSP及3D处理的性能大为提升。 [4] 

SSSE3

2005年,作为SSE3指令集的补充版本,SSSE3出现在酷睿微架构处理器中,新增16条指令,进一步增强CPU在多媒体、图形图像和 Internet等方面的处理能力。 [4] 

SSE4

SSE4是Intel在Penryn核心的Core 2 Duo与Core 2 Solo处理器时,新增的47条新多媒体指令集,多媒体指令集,并内建在Phenom与Opteron等K10架构处理器中,不过无法与Intel的SSE4系列指令集相容。 [4] 

SSE5

SSE5指令集是AMD公司推出的全新指令集,它的功能是增强高性能计算应用,并充分发挥多核心、多媒体的并行优势。SSE5是128-bit指令集,一共有170条指令,其中基础指令64条。 [5] 

SSE5指令集增加了几条新指令: [5] 

①三操作数指令:x86指令以往只能处理双操作数,而SSE5会提高到三操作数,达到RISC架构的水平,从而把多个简单的指令集整合到更高效的一个单独指令中,提高执行效率。 [5] 

②融合乘法累积:该技术可以把乘法和其他算法结合起来,保证只用一条指令就能完成迭代运算,从而简化代码、提高效率,适用于真实图形着色、快速照相渲染、空间化音频、复向量(矢量)数学等场合。 [5] 

③除此之外,SSE5还新增了整数乘法累积指令(IMAC, IMADO)、置换与条件移动指令、向量比较与测试指令、精度控制舍入与变换指令等。 [5] 

AVX

AVX全称 Advanced vector extensions(高级矢量扩展),是 Intel公司推出的全新一代SIMD指令集,直接跳过SSE5(由AMD所定义),AVX借鉴了一些 AMD SSE5指令集的设计思路,进行扩展和加强,形成一套新一代的完整SIMD指令集规范。 [5] 

AVX指令集将原来的128位XMM寄存器扩充为256位的YMM寄存器,从而支持256位的vector计算。改进和加强了原有的在3个 operands指令的编码和语法,使之更灵活。增加一个全新的VEX prefix,实现对原有的 prefix ( escape / SIMD prefix) 集成,从而消除了 escape / SIMD prefix。FMA功能支持IEEE-754 2008。 [5] 

AVX指令集通过 VEX prefix可实现4个 operands,表示为dest、srel、src2、src3,dest、srcl、src2可由 VEX. vvvv、 ModRM. r/m及 ModRM. r/m来提供,src3由1个字节的immediate来提供。AVX指令不支持MMX寄存器。 [5] 

AES-NI指令集

AES-NI指令集的作用在于加速AES加密解密的处理过程,类似于我们熟悉的SSE等CPU指令集,AES-NI指令集能够大大缓解CPU的工作负担,同时在一定程度上加速AES的加解密过程。 [5] 

AES-NI指令集中包含了4条新的指令,它们分别是负责加密的 AESENC、 AESENCLAST和负责解密的 AESDEC、 AESDECLAST。另外还有两个AES密匙扩展指令 AESIMO、AESKEYGENASSIST。这些指令都属于SIMD单指令多数据编码。它们支持目前最为主流的AES-128、AES-196、AES-256。 [5]

寄存器
SSE加入新的8个128位寄存器(XMM0~XMM7)。而AMD发表的x86-64延伸架构(又称AMD64)再加入额外8个寄存器。除此之外还有一个新的32位的控制/状态寄存器(MXCSR)。不过只能在64位的模式下才能使用额外8个寄存器。 [6] 

每个寄存器可以容纳4个32位单精度浮点数,或是2个64位双精度浮点数,或是4个32位整数,或是8个16位短整数,或是16个字符。整数运算能够使用正负号运算。而整数SIMD运算可能仍然要与8个64位MMX寄存器一起运行。 [6] 

因为操作系统必须要在进程切换的时候保护这些128位的寄存器状态,除非操作系统去引导这些寄存器,否则默认值是不会去激活的。这表示操作系统必须要知道如何使用FXSAVE与FXRSTOR指令才能存储x87与SSE寄存器的状态。而在当时IA-32的主流操作系统很快的都加入了此功能。 [6] 

由于SSE加入了浮点支持,SSE就比MMX更加常用。而SSE2加入了整数运算支持之后让SSE更加的有弹性,当MMX变成是多余的指令集,SSE指令集甚至可以与MMX并发运作,在某些时候可以提供额外的性能增进。 [6] 

第一个支持SSE的CPU是Pentium III,在FPU与SSE之间共享运行支持。当编译出来的软件能够交叉的同时以FPU与SSE运作,Pentium III并无法在同一个周期中同时运行FPU与SSE。这个限制降低了指令管线的有效性,不过XMM寄存器能够让SIMD与标量浮点运算混合运行,而不会因为切换MMX/浮点模式而产生性能的折损。 [6]

指令表
SSE提供标量与包裹式(packed)浮点指令。 [6] 


浮点指令
存储器到寄存器/寄存器到存储器/寄存器之间的数据搬移 [6] 

标量– MOVSS

包裹式– MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS

数学运算 [6] 

标量– ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS

包裹式– ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS

比较 [6] 

标量– CMPSS, COMISS, UCOMISS

包裹式– CMPPS

数据拆包(unpack)与随机搬移(shuffle) [6] 

包裹式– SHUFPS, UNPCKHPS, UNPCKLPS

数据类型转换 [6] 

标量– CVTSI2SS, CVTSS2SI, CVTTSS2SI

包裹式– CVTPI2PS, CVTPS2PI, CVTTPS2PI

逐位逻辑运算 [6] 

包裹式– ANDPS, ORPS, XORPS, ANDNPS


整数指令
数学运算 [6] 

PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW

数据搬移 [6] 

PEXTRW, PINSRW

其他 [6] 

PMOVMSKB, PSHUFW


其他指令
MXCSR管理 [6] 

LDMXCSR, STMXCSR

缓存与存储器管理 [6] 

MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

3D Now!和SSE的比较
3D Now!是AMD公司用于对抗MMX的指令集技术,而SSE又是Intel公司发布的MMX扩展指令集。那么,3D Now!和SSE相比又如何呢? [7] 

首先,它们有很多相似之处: [7] 

(1)两种指令集都支持SIMD (单指令多数据流)操作。 [7] 

(2)都支持在一个时钟周期内执行四次浮点操作。它们在这一性能上旗鼓相当。

(3)都支持“平面”寄存器组结构。

(4)都兼容MMX指令集,可混合使用。也就是说在程序中可以自由地使用这些指令。

(5)都支持数据预取机制,也就是说它们都支持分支预测和推测执行技术。 [7] 

其次,3D Now!比SSE具有如下优势: [7] 

(1)发布时间早,支持者多。3D Now!技术的推出比SSE早了九个多月,拥有超过1000万个K6-2 CPU的用户基础。而且3D Now!在发布时曾广泛征求了3D技术广大厂商的意见,所以得到了包括微软在内的很多软硬件供应商的支持,涌现出了很多专为其优化的软件、游戏。而相比之下,对几经改名的SSE的推出,广大软硬件厂商的反应并不太热烈。 [7] 

(2)不需要对现存的Windows操作系统做任何修改,因此实现极为容易。3D Now!的性能非常优秀。而SSE与操作系统有关,当时的Windows必须进行修改,以支持SSE的八个新寄存器。所以Windows 98的用户需要使用软件补丁,升级以支持SSE;而Windows NT的用户则必须升级到Windows 2000才行。 [7] 

第三,SSE比3D Now!具有如下优势: [7] 

(1)由于Intel公司在计算机界的地位和Pentium II的巨大出货量,Pentium 的用户一定比 K6-2、Athlon 多得多,所以SSE举足轻重。 [7] 

(2)据Intel公司说,SSE提高了因特网上的3D网页的开发和运行效率。 [7]

AVX指令集
AVX指令集是Sandy Bridge和Larrabee架构下的新指令集。AVX是在之前的128位扩展到256位的单指令多数据流。而Sandy Bridge的单指令多数据流演算单元扩展到256位的同时数据传输也获得了提升,所以从理论上看CPU内核浮点运算性能提升到了2倍。

Intel AVX指令集,在单指令多数据流计算性能增强的同时也沿用了的MMX/SSE指令集。不过和MMX/SSE的不同点在于增强的AVX指令,从指令的格式上就发生了很大的变化。x86(IA-32/Intel 64)架构的基础上增加了prefix(Prefix),所以实现了新的命令,也使更加复杂的指令得以实现,从而提升了x86 CPU的性能。

Intel的微架构进入了全速发展的时期,在2010年4月结束的IDF峰会上Intel公司就发布了2010年的RoadMap。2011年1月Intel发布了处理器微架构Sandy Bridge,其中全新增加的指令集也将带来CPU性能的提升。

Intel公司将为Sandy Bridge带来全新的指令扩展集Intel Advanced Vector Extensions (Intel AVX)。

Intel全新的发展战略也表明,从2010年开始软件和新指令也将有更好的兼容,而单指令多数据流浮点运算(即实数运算)并非决定因素,所以CPU的性能就变得更加困难。而性能增强的同时,单指令多数据流浮点运算在已有编码的基础上也必须会有更大的提升空间,特别是scalar整数运算部分。单线程整数运算性能的提升也遇到了瓶颈,本次IDF展会上,确定了这一CPU开发方向的同时也表明了技术的进化趋势。

AVX并不是x86 CPU的扩展指令集,可以实现更高的效率,同时和CPU硬件兼容性也更好,并且也有着足够的扩展空间,这都和其全新的命令格式系统有关。更加流畅的架构就是AVX发展的方向,换言之,就是摆脱传统x86的不足,在SSE指令的基础上AVX也使SSE指令接口更加易用。

针对AVX的最新的命令编码系统,Intel也给出了更加详细的介绍,其中包括了大幅度扩充指令集的可能性。比如Sandy Bridge所带来的融合了乘法的双指令支持。从而可以更加容易地实现512位和1024位的扩展。而在2008年末到2009年推出的meniikoaCPU“Larrabee(LARAB)”处理器,就会采用AVX指令集。从地位上来看AVX也开始了Intel处理器指令集的新篇章。

指令格式
AVX的256位单指令多数据流扩展支持是其最具革新的设计部分,同时也代表了指令编码格式的变更。x86(IA-32/Intel 64)指令,在op code之前增加了一个字节的prefix,从而实现了扩展的支持。增强的寄存器也使指令头部分不断增加prefix成为了可能。单指令多数据流指令也以SIMDprefix的身份出现,另外Intel 64也增加了8个寄存器从而实现了对于REXprefix的支持。

IA-32/Intel 64的另外一个优势就是对于prefix的扩展,不过也存在一些不足,比如prefix指令格式变得更加复杂,而指令也更长等。因此IA-32/Intel 64的指令如果要实现decoding将增加难度,而decoding的同时也将带来电力的消耗。实际上Core Microarchitecture(Core MA)所遇到的最大瓶颈,就是指令的puridekodo和fetch。而prefix的不断增加也使指令的结尾产生了新的问题。

AVX的指令编码系统的产生,同时也是SSE指令进化的必然。(IA-32/Intel 64)SIMD指令最初是3个字节,不过对于追加的数据类型在这基础之上,64-位 增加了8个1字节的Prefix寄存器,并且在命令头处增加了1字节。Intel的Bob Valentine先生(CPU Architect, Mobility Group)对此进行了说明。

AVX对于变更编码指令编码格式方面,也有了解决办法,其中增加了1个重叠字节的prefix就成为低效率的解决方案,而VEX(Vector Extension)的prefix以及1-2个字节的连续VEX的payload(Payload)系统,也成为相对完美的解决办法。

VEX编码的构想,就是压缩Prefix中包含的信息,在1个字节的payload中全部包括了prefix的内容。并且在今后导入的新的寄存器中,128位或更长的256位的数据,也将在payload中压缩。

未来指令格式
由于VEX的支持,AVX的长指令可以变得更短,而VEX的payload也有着1字节和2字节两种,VEXprefix为1字节payload的C5和2字节的C1,以及1字节的payload等情况,同样的指令和之前的指令格式比较beru的1字节分指令相比也更短。

实际上1字节的payload也并不会全部载入,也有着2个版本的VEX,4字节版本和5字节版本。而对于大部分legacy编码,即使是64位的指令,也可以支持4字节指令寄存。而1字节指令就变得更加短小了。 而几个全新的指令也使用了新的寄存器,所以增加了5字节的版本。Valentine先生对VEX进行了相关的介绍。

VEX编码格式的另外一个重要点就是有着强大的指令集扩展支持,而对于同样命令长度的指令也更加容易地实现,这样就使不断增长的命令兼容变得更加容易。

其中5字节版的payload,也专门有着指令扩展的3比特空间,而3位也意味着1000条新指令的支持,全新的ficha和新的寄存器以及vector也都可以更加容易地增加。

除了VEX指令格式外还有着1,024位的SIMD的支持。同时多重prefix的支持和之前的beru比较,全部的指令在格式上都更小,之前的1字节C5通过C4,也可以决定op code的长度。而从硬件上来看的话,指令的puridekodo实现也更加容易。

解决瓶颈
AVX的VEX的编码系统,从某一侧面上也反应了Intel处理器今后的进化趋势,因为它解决了x86系列CPU在decoding上的不足。Core MA有着4条命令的执行通道,不过front end却存在着不足,首先L1缓存fetch端口也有着16字节的长度。而fetch的命令次数也被得到了限制。首先IA-32/Intel 64命令的puridekodo也有着先天的瓶颈,而操作数和地址长度的指令prefix“LCP(Length Changing Prefixes),使得puridekodo变得更慢,所以必须要改变长标注的算法。

Core MA在puridekodo&decoding方面的不足,从根本上来看是IA-32/Intel 64指令集架构本身的问题。IA-32/Intel 64架构为了增强长命令而增设的缓存,使命令fetch的更长,并且更加复杂的命令格式也由此产生。RISC(Reduced Instruction Set Computer)的命令格式也决定了其长度,decoding虽然容易,但x86系CPU也就要以牺牲资源为代价,同时也带来了电力的额外消耗。

实际上最新的Nehalem也有着类似Core MA的不足,从某种程度上来看也延续了其不足,如果明确了这一问题的话,那么Nehalem就必须要改进,其中16bytesfetch和puridekodo等方面的改进就势在必行了。而改进所需要的庞大晶体管增加,也会带来功耗的增加。

Nehalem的fetch&decoding

Nehalem的设计其实存在着疑问,不过从VEX格式来分析的话其意图就非常明确了。Intel在完善了CPU的puridekodo&decoding硬件设计的同时,必须要改进指令格式本身。fetch的指令变短的同时,指令的标注却更加复杂了,而解决的唯一办法就是改进指令格式。

在充分考虑硬件方面设计后,intel做出了VEX格式开始的决策。IDF上Valentine先生也对VEX格式进行了详细的说明。他是Core MA的front end的fetch开发以及decoding的高级架构师,同时也是IA-32/Intel 64指令编码器的设计专家。

从整体来看AVX指令的话,可以看出intel公司都CPU开发的全部脉络,Intel公司在对比beru的话,产生改进Drastic的指令集的微架构的想法就变得顺理成章了,如果分析原因的话,那就是微架构本身的改进了。全新的CPU必然要有更好的性能表现,想要提高CPU的性能,那么指令集是最行之有效的手段。

AVX扩展指令包含了SSE指令,这也有助于AVX时代的过度。日前的SSEVEX格式也并不需要绝对的转换过程。Intel公司的Benny Eitan先生也提到,出于整体的考虑,Intel公司对于AVX普及的进行并不会太过迅速,并且也不会立刻停止SSE及MMX时代。

Sandy Bridge也增强了解码器的支持,和之前的IA-32/Intel 64prefix相比,decoding也有了全新的VEX格式的支持。其中VEX指令对于decoding的命令数的支持上更加强劲,同时VEX在执行效率上也更加出色。不过这些和Sandy Bridge真正到来的时候可能还存在差异。

AMD新推出FMA指令也 是 AVX 指令集中的一部分。

AMD 的FMA 指令是3 operands(操作数)的,被称为 FMA3,而AMD的FMA是4 operands 的,被称为 FMA4,AMD认为4 operands 更能提供效率。更加细化!

 
————————————————
版权声明:本文为CSDN博主「rtoax」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Rong_Toa/article/details/114177421

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值