SandyBridge核外架构的进化.docx
- 文档编号:9443956
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:19
- 大小:1.03MB
SandyBridge核外架构的进化.docx
《SandyBridge核外架构的进化.docx》由会员分享,可在线阅读,更多相关《SandyBridge核外架构的进化.docx(19页珍藏版)》请在冰豆网上搜索。
SandyBridge核外架构的进化
SandyBridge核外架构的进化
Nehalem的遗憾
——英特尔SandyBridge处理器分析测试之一
计算机世界实验室盘骏
英特尔的“Tick-Tock”战略已经为人熟知,根据这个策略,英特尔每年都会交替在处理器的制程和微架构上进行更新。
上一年,英特尔将处理器工艺从45nm提升到了32nm,今年,英特尔将处理器架构从Nehalem升级到最新一代的SandyBridge,这个早期被叫做Gesher(希伯来文:
桥梁)的处理器微架构担任着特别的桥梁角色。
Bridge和Gesher都含有桥梁的意思。
而SandyBridge微架构将这个含义发挥到了极致,它是一个集NetBurst微架构与Nehalem微架构大成的产品,也是一个首先将CPU和GPU进行真正融合的产品,更是一个首先将浮点运算密度从128位引向256位的X86处理器产品,它确实像是一个桥梁,引导着芯片设计上和计算模式上的转变。
SandyBridge微架构为什么会是现在这个样子呢?
SandyBridge在上一代Nehalem微架构的基础上进行改进,如果不了解Nehalem微架构,就无法真正理解SandyBridge的进化。
Nehalem无疑是一个很成功的架构,QPI、IMC带来的直联架构,再加上超线程的回归,其性能比起上一代提升了一到两倍以上,在企业级市场、主流乃至高端桌面市场以及移动市场的压倒性的占有率充分地说明了Nehalem的强大。
当然,Nehalem微架构也不是完美的,以笔者的眼光看来,至少有几点Nehalem微架构是有待改进的:
指令拾取和预解码
Nehalem微架构在PentiumM微架构的基础上进行改进,整个流水线上几乎所有的组件都得到了增强,变化最少的就是在指令拾取和预解码阶段了。
这个阶段的作用是将要执行的指令从L1I-Cache中提取到CPU核心里面来,并随后对其进行预解码。
预解码的主要作用就是在一块代码块中辨认每条x86指令的长度。
和Penryn一样,Nehalem以及其改良版Westmere都仍然采用了16Bytes的指令拾取宽度,而竞争对手早已经采用了32Bytes的拾取宽度。
由于x86指令的长度可以从1到15Bytes,因此在很糟糕的情况下,某个时钟周期拾取到的代码块里只包含一个x86指令,和后端动辄6个、4个uop(微指令)的能力不相符合。
Nehalem微架构的指令拾取/预解码单元无法跟上后端处理的速度,因此在运行计算密集型的代码中,它很容易成为瓶颈。
寄存器读停顿
这个情形发生在uop经过RAT(RegisterAliasTable,寄存器别名表)进行寄存器重命名并发往ROB(ReOrderBuffer,重排序缓冲)之后,在这个被称为ROB-read的流水线阶段中,uop们需要读取相关的操作数,也就是读取对应的寄存器,如果这些内容在ROB当中不存在的话。
Nehalem微架构的RAT每时钟周期可以输出4个uop,每个uop可以具有最多两个输入寄存器。
这样它最多需要同时读取8个寄存器。
不幸的是,Nehalem微架构用于保存寄存器的RRF(RetirementRegisterFile,回退寄存器文件)仅具有3个读取端口,无法充分满足寄存器读取的需求,这很容易导致ROB-read以及前方流水线的停顿。
访存能力
Nehalem微架构具有6个执行端口,其中的3个运算端口具有充足的计算能力,基本不会是瓶颈。
然而,访存能力却不一定足够。
Nehalem微架构只有一个Load载入端口和一个Store保存端口。
由于Load操作是如此常见,可以达到uop总数的1/3,因此相对于3个运算端口,这个Load端口是个潜在的瓶颈,特别是对于内存密集型计算来说。
最后,早期的Nehalem架构上还存在大页面TLB数量较少的问题,TLB:
TranslationLookasideBuffer,旁路转换缓冲,或称为页表缓冲,里面存放的是虚拟地址到物理地址的转换表。
Nehalem具有较多的标准4KB页面TLB项,但是更大容量页面的TLB很少,因此,相对来说不适合大规模内存下的应用(如大型数据库和大型虚拟化环境,后来的Westmere通过增加了对1GB页面的支持缓解了这个问题)。
除了Nehalem微架构的一些问题之外,英特尔或者说CPU本身还面临着挑战,来自GPU的挑战。
目前,主要的GPU厂商包括NVIDIA和AMDATI都提供了超越CPU的强劲浮点处理能力,很多超级计算机通过采用了附加GPU的方式获得了很强的计算指标。
CPU能力的增强导致了如硬件解压卡、独立声卡被融合进CPU,而GPU强大的处理能力则被认为是CPU的有力挑战者。
如果运算能力足够强大,CPU被GPU取代也不无可能,英特尔怎么应对这个局面?
SandyBridge进行了什么样的改进、能不能解决这些问题呢?
原文发布于《计算机世界》2011年第4期
SandyBridge微架构的革新
——英特尔SandyBridge处理器分析测试之二
计算机世界实验室盘骏
上文中笔者介绍了Nehalem微架构中存在的一些问题,到了SandyBridge这一代,这些问题还存在吗?
下面我们就来详细解析SandyBridge的微架构,并介绍相对于Nehalem微架构的改进。
前端:
分支预测和微指令缓存
分支预测、指令拾取、预解码以及解码这几个部件组成了处理器微架构的Front-End前端部分。
在Nehalem微架构中,指令拾取和预解码存在问题,在一些情况下会导致指令吞吐量过低,因此其前端是整个流水线当中最容易成为瓶颈的阶段。
SandyBridge没有直接在指令拾取和预解码阶段进行改动,而是对整个前端部分进行了重新设计,通过革新的分支预测单元以及在解码阶段加入一个新的部件来增强整个前端部分的输出能力,同样达到了消除瓶颈的目的。
处理器的前端从L1I-Cache拾取指令,在指令拾取单元没有什么变化的情况下,SandyBridge的L1I-Cache也有了些改进,提升了大型应用程序下的性能。
首先,它从Nehalem的4路组关联提升到了8路组关联,从而降低了CacheLine碰撞的几率,降低了页面冲突;其次,L1I-Cache对应的L1ITLB也略微扩大,2M/4MB对应的TLB表项从Nehalem的7+7提升到了8+8(对每一个硬件线程提供8个表项),可以覆盖更大的代码地址空间。
分支预测是一个既能提升性能又能降低能耗的做法,成功的分支预测可以避免无谓分支代码执行的性能、功耗损失。
SandyBridge的分支预测单元在Nehalem的基础上进行了完全的重造。
通过对分支表结构的压缩定义,BTB(BranchTargetBuffer,分支目标缓存)在同样容量下将保存的分支目标翻番,同样,GBH(GlobalBranchHistory,全局分支历史表)也能保存更多、更深的项目,总的来说,分支预测准确率将会进一步提升。
前端变化中作用更明显的解码器旁边加入的uopcache(微指令缓存),这个部件和NetBurst微架构的TraceCache作用非常相似,不过却是经过了更多的调整和优化,并且更加简洁。
uopcache保存了已经解码的微指令,并且更加接近处理器的后端,因此也可以被称为L0I-Cache。
根据英特尔的说法,通常的应用当中其命中率可以达到80%,在命中这个缓存之后,包括复杂的解码器在内的其它前端部件可以关闭以节约能源,而由uopcache本身输出指令。
这个设计可以很明显地降指令拾取低延迟乃至分支惩罚,让前端可以在更多的时间内处于持续输出4uop/cycle的状态,这很大程度消除了Nehalem前端的瓶颈。
后端:
物理寄存器文件架构
Front-End前端紧接着的是Back-End后端部分,SandyBridge在后端部分也有了很大的变化,其中一个变化来自于寄存器文件的变迁。
在之前,我们介绍了Nehalem微架构采用的RRF(RetirementRegisterFile,回退寄存器文件)存在的会导致寄存器读停顿的问题,SandyBridge通过采用了PRF(PhysicalRegisterFile,物理寄存器文件)结构来消除了这个问题,和前面的uopcache一样,PRF的设计也是从NetBurst架构借鉴而来。
几乎所有的高性能处理器都采用了PRF的方式。
在Nehalem微架构当中,ROB(ReOrderBuffer,重排序缓存)顺序保存了所有uop及其所有的重命名寄存器的数据和状态,架构寄存器则保存在RRF当中。
在SandyBridge的PRF上,ROB不再保存重命名寄存器的数据,取而代之的是保存多个指向PRF的指针,架构寄存器包含在RRF当中,通过状态位来标识。
物理寄存器文件有什么好处?
首先,它消除了旧有的寄存器读停顿造成的瓶颈,现在它不再受限于RRF三个读取端口的限制,所有不同寄存器的内容都可以同时进行读取,不会再引起流水线停顿。
其次,物理寄存器文件消除了寄存器间数据的复制和移动,而只需要更改指针的指向即可,这节约了大量的数据移动能耗,特别是在SandyBridge的AVX指令集支持更多的操作数以及支持的最大寄存器宽度翻倍的情况下。
最后,ROB从保存数据变成保存指针导致了结构上的简化,从而增大了ROB的容量,进一步提升了处理器乱序执行的性能。
SandyBridge的ROB从Nehalem的128项提升到了168项,PRF物理寄存器文件包含了两个部分:
每项64bit、一共160项目的整数寄存器文件和每项256bit、一共144项目的浮点寄存器文件,并且PRF是每个硬件线程各自一份。
在SandyBridge架构当中,还增加了一个硬件监测机构,在使用SAVE/RESTORE指令进行线程切换或者虚拟机切换的时候,可以仅仅恢复/保存线程所使用到的寄存器,而不是恢复/保存所有的架构寄存器,从而节约了上下文切换的时间,这可以提升处理器运行大量线程和多个虚拟机的能力。
后端:
存取单元
微指令经过重命名阶段和读取PRF数据之后进入ReservationStation保留站,通过统一的调度器安排发射到6个不同的执行单元之中。
SandyBridge的ReservationStation容量从Nehalem的36项目提升到了54项目,增加了50%,乱序执行窗口的扩大可以提升处理器的乱序执行能力。
SandyBridge的执行单元也有了很大的改进。
执行单元包括计算单元以及存取单元,这两个都变化甚大,不过这里我们先介绍存取单元的变化,因为之前介绍过Nehalem微架构在这方面是个潜在的瓶颈。
计算单元的改进留到下一篇文章中再介绍。
SandyBridge架构和Nehalem一样具有3个存取端口,Store端口维持不变而Load端口的数量提升到了两个,并且这两个Load端口的AGU地址生成单元均能生成Store操作使用的地址。
Load端口翻番在某种程度上是为了适应SandyBridge处理器新增的AVX指令集带来的256位计算能力,因为每个Load端口的宽度是128位。
然而,现有的各种应用也可以立即从中获益,因为Nehalem微架构的Load端口仅占所有执行单口的1/6,而Load操作通常可以占据uop当中的约1/3。
SandyBridge的双Load端口可以每个时钟周期进行两个128位Load操作,消除了上一代的瓶颈,工作起来也更为灵活。
和Load/Store单元连接的MOB(MemoryOrderingBuffer,内存排序缓存)也得到了增强,MOB和前面的ROB一起属于将乱序执行和顺序回退连接起来的重要部件。
在MOB当中,Load缓存从Nehalem的48项目提升到了64项目,提升幅度为33%,Store缓存从32项目略微提升到了36项目。
SandyBridge的MOB一共可以容纳100个访存操作,这些数据操作均为256位宽度。
和Load能力翻倍配对的是L1D-Cache的增强,它的带宽提升到了48字节,也就是384位,比以往的32字节提升了50%,以同时支持两个128位的Load和一个128位的Store操作。
搭配的L1DTLB据说也有所改进,增加了4个支持1GB页面的项目,以进一部消除Nehalem微架构在面对海量内存应用下的性能问题,这4个大页面DTLB项目应该是全关联的,其它的L1DTLB则应该维持4路关联不变。
在L2Cache方面,SandyBridge相对Nehalem没有太大的变化。
可以看到,通过将Nehalem微架构和NetBurst微架构进行融合,引入NetBurst上的微指令缓存和物理寄存器文件架构,并改进Load/Store单元和L1D-Cache带宽设计,SandyBridge消除了上一代Nehalem微架构存在的比较明显的三个瓶颈,还顺带获得了更多的附加增益。
SandyBridge在整个流水线的方方面面都得到了改进,然而还有一个很重要的部分没有被提及:
运算单元,这个部分的变化和SandyBridge引入的AVX指令集紧密联系
AVX高级矢量扩展指令集
——英特尔SandyBridge处理器分析测试之三
计算机世界实验室盘骏
在上一篇连载中,笔者介绍了SandyBridge微架构中对性能有很大影响的几处改进,然而最重要的执行单元的变化没有涉及到,这部分的变化还跟SandyBridge新加入的AVX指令集相关。
AVX(AdvancedVectorExtensions,高级矢量扩展)是X86上重要的指令集改进,不仅仅在于其对性能的明显提升,还在于其对现有X86指令集的多种革新。
强大的性能:
256位向量计算
向量就是多个标量的组合,通常意味着SIMD(单指令多数据),就是一个指令同时对多个数据进行处理,达到很大的吞吐量。
早期的超级计算机大多都是向量机,而通过随着图形图像、视频、音频等多媒体的流行,PC处理器也开始向量化。
X86上最早出现的是1996年的MMX(多媒体扩展)指令集,乃至1999年的SSE(流式SIMD扩展)指令集,分别是64位向量和128位向量,比超级计算机用的要短得多,所以叫做“短向量”。
SandyBridge的AVX将向量化宽度扩展到了256位,原有的16个128位XMM寄存器扩充为256位的YMM寄存器,可以同时处理8个单精度浮点数和4个双精度浮点数,在理想情况下,SandyBridge的浮点吞吐能力可以达到前代的两倍。
目前AVX的256位向量仅支持浮点,不像128位的SSE那样,也能支持整数运算。
SandyBridge微架构的所有执行单元都经过了修改以执行256位AVX指令,特别是对于3个运算端口而言。
SandyBridge微架构并没有直接将所有浮点执行单元扩充到256位宽度,而是采用了一种较为节约晶体管乃至能耗的方法:
重用128位的SIMD整数和SIMD浮点路径。
从Nehalem开始的微架构包含了3个运算端口:
0、1和5,每个运算端口分为三个功能区域:
ALU整数、SIMDINT、SIMDFP,分别执行整数和逻辑运算、SIMD整数和SIMD浮点运算,操作的是32/64位GPR通用寄存器和128位的XMM寄存器。
在每一个时钟周期,每个运算端口可以分发一个uop,这个uop可以是三种运算中任意的一种。
不同的运算区域可以同时运作,例如在浮点运算进行长耗时计算的时候,仍然使用ALU单元进行通常的整数和逻辑运算。
基于执行单元的流水化设计,尽管一些运算耗时比较长,然而每个时钟周期都可以流入新的指令,因此吞吐量也能够得到保证。
例外的是除法单元,线路复杂、长耗时并且目前仍未能全流水化。
不同运算区域之间的数据传递需要1~2个时钟周期。
除了AVX带来的性能增强之外,SandyBridge还继续增强了AES指令集的性能,提升其吞吐量,此外,SHLD(移位)指令、ADC(进位加)指令和Multiply(64位乘数128位积)运算的性能也都得到了提升,SHLD指令性能提升增强了SHA-1计算能力,ADC吞吐量翻倍提升了大数值运算能力,而最后者提升了现有RSA程序25%的性能。
精简X86指令集
除了明显提升浮点运算性能之外,AVX指令集还是对X86指令集的一个精简。
我们知道由于是不定长的CISC指令集,X86指令集可以很容易地进行扩展,每一代处理器都像不要钱似的增加扩展指令集,然而目前的这种通过增加各种Prefix前缀来扩展指令集的方式已经达到了其极限,并且这种方式导致的指令集复杂化和长度增加,导致了执行文件的臃肿和解码器单元的复杂化和低效化。
如笔者说过的那样,解码器一直是X86处理器的一个瓶颈所在。
AVX指令集带来了新的操作码编码方式,这种编码方式叫做VEX(VectorExtension),其动机就是压缩各式各样的Prefix前缀,集中到一个比较固定的字段中,缩短指令长度,降低无谓的代码冗余,并且也降低了对解码器的压力,实乃一举多得。
VEX编码方式使用了两种VEXPrefix,除了一个字节的字头之外,分别具有1到2个字节的Payload(负载),在这个Payload里面就包括了所有的Prefix的内容,达到了精简指令集的目的。
这两种VEX前缀分别是以C5h开头的2字节Prefix和C4h开头的3字节Prefix,前者主要用于包含传统的128位SIMD整数、SIMD浮点运算,后者则主要用来进行新的256位AVX运算以及未来可使用的更多指令集扩展。
VEX前缀包含了X86-64指令使用的REX前缀以及原SSE指令使用的前缀,还融合了普通操作码带有的Escape字段,从某种意义上来说,VEX让CISC的X86指令集往RISC精简指令集靠近了一点,当然,CISC易于扩充、支持复杂灵活的寻址方式的特性依然无损。
如图所示,VEX前缀的RXBW字段包含了原REX前缀的所有功能,pp字段包含了原SIMD指令的所有前缀,在三字节C4h格式的VEX前缀中,mmmmm字段包含了原Escape字段并提供了极大的扩展空间。
X86指令总长度不大于15个字节的规定仍然维持不变。
强化X86指令集
基于历史上X86处理器缺乏存储单元的原因,X86指令集属于双操作数的破坏性指令集,例如,指令addax,bx包含了ax和bx两个操作数,作用是将寄存器ax和bx的数值相加,并保存到寄存器ax当中去,计算结束后,源操作数ax的内容就被计算结果“摧毁”了。
如果源操作数的内容在其他运算中还需要用到的话,那么你通常需要保存到堆栈中去,或者保存到主内存中去。
实际上X86指令集采用的就是时间换空间的方法。
在传统的仅具有8个通用寄存器的X86处理器上,这种编码方式的使用实属没有办法,同时期具有更多通用寄存器的RISC处理器都采用的是多操作数的非破坏性句法。
在应用了RegisterRenaming寄存器重命名技术之后,X86处理器事实上也具有了很多的寄存器可供使用,如SandyBridge内部每个线程具有160个64位整数寄存器,和144个256位浮点寄存器,因此Intel就动起了新的念头,SandyBridge带来的AVX指令集提供了新的3~4操作数的非破坏性句法,在某种程度上,这弥补了X86指令集的体系缺陷。
例如,要实现xmm10=xmm9+xmm1,传统X86处理器需要两条指令:
movappsxmm10,xmm9
addpdxmm10,xmm1
在应用AVX指令集新的3操作数格式之后,只需要一条指令就能完成这个功能:
vaddpdxmm10,xmm9,xmm1
而使用4操作数指令的话,下面三条指令可以直接简化为一条:
movapsxmm0,xmm4
movapsxmm1,xmm2
blendvpsxmm1,m128
变为:
vblendvpsxmm1,xmm2,m128,xmm4
显然,新的指令操作数明显降低了指令的数量,处理器吞吐量得到了提升,代码运行更快速,同时能耗也降低了。
除了对指令集体系的增强之外,AVX指令集还强化了访存不对齐时的性能。
传统的指令集当进行不对齐内存访问(unalignedmemory access)的时候会需要较长的时钟周期,甚至会有惩罚性延时,极大地降低速度。
而在AVX指令集中,各种运算和访存指令现在降低了访存不对齐的延迟损失,在某些情况下甚至能达到和对齐访问一致的性能,显得更加灵活。
X86指令集:
不断进化
CISC指令集的思想就是用复杂的硬件来完成尽可能多的工作,RISC则是使用尽量少的指令并通过复杂的程序来完成同样的功能。
每一代的X86指令集,都会对不同的应用增加新的指令集,这些指令集能高效地处理对应的应用,例如,上一代Westmere处理器的AES-NI就对加密运算具有非凡的加速比。
同样,在AVX指令中也增加了不少浮点运算指令,提升了多种运算的性能。
SandyBridge新加入的AVX指令集让X86从128位提升到256位向量运算,大幅度提升了性能,此外,AVX精简了X86指令集的设计,并弥补了破坏性句法的体系缺陷,可以说是一个非常重要的改进。
需要注意的是,AVX指令集带来了新的处理器状态和更宽的寄存器宽度,因此需要操作系统的支持才能正常运作,如,LinuxKernel2.6.30以及Windows7/Server2008R2SP1版本才能支持。
关于SandyBridge的微架构就介绍到这里,下回笔者将介绍SandyBridge的架构,这部分的变化也非常大
——英特尔SandyBridge处理器分析测试之四
计算机世界实验室盘骏
和微架构方面一样,SandyBridge的架构方面也具有了很大的变化。
这个变化来自两个方面的考虑:
性能和可扩展性,其中后者包括了要面对越来越多的处理器核心的问题,还有要面对来自GPU挑战的问题。
针对GPU的压力,英特尔一方面采取了更宽的256位AVX向量运算提升CPU处理能力,一方面采取了在CPU内直接融合GPU的方法。
关于GPU的部分可以写出多个长篇,因此这里主要谈及SandyBridge其它方面的架构变化。
这个变化就是SandyBridge采用了新的RingBus环形总线来连接各个CPU核心、LLC缓存(就是L3缓存)、融合进去的GPU以及SystemAgent(就是系统北桥)部分。
自从Nehalem开始使用融合核心策略后,不同产品线的处理器都基于同一种核心,只是具有不同的核外架构(称为Uncore架构),这个核外架构在不同的产品线上必须进行不同的设计,对应地芯片组也要进行变化。
在核心数量比较少的时候,这很容易办到,然而在高端服务器上,核心数量很高,这种方式就难以具有匹配的性能,并且开始变得难以实现。
实际上,高端8核心的Nehalem-EX处理器就采取了和桌面/移动端完全不同的Uncore架构:
使用了一个环形总线,而在后来加入GPU的Westmere,新加入的GPU迫使内存控制器和CPU核心分立,并和GPU一起集成到一个相对落后的45nm制程的芯片上,影响到了性能和功耗。
现在,这个环形总线技术被应用到了SandyBridge全线产品线上来。
革命性的环形总线
通常的处理器使用Crossbar交叉开关来连接多个组件,在部件较少
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SandyBridge 架构 进化
![提示](https://static.bdocx.com/images/bang_tan.gif)