在几年前Intel在P6核心获得重大胜利之后,开始对它的处理器开发部门进行划分,其中一个队伍着重在NetBurst架构,而另一个则是在低功耗、高集成度核心方面,代表产品就是大家熟悉的用于笔记本平台的Pentium M处理器。
当Intel的NetBurst架构处理器在性能和功耗方面受到全面挑战后,Intel不得不考虑把高性能的Pentium M处理器架构移向桌面平台,Israel Development Center (IDC,以色列研发中心)把Dothan的架构重新调整,让它转换为原生的双核,不过Dothan到Yonah的架构调整远比从Banias到 Dothan要大,除了双核外,Yonah在微架构方面有很大的调整,并且针对桌面平台,也推出类似架构的Core 2。
498)this.style.width=498;" border=1 twffan="done">
Barcelona架构特性全览
而AMD则经历了从K7到K8的变化,未来预计是K9和K10。就目前来说,AMD将在年中发布的Barcelona处理器是一个很好的反击机会,第三季度会推出桌面的版本,Intel则会在年底推出转换到45nm工艺的Penryn,相信今年将是处理器非常热闹的一年。接下来,就让我们来详细了解一下 Barcelona的微架构情况。
Barcelona是AMD的第一款四核处理器,它不像Intel的四核Kentsfield由两个双核Die拼接而成,这也是为什么AMD把它称为“原生”的原因。同时在工艺方面,它也采用65nm工艺,较K8在制造设计上要复杂很多,Barcelona需要总共 11层金属层,而K8则为9层、Core 2也只有8层,更多的金属层会增加制造方面复杂程度,但是对最终消费者没有太明显的负面效应。
498)this.style.width=498;" border=1 twffan="done">
在具备四个核心和2MB L3 cache后,Barcelona总共拥有463M个晶体管,较Kentsfield的582M要少119M。更少的晶体管给cache容量带来了局限性,每个Barcelona核心具备128KB L1 cache和512KB L2 cache,再对四核共享的2MB L3 cache进行一下分割,算起来核心总共有4.5MB cache,而Kentsfield的每个核心则拥有64KB L1 cache和一个共享的4MB L2 cache,整个Kentsfield拥有8.25MB cache,较Barcelona拥有超过80%的容量,这也是在晶体管方面多25.6%的原因。
但是Barcelona又不是简单的一个带L3 cache的四核K8,我们可以计算一下它们的晶体管数目,除去cache的晶体管,一个双核Athlon 64 X2晶体管数目大概在94M,而Barcelona则在247M,双倍一下也达不到Barcelona的水平,而且简单的双倍计算也不是非常准确的,因为 Barcelona只有一个Northbridge设计,所以多出的60M的晶体管是由于架构改进加强后的结果。
每一代CPU性能的提升,最大的根源都是架构方面有非常大的调整。从表中对比K8架构,Barcelona可以说是加强了很多,规格几乎都是成倍的增长。首先是SSE指令执行位宽,现在被AMD称为SSE128。在K8架构处理器中,两个SSE指令是并行处理的,SSE执行单元只有64-bits宽度,一个128-bit SSE指令操作,它不得不分割成两个64-bit指令操作,同样的一个128-bit SSE指令被获取后,它被首先解码成两个微操作(micro-ops),这会给这个指令带来多余的解码部分,效率上可想而知。
498)this.style.width=498;" border=1 twffan="done">
Barcelona的SSE执行单元则扩充为128-bits(实际上,Intel之前对于core2也是这么做的),一个128-bit SSE指令操作可以不必分割成两个64-bit操作,这意味着更多的可利用带宽可以被使用,那个FP scheduler也可以执行这些128-bit SSE指令操作。
498)this.style.width=498;" border=1 twffan="done">
SSE指令执行性能提升后也带来了另外一个瓶颈:指令获取带宽(instruction fetch bandwidth),这些128-bit SSE指令变得更大,同时为了最大化并行处理的解码数量,每周期32-bytes的带宽可以很好的解决这个问题,32-bytes的指令获取除了可以带来 SSE代码带来好处外,同时也给整数代码带来了好处。
在这之后CPU可以获取和解码更多的指令,你需要能更多的把数据传到核心中去处理,因此AMD也进一步提高了L1 data cache和Barcelonas SSE寄存器(registers)之间的带宽,现在Barcelona可以实现2 x 128-bit loads/cycle的性能,同时L2 cache和内存控制器的接口也被提升到128-bits/cycle后,总体上平衡了上面的改进所带来的性能瓶颈。
SSE128的加强设计,和Intel对Yonah到Merom转变过程非常相像,在Conroe/Merom之前,Yonah在FP/SSE性能方面和 K8没法相比,在此前的同频率下K8和Yonah的性能测试中,各项性能都可以打成平手,只有在视频编码方面不是这样,直到Core 2到来之后,才全面超过了AMD,相信SSE128的设计将给未来的Barcelona带来不错的表现。
核心调整
除了以上的改进以外,Barcelona在核心调整方面还有非常多的加强设计。首先从分支预测开始,总体来说,CPU的分支预测器的准确程度取决于设计的宽度和深度,在分支预测器不能有效预测的那些指令数量,决定了多少指令可以快速控制执行单元的运行。K8处理器的分支预测单元就是非常优秀的,而且为它的整体架构做了良好优化。
Barcelona追加了512-entry indirect predictor(512输入非直接分支预测器),用来预测非直接分支。一个非直接性分支跳转,它的目的是跳转到存储器中的地址指向,换句话说,一个分支有几个目标。一个非直接分支发送CPU到存储器的地址,它包含了指令需要被分支到的地址。
Intel追加了非直接预测器到他的Pentium M,设计灵感来源于更好的控制非预测分支数量将会带来更高效的性能(其中包括功耗方面的表现),这个设计同样也在此前的Prescott被采用,用来削弱NetBurst架构长管线设计所带来的性能上的损失。
在Prescott中,这个简单追加设计带来了在SPEC CPU2000测试软件中12%的分支预测错误,但是AMD和Intel在算法结构上的区别则不被公开,在SPEC CPU2000的253.perlbmk测试项目中,非预测分支减少是非常明显的,达到了将近55%。
非直接预测器并不是Barcelona唯一的性能提升亮点,回归堆栈(return stack)大小较K8有双倍大小的改进,举个例子,在一个很长的命令条中,命令代码包括了很多子程序(比如递归函数),CPU实际上会用完所有空间来纪录它的路径,一旦开始丢失回归地址的路径,就会导致无法进行下一步的分支预测,双倍大小的设计正好是为了解决这个问题,据说这个改进是在收到一个大型软件公司的请求才确定的。
更多的优化调整
当然还有一些调整,其中Translation Lookaside Buffers简称为TLBs,是用于虚拟地址向物理内存地址映射的作缓存的,TLBs的使用率是非常高的,但是因为程序变的越来越多,对内存的要求也就需要处理器设计者对TLB容量大小进行调整,相对于K7,K8就有增大,在Barcelona上,AMD也在重复这样的过程,比K8要大一些,但是它们现在支持1G pages,这对数据库应用和虚拟加载非常的有用,AMD同样在Barcelona上引进了128 entry 2M L2 TLB,用于满足更新的程序对大容量的需求。
Intel在Pentium M上引进的另外一个加强设计是更低的integer divide latency,尽管现在它的细节还不是很多,但是AMD说明他们已经在Barcelona中减小这个延迟,我们还不清楚它的设计是不是和Intel的方法类似,但是预计在真实应用中,不会给性能带来太多的提升。
还有一些不需要明显提升晶体管数目而提升性能的办法,就是把一些指令放到特殊的快速编码通道里面,这样可以很大程度上缩短指令解码的长度,作为 sideband stack optimization(边带堆栈优化器,后面将具体涉及)优化加强一部分的CALL和RET-Imm指令现在也做了这样的处理,同样从SSE registers到 integer registers的MOVs也是这样。
提到指令,AMD也在Barcelona引进了新的扩展:LZCNT和POPCNT,这两个指令被用于加密应用中,AMD也是也引进了四个新的SSE扩展:EXTRQ/INSERTQ, MOVNTSD/MOVNTSS,我们将在未来Inel的Penryn处理器中看到。
边带堆栈优化器
最初在Pentium M中,引进了一个叫“dedicated stack manager”(专注堆栈管理器)的特性,根据字面上解释,它是用于控制x86堆栈操作的,比如push, pop, call, return,它的意图就是为了把堆栈操作从所有运行代码中分离出来,以让处理器能够更加有效的处理其它任务。
在Barcelona中,AMD也引进了类似的叫Sideband Stack Optimizer(边带堆栈优化器)的技术,以让堆栈指令不再需要通过3-way解码,并通过整数执行单元的堆栈操作了,这个小小的优化设计可以带来整体性能的提升。
更快的加载
在以前的《新处理器之王!Core 2 Duo全面大评测》文章中,我们对Core 2的智能内存访问技术进行了解析,在对比系统内存存取表现,AMD K8却因内建内存控制器而比Intel Core微架构优胜,但由于Core微架构采用短Pipeline Stage架构及频率相对Netburst微架构低,加上高容量的L2 Cache并内建Shared Router Bus减少FSB使用,因此系统内存控取的表现差距已不像与上代Netburst微架构产品那么严重。而为了进一步拉近与K8架构上的内存性能距离, Intel还在Core微架构中加入全新的内存读取技术,称为Memory Disambiguation。
498)this.style.width=498;" align=middle border=1 twffan="done">
Memory Disambiguation是一个十分聪明的设计,通过Out of Order过程把内存读取次序作出分析。在传统的微架构里,内存读取是按流程顺序而被执行,如图上例子,Load 4是独立的Data X读取执行,也必需要等待其他Store 1、Load 2及Store 3工作完毕,即使Load 4的Data X和前面的资料存取动作并无关系,因为处理器并不会得到前面的动作是否会改变Data X的数值,所以不能重新排序并分析Load 4能否提前执行。
498)this.style.width=498;" align=middle border=1 twffan="done">
在Intel Core微架构中通过智能的分析机制,能预知Load 4的Data X是完全独立,并可让它提前执行。正因如此Memory Disambigutaion能减少处理器的等候时间减少闲置,同时减低内存读取的延迟值,而且它可以侦出冲突并重新读取正确的资料及重新执行指令,保证运作结果不会出现严重,但在正常情况下Memory Disambirutation出错的机会率很低。
可以看出Intel Core微架构,一个主要特性是加载指令可以绕过以前加载和存储的指令,平均来说在程序中所有指令的1/3是在加载的时候就完成了,所以如果能够提升加载性能,你就可以全面提升程序的运行性能,在Core微架构中,加载可以被重新排序,以确保需要这些数据的指令在存储访问非常繁忙的时候被执行。
AMD K8架构没有上面同等的乱序执行的协调能力。在没有集成内存控制器的情况下,Intel能够很轻松的执行更多的内存操作,Barcelona采用了类似的方法修正了这个问题,它也能够重新排序这些加载。但是Barcelona需要等待在决定是否这个加载可以被优先于存储执行之前,才把存储地址计算出来,通过这种方式,Barcelona不会有机会预测错误。AMD的设计者考虑到采用类似Intel的预测器的做法,但是好像对它的架构并没有太大益处,AMD 能每个周期产生三个存储地址,因为它有3个AGUs (Address Generation Units),而相比Intel只有1个,所以Barcelona在这方面有优势。
从上面看,Barcelona的乱序执行能力加强后,应该会在这方面性能强于Core 2。