最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

AVX高级矢量扩展指令集

IT圈 admin 22浏览 0评论

2024年9月30日发(作者:门嘉树)

AVX高级矢量扩展指令集

作者:暂无

来源:《计算机世界》 2011年第7期

盘骏

在上一篇连载中,笔者介绍了Sandy Bridge微架构中对性能有很大影响的几处改进,然而

最重要的执行单元的变化没有涉及到,这部分的变化还跟Sandy Bridge新加入的AVX指令集相

关。AVX(Advanced Vector Extensions,高级矢量扩展)是X86上重要的指令集改进,不仅仅

在于其对性能的明显提升,还在于其对现有X86指令集的多种革新。

强大的性能:

256位向量计算

向量就是多个标量的组合,通常意味着SIMD(单指令多数据),就是一个指令同时对多个

数据进行处理,达到很大的吞吐量。

Sandy Bridge的AVX将X86向量化宽度扩展到了256位,原有的16个128位XMM寄存器

扩充为256位的YMM寄存器,可以同时处理8个单精度浮点数和4个双精度浮点数,在理想情

况下,Sandy Bridge的浮点吞吐能力可以达到前代的两倍。

从Nehalem开始的微架构包含了3个运算端口:0、1和5,每个运算端口分为三个区域:

ALU、SIMD INT、SIMD FP,分别执行整数和逻辑运算、SIMD整数和SIMD浮点运算。在每一个

时钟周期,每个运算端口可以分发一个uop,这个uop可以是三种运算中任意的一种。不同的

运算区域可以同时运作。

Sandy Bridge微架构的所有执行单元都经过了修改以执行256位AVX指令,它并没有直接

将所有浮点执行单元扩充到256位宽度,而是采用了一种较为节约晶体管乃至能耗的方法:重

用128位的SIMD整数和SIMD浮点路径。

除了AVX带来的性能增强之外,Sandy Bridge还继续增强了AES指令集的性能,提升其吞

吐量,此外,SHLD(移位)指令、ADC(进位加)指令和Multiply(64位乘数128位积)运算

的性能也都得到了提升,SHLD指令性能提升增强了SHA-1计算能力,ADC吞吐量翻倍提升了大

数值运算能力,而最后者提升了现有RSA程序25%的性能。

精简X86指令集

除了明显提升浮点运算性能之外,AVX指令集还是对X86指令集的一个精简。我们知道由

于是不定长的CISC指令集,X86指令集可以很容易地进行扩展,每一代处理器都像不要钱似的

增加扩展指令集。然而目前的这种通过增加各种Prefix前缀来扩展指令集的方式已经达到了其

极限,并且这种方式导致的指令集复杂化和长度增加,导致了执行文件的臃肿和解码器单元的

复杂化和低效化。

AVX指令集带来了新的操作码编码方式,这种编码方式叫做VEX(Vector Extension),其

动机就是压缩各式各样的Prefix前缀,集中到一个比较固定的字段中,缩短指令长度,降低无

谓的代码冗余,并且也降低了对解码器的压力。

VEX编码方式使用了两种VEX Prefix,除了一个字节的字头之外,分别具有1到2个字节

的Payload(负载),在这个Payload里面就包括了所有的Prefix的内容,达到了精简指令集

的目的。

VEX前缀包含了X86-64指令使用的REX前缀以及原SSE指令使用的前缀,还融合了普通操

作码带有的Escape字段,从某种意义上来说,VEX让CISC的X86指令集往RISC精简指令集靠

近了一点,当然,CISC易于扩充、支持复杂灵活的寻址方式的特性依然无损。

强化X86指令集

基于历史上X86处理器缺乏存储单元的原因,X86指令集属于双操作数的破坏性指令集,

例如,指令add ax, bx包含了ax和bx两个操作数,作用是将寄存器ax和bx的数值相加,并

保存到寄存器ax当中去,计算结束后,源操作数ax的内容就被计算结果“摧毁”了。

在传统的仅具有8个通用寄存器的X86处理器上,这种编码方式的使用实属没有办法,同

时期具有更多通用寄存器的RISC处理器都采用的是多操作数的非破坏性句法。在应用了

Register Renaming寄存器重命名技术之后,X86处理器事实上也具有了很多的寄存器可供使用,

因此Intel就动起了新的念头。Sandy Bridge带来的AVX指令集提供了新的3?4操作数的非破

坏性句法,在某种程度上,这弥补了X86指令集的体系缺陷。

例如,要实现xmm10 = xmm9 + xmm1,传统X86处理器需要两条指令:

movapps xmm10, xmm9

addpd xmm10, xmm1

在应用AVX指令集新的3操作数格式之后,只需要一条指令就能完成这个功能:

vaddpd xmm10, xmm9, xmm1

显然,新的指令操作数明显降低了指令的数量,处理器吞吐量得到了提升,代码运行更快

速,同时能耗也降低了。

X86指令集:不断进化

CISC指令集的思想就是用复杂的硬件来完成尽可能多的工作,RISC则是使用尽量少的指令

并通过复杂的程序来完成同样的功能。每一代的X86指令集,都会对不同的应用增加新的指令

集,这些指令集能高效地处理对应的应用。

Sandy Bridge新加入的AVX指令集让X86从128位提升到256位向量运算,大幅度提升了

性能,此外,AVX精简了X86指令集的设计,并弥补了破坏性句法的体系缺陷,可以说是一个

非常重要的改进。关于Sandy Bridge的微架构就介绍到这里,下回笔者将介绍Sandy Bridge

的架构,这部分的变化也非常大,请等继续分解。

2024年9月30日发(作者:门嘉树)

AVX高级矢量扩展指令集

作者:暂无

来源:《计算机世界》 2011年第7期

盘骏

在上一篇连载中,笔者介绍了Sandy Bridge微架构中对性能有很大影响的几处改进,然而

最重要的执行单元的变化没有涉及到,这部分的变化还跟Sandy Bridge新加入的AVX指令集相

关。AVX(Advanced Vector Extensions,高级矢量扩展)是X86上重要的指令集改进,不仅仅

在于其对性能的明显提升,还在于其对现有X86指令集的多种革新。

强大的性能:

256位向量计算

向量就是多个标量的组合,通常意味着SIMD(单指令多数据),就是一个指令同时对多个

数据进行处理,达到很大的吞吐量。

Sandy Bridge的AVX将X86向量化宽度扩展到了256位,原有的16个128位XMM寄存器

扩充为256位的YMM寄存器,可以同时处理8个单精度浮点数和4个双精度浮点数,在理想情

况下,Sandy Bridge的浮点吞吐能力可以达到前代的两倍。

从Nehalem开始的微架构包含了3个运算端口:0、1和5,每个运算端口分为三个区域:

ALU、SIMD INT、SIMD FP,分别执行整数和逻辑运算、SIMD整数和SIMD浮点运算。在每一个

时钟周期,每个运算端口可以分发一个uop,这个uop可以是三种运算中任意的一种。不同的

运算区域可以同时运作。

Sandy Bridge微架构的所有执行单元都经过了修改以执行256位AVX指令,它并没有直接

将所有浮点执行单元扩充到256位宽度,而是采用了一种较为节约晶体管乃至能耗的方法:重

用128位的SIMD整数和SIMD浮点路径。

除了AVX带来的性能增强之外,Sandy Bridge还继续增强了AES指令集的性能,提升其吞

吐量,此外,SHLD(移位)指令、ADC(进位加)指令和Multiply(64位乘数128位积)运算

的性能也都得到了提升,SHLD指令性能提升增强了SHA-1计算能力,ADC吞吐量翻倍提升了大

数值运算能力,而最后者提升了现有RSA程序25%的性能。

精简X86指令集

除了明显提升浮点运算性能之外,AVX指令集还是对X86指令集的一个精简。我们知道由

于是不定长的CISC指令集,X86指令集可以很容易地进行扩展,每一代处理器都像不要钱似的

增加扩展指令集。然而目前的这种通过增加各种Prefix前缀来扩展指令集的方式已经达到了其

极限,并且这种方式导致的指令集复杂化和长度增加,导致了执行文件的臃肿和解码器单元的

复杂化和低效化。

AVX指令集带来了新的操作码编码方式,这种编码方式叫做VEX(Vector Extension),其

动机就是压缩各式各样的Prefix前缀,集中到一个比较固定的字段中,缩短指令长度,降低无

谓的代码冗余,并且也降低了对解码器的压力。

VEX编码方式使用了两种VEX Prefix,除了一个字节的字头之外,分别具有1到2个字节

的Payload(负载),在这个Payload里面就包括了所有的Prefix的内容,达到了精简指令集

的目的。

VEX前缀包含了X86-64指令使用的REX前缀以及原SSE指令使用的前缀,还融合了普通操

作码带有的Escape字段,从某种意义上来说,VEX让CISC的X86指令集往RISC精简指令集靠

近了一点,当然,CISC易于扩充、支持复杂灵活的寻址方式的特性依然无损。

强化X86指令集

基于历史上X86处理器缺乏存储单元的原因,X86指令集属于双操作数的破坏性指令集,

例如,指令add ax, bx包含了ax和bx两个操作数,作用是将寄存器ax和bx的数值相加,并

保存到寄存器ax当中去,计算结束后,源操作数ax的内容就被计算结果“摧毁”了。

在传统的仅具有8个通用寄存器的X86处理器上,这种编码方式的使用实属没有办法,同

时期具有更多通用寄存器的RISC处理器都采用的是多操作数的非破坏性句法。在应用了

Register Renaming寄存器重命名技术之后,X86处理器事实上也具有了很多的寄存器可供使用,

因此Intel就动起了新的念头。Sandy Bridge带来的AVX指令集提供了新的3?4操作数的非破

坏性句法,在某种程度上,这弥补了X86指令集的体系缺陷。

例如,要实现xmm10 = xmm9 + xmm1,传统X86处理器需要两条指令:

movapps xmm10, xmm9

addpd xmm10, xmm1

在应用AVX指令集新的3操作数格式之后,只需要一条指令就能完成这个功能:

vaddpd xmm10, xmm9, xmm1

显然,新的指令操作数明显降低了指令的数量,处理器吞吐量得到了提升,代码运行更快

速,同时能耗也降低了。

X86指令集:不断进化

CISC指令集的思想就是用复杂的硬件来完成尽可能多的工作,RISC则是使用尽量少的指令

并通过复杂的程序来完成同样的功能。每一代的X86指令集,都会对不同的应用增加新的指令

集,这些指令集能高效地处理对应的应用。

Sandy Bridge新加入的AVX指令集让X86从128位提升到256位向量运算,大幅度提升了

性能,此外,AVX精简了X86指令集的设计,并弥补了破坏性句法的体系缺陷,可以说是一个

非常重要的改进。关于Sandy Bridge的微架构就介绍到这里,下回笔者将介绍Sandy Bridge

的架构,这部分的变化也非常大,请等继续分解。

发布评论

评论列表 (0)

  1. 暂无评论