cpu指令集的诞生发展分类及对处理器性能提升的作用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CPU指令集的诞生、发展、分类及对处理器性能提升的作用
SNB平台的掌上明珠最新AVX指令集A VX(Advanced Vector Extensions,高级矢量扩展)指令集借鉴了一些AMD SSE5的设计思路,进行扩展和加强,形成一套新一代的完整SIMD指令集规范。在今年4月的IDF2
01
0上,英特尔演示了A VX的应用,在两个不同平台上动态跟踪刘翔运行服上的五星红旗,结果显示,支持A VX的系统视频跟踪的用时为14秒,比不支持A VX的系统快了21秒,性能提升了6
0%以上。
有兴趣的读者可以点击观看A VX应用主题演讲视频,时间大概在第33分钟左右。英特尔A VX的新特性
英特尔A VX指令集主要在以下几个方面得到扩充和加强:·支持256位矢量计算,浮点性能最大提升2倍
·增强的数据重排,更有效存取数据
·支持3操作数和4操作数,在矢量和标量代码中能更好使用寄存器
·支持灵活的不对齐内存地址访问
·支持灵活的扩展性强的VEX编码方式,可减少代码支持256位矢量计算
自1999年SSE将矢量处理能力从64位提升到128位后,SSE系列指令都只能使用128位XMM寄存器,这次A VX
将所有16个128位XMM寄存器扩充为256位的YMM寄存器,从而支持256位的矢量计算。128位的XMM寄存器扩展到256位的YMM寄存器
这意味着可以同时处理8个32bit的浮点或是一个256bit 的浮点,在写程序时可以忽略SSE 128bit的限制,直接写入一个可以进行多组操作,能够充分利用256bit数据位宽的代码,理想状态下,浮点性能最高能达到前代的2倍水平。
当然有时并不是能完全能利用这256位,在大多数情况下,这些寄存器的高128位是设为
0或者是“LEFT unchanged”,同时所有的
SSE/SSE2/SSE3/SSSE3/SSE4指令是被A VX全面兼容的
(A VX不兼容MMX),因此实际操作的是YMM寄存器的低128位,在这一点上与原来的SSE系列指令集无异。Sandy Bridge最突出的部分
为了满足指令集带来的改进,Load载入单元也要适应一次载入256Bit的能力,所以增加了一组载入单元完成载入操作,并不是单纯的将带宽扩展一倍。这样可以在一个时钟周期内实现256位的乘、加和Shuffle运算。
使用新的256位寄存器来提升数据I/O效率,更好的标记、传播载入的数据,动态的改变数据序列,以此来组织、访问和载入运算所需的数据,速度更快效率更高。A VX增加了很多新的浮点运算指令
A VX还引入了很多新的浮点运算指令,浮点运算能力加强,不光提升了3D游戏,还可以更有效的支持如复杂的flash 显示,更快的SVG(可伸缩矢量图形)支持,更好的HTML5
效果等等,相比用GPU计算来讲功耗更小,体积更小,成本也小,对GPU计算是个不大不小的冲击。
A VX是SNB最重要改进支持3操作数和4操作数
通常一条计算机指令包括有操作码和操作数(operands),操作码决定要完成的操作,操作数指参加运算的数据及其所在的单元地址。比如movaps xmm1, xmm0就是一个双操作数,SSE指令movaps为操作码,其功能是将xmm0寄存器的内容复制给xmm1。新的3操作数和4操作数格式
A VX指令集改进和加强了原有的在3个操作数指令的编码和语法,使之更灵活。比如要实现xmm10 = xmm9 + xmm1 的功能,以前需要两个指令执行:
movapps xmm10, xmm9将xmm9寄存器数据copy到xmm10
addpd xmm10, xmm1将xmm1和xmm10寄存器数据相加,并存放到xmm10
应用A VX指令集新的3操作数方式,可以直接由一条指令就能完成:
vaddpd xmm10, xmm9, xmm1
显然A VX三操作数能带来更少的寄存器复制,并且代码也更精简。
4操作数虽然是AMD在SSE5中首先提出的,但英特尔的A VX也能支持这一方式,其最终收益是对A VX 128和
A VX 256使用非破坏性语法,减少寄存器间的拷贝,精简代码,增加load/op fusion的机会。
movaps xmm0, xmm4
movaps xmm1, xmm2
blendvps xmm1, m128
比如上面的三条指令,利用4操作数,可以不需要使用隐含的xmm0,直接由下面一条指令完成:
vblendvps xmm1, xmm2, m128, xmm4
支持灵活的不对齐内存地址访问
CPU在工作时只能按照内部数据位宽长度(比如说
32bit)的整倍数为边界进行内存操作,即只能从地址0、32、64、96...处进行存取,而不能从27、58、83等非边界地址处进行。如果一定要取这些非边界地址处的内容,则必须用若干个操作将其凑出来,因而大大影响存取效率。
一个结构体的设计长度却并不一定是32的倍数,例如一个六个字符的结构其长度为48位,如果多个这样的结构在内存中顺着摆放,则许多结构的起始地址将不在边界处,因此编译程序总是会将每个结构的尾部都加入一些必要的
空白,将其凑成32的整数倍,这就是边界对齐的基本道理。传统的指令中,当访问不对齐内存(unaligned memory access)时,需要相当大的访问周期,甚至会有惩罚性延时,极大地降低速度。
而在A VX指令集中,以VEX前缀编码的算术指令和内存访问指令在访问内存时更灵活,既可访问对齐的内存地址,也可访问未对齐的数据。当然访问未对齐数据,多少都
会有损失,但相对传统的指令来说,所承受的惩罚要小得多。
革新的VEX指令编码方式
英特尔在2008年春天的IDF上介绍A VX的时候就表示A VX的重点在于采用了称为“VEX (Vector Extension)”革新的指令编码方式。VEX编码指令解决方案
x86指令集容易扩张,但是每次对于新指令和新数据类型的增加,都会在操作码(opcode)之前增加了一个字节的前缀(prefix),从而实现对扩展的支持。这样的就带来指令集的复杂化和命令长度增加,从而导致二进制的冗余和增加CPU命令解码硬件的复杂性。
VEX编码方式解决了这个问题,VEX的构想,就是压缩prefix中包含的信息,在1个字节的payload中全部包括了prefix的内容,这样缩短指令长度,从而极大地降低了无谓的code size浪费。并且在今后导入的新的寄存器中,128bits 或更长的256bits的数据,也将在payload中压缩。Intel A VX vs. AMD XOP(图片来源后藤弘茂)
VEX prefix分为2个字节和3个字节的版本,即前缀部