![]() |
Submit News Tips | I4U Gadget Flyer | RSS Feed | |||
|
||||
| | 网站首页 | 文章中心 | | ||||
![]() |
|
|
|
| HOT TOPICS: Nintendo Wii | Sony PS3 | Xbox 360 | Gadget Models |
| I4U Latest News |
AMD下一代架构预览:从K8到K8L到K10Topic: 技术前沿 荐 ★★★★★ 作者:Rowan 文章来源:本站原创 点击数: 更新时间:2007-8-13 编者按:这篇文章成文于2006年9月4日,发表在《大众硬件》杂志上。是一篇非常不错的技术解析文章。这是距离目前最新的一篇技术前沿文章。讲述的是当年网上流传的,最为神秘的AMD新处理器K8L。不过目前AMD新处理器发布在即,这款处理器的名字也由K8L唤作了K10。真正的4核心处理器,绝对是扣肉的撒手锏。 记得当时一个非常有名的在线访谈里,邀请到了Intel亚太区首席技术总监。他们在访谈中嗷嗷的鼓吹扣肉假四核有多么多么的牛。为消费者展示未来美丽的路线图。我乔装成一个普通的网友,向他们提问:K10的32bit取回技术时,他们都大眼瞪小眼。根本母鸡这回事儿。我当时心理就凉了许多,硕大的一个Intel亚太区首席技术总监。原来只是一根牙签上,插的一个贡丸而已。什么是AMD的K10,它都有那些最为先进的架构技术,还是由我作为传教士,给大家一一分解吧。
AMD下一代架构预览:从K8到K8L 前言 目前Intel最新一代Core 2处理器已经全面投放市场,由于其性能非常出色,使得它成为了很多DIY玩家心中的梦中情人。另一方面AMD目前只能大打价格战,用不断降价的方法提高自己产品的性价比。为了能在未来彻底击败“扣肉”AMD已经承诺将在明年推出基于全新的K8L架构的新一代处理器,届时它将成为“扣肉”的致命杀手。在这篇文章中,笔者会为大家详细揭示K8L架构的技术秘文,并且将它与目前流行的Core、K8架构作比较。 2006年7月27日,Intel正是推出了新一代Core 2处理器。它是基于强大的Conroe核心架构,使处理器的运行效能大幅提升。而目前AMD并没发布能与Core 2处理器相抗衡的新产品。不幸的是,AMD对于自己的高端K8系列处理器过于自信,他们并不准备在此时对Core 2予以反击。AMD自认为K8系列的性能足以与Core 2的性能匹敌。他们将在2007年中旬发布新一代K8L架构,那才是真正的Core 2杀手。也就是说AMD的K8L至少要在Core 2发布后整整1年才能与广大的消费者见面。最初的K8L被设计成4核心的处理器。也就是说它会在一颗硅片上集成4个执行核心,并且他们会使用L3高速缓存作为数据链路来交换数据。K8L会使用一个公用内存控制器来管理内存。 目前对于多核心处理器来说,内部的微架构设计对于处理器的性能表现有着决定性的作用。在下面的文章中我们就来分析一下Conroe处理器微架构的特点,并且给大家讲述K8L架构的改进之处。
图,K8L处理器为4核心设计.jpg
在每个时钟周期内K8处理器可以取回一个长度为16个字节的代码块(byte)。处理器会从L1高速缓存中读取数据,将他们萃取成指令代码。此后将指令代码发送给解译器的通道进行处理。一般来说处理器中的指令长度为5字节,那么16字节长度的代码块可以包含3条指令。因此K8处理器每个时钟周期平均可以处理3条指令。不过需要注意的是,处理器的很多指令长度也有可能大于5个字节。
图,AMD下一代K8L处理器核心 大家可能已经对SSE2扩展指令集比较熟悉了,而它确是非常特殊的处理器指令。一般来说,一个简单的SSE2指令可以在两个寄存器之间完成数据传输。例如,MOVAPD XMM0,XMM1这样的指令都仅有4个字节。可是如果指令需要附加内存地址,那么他们的长度就会发生变化。例如很多位移操作的指令如:MOVAPD XMM0,[EAX+16]等等他们至少需要6~8个字节才能完成操作。若是在64bit模式中,在一条指令的头部还要附加1个字节的REX前缀。处理器就要使用更多的寄存器来存储这些冗长的指令。因此在64bit模式中,SSE2指令的长度经常会高达7~9个字节。而SSE1指令的长度也好不了多少,某些矢量指令的长度甚至会小于1个字节,但是经常也会看到7~9字节的标量指令。 在这种情况中每个时钟周期取回16个字节的处理效率并不高。K8处理器中的解译器每个时钟周期可以解译3条指令,但是当指令长度过长时,就无法喂饱解译器。因此这就成为了K8处理器架构中最大的绊脚石。K8在处理SSE和SSE2指令的时候,每2个时钟周期才能完成3条指令。实际运算中平均每个时钟周期仅仅能处理1.5条指令。而以K8的处理实力,每个时钟周期可以处理1个64bit的浮点运算。在未来的K8L处理器中,必须让处理器每个时钟周期至少能够处理3条指令。因此AMD宣布,下一代K8L每次将能取回32字节的代码块,处理器每个时钟周期能处理的指令数将大幅提高。
图,K8L处理器每次能取回32字节的代码块。 顺便比较一下,Conroe处理器每次只能取回16字节的代码块,这仅仅是目前K8处理器的水平。如果指令的平均长度不会超过4字节,那么Conroe平均每个时钟周期可以处理4条指令。若指令的平均长度超过了4字节那么它平均每个时钟周期最多能处理3条指令。不过Conroe有一项比较特殊的设计,在处理器内部有一个非常特别的64字节的缓冲区。它会帮助处理器缓存4个16字节的代码块。它每个时钟周期可以取回32字节的数据。 处理器取回代码块的长度还与流水线的分支预测有着密切的关系。若处理器取回的代码块越长,那么流水线越能对程序分支作出正确的预测。由于K8处理器取回数据有限,其分支预测只能使用比较简单的算法。例如K8并不支持交互间接分支预测,(在很多面向对象性语言中,它可以做出否定结果的预测)并且K8的分支预测也不是百分百的准确。在未来的K8L处理器中,分支预测机制将会有更大的改善。分支预测表将会更长,同时也将会存储更多的分支历史记录,使用更为复杂的交互分支预测算法。 译码 处理器从取回的代码块中萃取指令,将其转化为处理器内部的宏指令,这个过程就叫做译码。通常一条宏指令由两个宏指令操作组成。这包括一条整数或浮点的宏指令运算,和一个对内存地址的操作运算。在K8处理器的译码器中有三种指令类型: 单直接路径指令,处理器会使用硬件译码器将它解译为一条宏指令。 K8处理器不能同时调度直接路径指令和矢量路径指令。译码器平均每个时钟周期可以输出3条宏指令。因此处理器中的硬件译码器每个时钟周期可以输出3条简单指令,可以输出1.5个双指令。而1个矢量路径指令很可能被拆分为3条以上的宏指令,因此译码器经常无法在1个时钟周期内解译一条矢量路径指令。在K8中为了处理矢量指令只能采取群组的方法。使用两个寄存器来存储一条矢量指令。 在K8处理器中,SSE、SSE2、SSE3这几种扩展指令都是分门别类存放的。每一个64bit执行单元中,都会配置一对64bit长的SSE寄存器。因此K8每两个时钟周期才能处理3条指令。而在未来的K8L处理器中,执行单元的长度将会增加到128bit位宽。这样就不必将矢量指令拆分为两个部分进行群组处理。K8L内部译码器的算法也会有重大改善,每个时钟周期可以解译出3条128bit的宏指令。 尽管如此,K8L的译码器可能达不到Conroe的每个时钟周期4~5条指令。但不要忘记Conroe也仅仅能在短指令情况下才能充分发挥出优势。凭借着K8L的32字节取回特性,相信在实际的运算中指令的译码效率也会有大幅提升。 整数指令 当解译器对三条指令进行译码之后,就会将这些内部宏指令发送到ICU指令控制单元。此时ICU会通过ROB重订缓冲区来不断跟踪这些指令的状态。重订缓冲区的指责就是始终保持跟踪宏指令的运行,并且控制他们的退役。根据解译器的处理能力,这些宏指令进入程序列队和退役都会以组的方式进行,每组一个组会包含3条指令。他们会以同样的群组方式抵达ICU指令控制单元和指令的执行单元。 此后每一个宏指令群组都会被分布到三个独立的程序调度列队中。在程序调度列队中会有三条与之对称的整数赋值通道。在K8中,一共可以并行8条程序队列,每个程序队列可以包含3个宏指令。那么K8就可以同时处理24条宏指令。 在处理器的设计中,这些队列的数量要与解译器的输出能力相匹配。程序调度队列需要为每一个队列指令分配一个ALU逻辑运算单元和一个AGU地址运算单元。它几乎能同时访问两个内存地址。因此K8每3个时钟周期可以完成一次整数运算和2个64bit长度的内存地址读写操作的分配。一旦这些数据都准备好了,程序调度就可以进行整数运算了,但是内存装载操作却需要在程序运行中执行。例如 add ebx, ecx ; 这种整数处理机制极大的影响了K8处理器效能的发挥。这是因为在K8处理器中尽管每个时钟周期可以分配两个进程来读取指令,但是它的内存效率要比Conroe低下很多。Conroe处理器虽然每个时钟周期仅仅可以调用一个读取指令,但是它还有一种推测机制,它可以根据早先对内存的读写来预测出执行的结果。不过幸好K8也有一种乱序装载机制,它可以大幅提高内存的装载效率。AMD并没有透露这种内存乱续装载机制的具体算法,但是它会将读取内存的指令序列重新编排,加快流水线的操作,并且不会对写入指令产生影响。要想充分利用乱序装载还需要专门优化过的程序予以配合才能有最佳效果。 包含三个宏指令的指令群组离开ROB重订缓冲区之后,所有的指令都会被执行。指令群组的列队和迁移都使用的是简单控制结束,这可以使调度程序更加快捷有效。如果这三位一体的传送队列中,其中一条路径被完全装填满,那么他们就不能正常工作,调度程序必须将他们中间的数据全部清空才能继续进行。当然在实际运行程序时,发生这种情况的几率非常小,但是它一旦发生也会影响到处理器的效率。 在三位一体的架构中,还有一种情况会影响处理器的性能,那就是执行单元的因素。因为列队中的所有指令不会同时准备就绪,很有可能出现两条指令准备就绪等待执行,而第三条指令却没有空闲的执行单元可以使用的情况。这样整个列队就会停下来。
与K8不同,Conroe采用的是全新的公共队列架构。它不仅具有整数处理能力还可以包含一次浮点运算。Conroe的队列中可以容纳下32条宏指令。公共队列最大的好处就是可以尽量避免宏指令操作的等待和延迟。可以及时的为准备就绪的宏指令分配执行单元。此外Conroe还具有堆栈引擎机制,它可以有效提高堆栈相关指令的执行效率。例如:PUSH压堆、POP取出、CALL调用、RET退役等操作。但是在实际处理程序时很难将若干个微指令同时联合在一个列队中。公共列队中某些列队必须被单独分开处理。这也许对处理效率造成适得其反的效果。若某些环节出现问题,乱续执行机制会影响执行单元的速度。调度程序也有可能没有足够多的执行单元分配给准备好的指令列队。Conroe处理器中最大的弊端就是在它执行程序时,可能会有大量的寄存器同时在ROB重订缓冲区做好准备,这会使调度程序措手不及。
图,Core 2 Duo处理器logo.jpg 在新一代K8L中也引入了和Conroe相似的乱序执行单元。这两颗处理器每个时钟周期都可以执行5条命令。(3条逻辑算术运算+2条内存地址操作)因为他们编译器不同,所以产生的代码也不同。并且K8L的调度和执行算法与Conroe也稍有不同。 浮点指令 在K8处理器中,浮点与整数运算指令的调度程序是完全分离的,并且他们的处理方式完全不同。在K8处理器中,浮点运算的程序调度共有12个队列群组,每个组可以处理3个宏指令,一共可以并行处理36条浮点运算指令。在浮点运算队列中也使用三位一体结构,但是这与整数运算队列中的三位一体有很大区别。整数运算队列的三位一体结构有很强的对称性,而一个FPU浮点运算单元中包含了三个不同的部分:FADD,FMUL,FMISC。他们分别提供浮点加法运算、乘法运算和辅助操作。因此浮点程序调度的缓冲是连接着整个队列,而不是队列中具体的执行单元。
K8每一个调度列队可以分配一个80bit的FPU浮点运算单元,每个时钟周期进行一次浮点运算。解译器可以将一个128bit的SSE指令拆分为2个64bit的宏指令。每一个宏指令的调度需要2个时钟周期。理论上来说,每个时钟周期可以调度3个宏指令,但是在实际运行程序时由于受到解译器的瓶颈却无法达到。此外在程序代码中对于浮点指令的处理还包含一些额外的命令,如装载、循环等等。另外K8的程序调度算法也比较简单,经常使空闲的装置不能有效的利用起来,这也会降低程序运行的效率。 在K8中有一条双64bit的读取总线,每个时钟周期可以从L1高速缓存中读取双64bit的数据。它有助于处理器在进行海量的浮点运算时和对内存进行频繁读取时保持较高的执行效率。在K8架构中有一项重大特色,就是一次可以进行4次运算操作。当并行执行2条指令的时候,每条指令都需要进行2次内存地址操作。由此K8这种处理机制可以保证每次并行处理2条指令。 而在K8L中,浮点加法和乘法运算部分都被扩展为128bit。由此可以极大的加强双精度浮点运算的性能,像是SSE这样具有128bit长度的指令都可以轻松应付。当然并不仅仅是128bit长度的指令会获益,它还可以增加解译器的工作效率和减少产生宏指令的个数。
如图,K8L具有128bit浮点运算能力 从上图可以看到总线从高速缓存中读取数据的次数也变成2次了。这样处理器每个时钟周期将可以从L1高速缓存中执行2次128bit位宽的数据装填操作。而目前Conroe核心的处理器每个时钟周期仅仅能装填一次128bit的数据。除此以外,K8L的执行单元也会更为宽大,它将会有更大的整数执行单元,浮点加法和乘法单元将可以处理SSE2命令。K8L的整数应用将会更快捷。 从图中看,用于浮点辅助的FMISC单元仍然会保持64bit的位宽。这一点似乎与处理128bit的SSE指令的要求很不匹配。如果处理器每个时钟周期能够写入128bit的数据,那么显然FMISC会成为系统的瓶颈。真心的希望这是一张有错误的演示图。FMISC应该与左边的两个浮点运算单元的位宽保持一致,或者是使用2个64bit的单元来与其他浮点单元位宽相匹配。 这里在比较一下Conroe处理器,它与K8不同,它的整数、浮点指令运算都是使用的是公共列队。这样的架构既有优势也有缺点。所有的整数和浮点指令运算都可以结合在一起,而劣处就是很难禁止某个特定的整数或浮点运算指令。Conroe另一个弊端就是它可以使用x87指令进行浮点运算,但是这些算法并没有通过SSE进行优化,例如它需要使用两次低效率的调度才能完成一个浮点乘法运算。 内存子系统 在K8中,L1高速缓存被划分为两个区域,一个64KB区域是用来存储指令的,另一个64KB区域是用来存储数据的。每一个区域的高速缓存都是双通道设计,他们的带宽是64字节。由于采用这样的设计,K8的处理核心每个时钟周期可以读取2次高速缓存中的内容。这也补偿了L1高速缓存容量较小的弊端。K8的L1高速缓存也可以看作是4 × 32KB的形式,这样的架构可以实现在1个时钟周期内多次访问大容量缓存。 在K8中的L2高速缓存是与L1一一对应。而L1和L2中缓存的内容不仅仅是简单的克隆,L1和L2会通过两路单向的数据链路交换内容,每一条链路的带宽是64bit。(如图6,一条链路负责从L1向L2发送信息,另一条负责从L2向L1发送信息)在这种处理机制中,处理器每个时钟周期只能从L2高速缓存中收到8个字节的信息。这回导致数据在传输时出现很高的潜伏期,特别是当有两个以上的链路同时访问L2的时候就更加明显了。这些过高的潜伏期会消磨掉L2高速缓存的容量优势。
图,K8高速缓存每一条链路的带宽是64bit 众所周知K8的内存控制器集成在处理器核心内部。内存控制器中的数据流会通过链路直接引入L1高速缓存和旁路的L2高速缓存。这样可以大幅减少系统内存的潜伏期。 在未来的K8L处理器中,L1高速缓存可以实现每个时钟周期2个128bit的数据读取,或实现一读一写的数据操作。但是由于处理器尚处在设计阶段,L1和L2的容量还没有被确定。不过有小道消息称,L1和L2的容量至少是K8的两倍。否则L1和L2中缓存的数据将很快会被清空,处理器会经常处于闲置状态。因此当缓存读取速度明显增长时,缓存的容量也要成倍增长。 由于K8L将被设计成多核心的处理器,因此在4核心以下的K8L都将共享L3高速缓存中的数据。届时L3也将会被集成到处理器内部,它的容量将在2MB以上,并且L3的速度将会同L2和处理器的主频保持一致。L3的引入将会很好的解决多核心处理器的数据交换问题。L3通过引出的各条数据链路连接临近的处理核心。目前Intel的Conroe处理器是通过共享L2高速缓存的方式来连接两颗处理核心。因此采用4核心的K8L处理器将会使用更大更快的高速缓存来共享数据。不过有报道宣称,Intel在未来的4核心处理器中,将不会采用共享高速缓存这种机制。Intel是否还留有新的杀手锏我们就不得而知了,不过为了提高多核心处理器的工作效率,在他们之间必有某种方法来共享处理的数据。 在Conroe核心的处理器内部采用的是全新的高速缓存架构。每一个处理核心有32KB的L1高速缓存,并有8条数据链路连接着2~4MB的L2高速缓存。L2共有16条链路,总线带宽高达256bit。Conroe处理器具有非常高效的预取单元,他们不仅仅可以调用系统内存的数据也可以将L2中的数据调入L1。在SPEC INT的测试中这种缓存架构的优势非常明显,Conroe核心比上一代Yonah核心性能提高了40%。
在未来的K8L处理器中,还会支持更快速的DDR3内存和FB-DIMM技术,支持更高速的Hyper-Transport 3总线。这些新技术都会大幅提升内存子系统的运行效率。 总结 AMD未来的新一代处理器是K8L,它是经典的K8处理器的进化型。它将指令取回的长度增加到了32字节,每个时钟周期可以运行更多条指令,它改善了分支预测的算法,引入了乱续指令读取机制,改善了整数运算的一些瓶颈,并且还改善了浮点和整数SSE指令的处理机制。虽然在K8L没有发布之前我们难以对它的性能做出定论,但是它所展现出的实力显然足以成为Conroe的杀手。
图,今后的处理器是多核心的天下.jpg
|
|
| 起居室变摄影棚 DIY摄影背景幕布 mod地带:恶龙传说MOD主题机箱改造 |
|
|
|