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
的架构,这部分的变化也非常大,请等继续分解。