AMDK8架构介绍
- 格式:pdf
- 大小:246.40 KB
- 文档页数:6
八戒 前言: 在2006年7月27日,Intel正式发布了它新一代Core 2处理器。
基于Conroe核心的Core 2处理器的性能较上一代处理器有着实质性能的突破。
而现在AMD还没有推出新的顶级处理器来与英特尔的Core 2处理器抗争。
不幸的是,AMD公司对于已取得极大成功的K8系列高度自信,以至于目前仍没有及时推出新的应对方案。
根据AMD最近公布的路线图来看,AMD在明年中旬将推出代号为K8L的处理器,而届时Intel的Core 2处理器已经推出一年多时间。
K8L原计划将采用四核心设计,在单一晶元上整合4个独立的执行处理核心,并同时采用共享L3缓存设计,四核心共享一个控制闩门及一个内存控制器。
因此,今天我们将为大家探讨一下K8L微处理器架构的改进之处,看看AMD明年将能为我们带来什么。
一、指令读取 K8处理器在每个时钟周期都将从L1指令缓存中读取已经排列成序的16字节块,同时在这里指令会被从块中分离出来,然后将指令送到解码单元的通道中。
每个时钟周期的16个字节读取比率可以在每个时钟周期内对三条5个字节长度的指令进行编译处理。
然而在某些运算法则中,在一些数据链指令的平均长度可能要大于5个字节。
比如,一些针寄存器与寄存器操作数有关的简单SSE2指令(例如,MOVAPD XMM0,XMM1)仅仅只有4个字节。
如果一条指令使用间接寄存方式(比如变址寄存器和偏移量一般采用MOVAPD XMM0 [EAX+16]方式),那么它的指令长度将会增加到6-8字节。
当采用附加寄存器时,在64bi t模式下每个指令代码都会增加一个字节的R EX前缀。
这样,SSE2指令在64bi t模式下的长度可能达到7-9字节。
至于SSE1指令在标量情况下也会达到7~9个字节,矢量情况下才减少一个字节。
在这种情况下,每周期读取16个字节速度已无法在一个周期内完成3条指令的编译处理,因为此时矢量SSE和SSE2指令以每2个钟周期3条指令(或每时钟周期1.5条指令)的速率来编译。
这样的限制在K8处理器中还不是太明显,因此它在64bi t模式下配备足够的F P Us指令单元。
在未来处理器,处理器必须保证拥有每个时钟周期至少能够处理3条指令的速率。
所以AMD在K8L架构中每个时钟周期读取数据块大小的能力增加到32个字节,这样的处理能力就目前来说并不是很过分—如果较长指令使用了一些按近的16字节数据块,那么处理器能获得的指令数量仍然可能达不到每周期处理三个指令的要求。
当32字节数据块中出现5个长指令的情况时,这5个指令可以在一个时钟周期获取。
如果指令的长度出现16字节块的情况下,处理器不可以完成一个时钟周期获取三条指令的任务。
需要说明的是,Conroe处理器的指令缓存仍是采用16字节设计,它的处理原理类似于K8处理器,因此Conroe处理器可以在指令长度不大于4字节的情况下每个周期完成4个指令解码,而当指令长度超过4字节就会使得解码指令数下降到3个。
为了解决这个问题,英特尔采用了短循环方式,他们在Conroe处理器中加入了一个特别的64字节内部缓存,缓存可以容纳最大64字节(共4个数据块)的循环,使得在这样循环中获取的数据可以达到一个周期32个字节。
如果循环超过了4个数据块,那么就不能使用这个缓存了。
如果存在分支指令,那么对于下一个指令数据块的获取就需要使用到分支预测机制。
K8处理器的分支预测是通过一些相对于Conroe显得简单的算法实现的。
举个例子来说,K8不能预测到交叉、间接分支情况(这通常可能对执行多形体代码造成负面影响),对于常规情况下的预测也无法保证准确。
因此,AMD 对K8L中的分支预测机制进行了改进。
不过AMD目前仍没有透露具体技术细节,我们认为AMD很可能在K8L中采用增加分支预测表单和计数器的方法,当然分支预测算法也应该有所改进。
二、指令编译 首先需要说明的是,从数据块中得到的X86指令需要被解码成mac ro-o p(宏操作)指令得到执行。
每一个mac ro-o ps指令由2个微操作组成:一个整数或漂浮点运行的操作和一个内存地址存取的操作。
K8处理器的解码单元可以在区分三种类型的指令:·D i re c tP a t h单指令被硬件解码器的编译成一个mac ro-o p·D i re c tP a t h双指令被硬件解码器编译成两个mac ro-o ps·Ve c torP a t h指令则被芯片整合的微代码引擎R OM解码成3条或更多的mac ro-o ps 附注:D i re c tP a t h 和 Ve c torP a t h术语究竟是什么意思。
K8的解码器能够通过D i re c tP a t h或者Ve c torP a t h来处理x86指令。
前者,D i re c tP a t h仅处理转换为单个m OP s的x86 指令。
其它的指令则由Ve c torP a t h处理,并把它们转换为连续的两个或者更多的m OP s。
在这些指令中(包括最复杂的整数分割/ i nte g er divisi on)都使用了M ic ro c o d e En gi ne。
通过内建的表单,它能够把x86指令放到m OP s序里面。
在K8处理器中,D i re c tP a t h和Ve c torP a t h指令是不能同时发送的。
解码器每个时钟周期以3条mac ro-o ps的速度发出编译结果。
这样,处理器的硬件解码器每个时钟周期能编译3条单指令,1条双指令+1条单个指令或1.5条双指令(即每两个时钟周期3条双指令)。
由于Ve c torP a t h指令可以被编译成三个以上的宏操作,所以就需要超过一个时钟周期才能对这样的指令完成解码工作。
解码器每个时钟周期编译出的mac ro-o ps被统一编成一个组合。
每个组合包括2条或1条mac ro-o ps,可能由D i re c tP a t h和Ve c torP a t h指令交替操作。
如果一个组合出现指令不足的情况,组合中会加入一个空的宏操作指令进行补足才一起发送。
来自SSE,SSE2和SSE3指令集的Ve c torP a t h指令在K8处理器中被分成一对对的mac ro-o ps来进行独立处理,比如在64bi t执行单元中128bi t的SSE寄存器被分成两个64bi t的组合。
这也就是为什么K8处理器中处理这样的指令速度是2个时钟周期完成3个指令的原因。
未来K8L中的SSE位宽会增加到128bi t,这样就不再需要将指令分成两个部分,从而使得单个128bi t mac ro-o ps操作可以达到每个周期三个指令,速度有了明显提高。
这将明显提高Ve c torP a t h指令的编译能力—Ve c torP a t h指令能每周期以3条指令的速度编译单条的128bi t mac ro-o ps操作。
尽管K8L处理器的解码器每个时钟周期不能编译4-5条指令,略逊色于英特尔的Conroe。
但这并不妨碍程序执行,因为平均每个周期所需执行的指令一般不到3条。
K8处理器一般会把一个X86指令分成比Conroe处理器更少的mac ro-o ps操作—以32bi t方式编译,这样使得K8处理器的解码单元可以达到更佳的效率。
三、整数指令 编译好的三条mac ro-o ps指令最先被发送到的指令控制单位(IC U),它把他们的信息放进重排缓存中(R O B),然后转移到调度程序。
R O B会自动保存mac ro-o ps的信息并且控制他们的退出顺序。
mac ro-o ps 进入序列后将以三个一组的方式退出,不过每个mac ro-o ps操作都将由调度单元分派到不同执行单元进行处理。
每个组的mac ro-o ps在调度程序中被分成3个独立序列,每个序列有个8单元(在里面一共有24条 mac ro-o ps),然后被发送到3条对称的整数通道中,每个都有自己独特的队列和一对函数单元。
数据准备好后,调度单元会每个序列中的一个整数操作分派到AL U中,把寻址操作分配给A GU。
这样最多会有两个并行的内存访问。
因此,每个周期可以有三个整数操作和2个内存操作得到派送(在这里组合中以64bi t进行读或写)。
整数操作会在序列中根据数据准备情况进行乱序分派,不过从内存中载入的操作会是按照编程顺序的。
当所有线mac ro-o ps 的元素都被执行了,那么队列就会被释放。
在执行结果被写到记录文件之后 ,相同的资源也会被释放。
比如:·add e bx,e cx;·m o v e ax,[e bx+10h];快速寻址计算·m o v e cx,[e ax+e bx];地址依赖于前一个指令操作·m o v e dx,[e bx+24h];这个指令在前面所有指令的地址计算完成之前是不会被执行的 这正是K8处理器的局限性之一。
尽管K8每个时钟周期能分派2条读取指令,但效率仍要比Conroe 的存储器低一些—因为Conroe引入了乱序执行机制。
在通常情况下,当乱序微处理器重新对指令进行排序时,它不能在存储前对载入数据进行重新编排,因为它不了解是否会破坏某些数据的位置关联性。
但是在许多情况下,载入数据与之前的存储无关,完全可以提前载入,进而提高效率。
问题在于如何确定哪些可以装载,哪些不可以装载。
(注:此功能又被称为内存消歧技术。
)值得庆幸的是,K8L未来也将引入类似的设计来消除这个瓶颈。
不过,目前AMD仍没有透露相关细节,但可以肯定的读取指令的重排序将不会影响到写入指令,并且这将是某些类型代码出现执行效率下降的原因。
不管怎么说,每个来自R O B的mac ro-o ps组合在执行后将被释放,每个组合中mac ro-o ps操作的排序和释放可以使得调度程序控制整个资源,提高工作效率。
如果三个序列中有一个出现满载情况,那么新的mac ro-o ps操作组合就不能进入调度程序中。
但是,实际操作中这样的情况并不太多,同时也不会对CP U效率有太大的影响。
除此之外,理论上小组中mac ro-o ps操作到调度单元序列的静态链接有可能降低调度单元的工作效率,因为一个序列可能含有2个或更多的mac ro-o ps操作等待执行,另一个序列可能一个等待的也没有。
这种情况在实际执行中并不太多,通常在管线中都会有足够多的等待执行指令。
不同于K8,Conroe处理器中针对包括浮点指令在内的所有指令有一个通用序列。
整个序列的长度是32个mac ro-o ps,通用序列理论上可以减少空置的情况及象执行单元之间接合所出现的局限性。
同时,堆栈引擎机制也将帮助处理器减少P U S H、POP、CALL、R E T指令之间对于数据的依赖性。