● 1、全新设计的AMD 64核心
上图为,Athlon 64内部架构,我们可以看到和K7相比,K8执行单元的的物理数目是一致的,同样的3个负责整数运算的ALU、AGU单元,同样的3个负责浮点、3DNow!等多媒体指令运算的浮点单元。如果不考虑新的64位指令执行状况,基本上两者处理数据的流程将非常相似。我们注意到K8核心同时用于桌面系统和企业级应用,出于这点考虑,在核心中加入更多的执行单元对K8并没有明显的意义。接下来,我们看到从K7开始就有的微小改进:尽管K8和K7采用了一样数目的浮点调度程序窗口(scheduling window),但是整数单元从K7的18个扩充到了24个。
第二个改进就是缓冲部分,一级缓存、二级缓存部分,K8同K7核心相比,除了将二级缓存容量统一提升到1MB,二级缓存位宽相比K7核心的64bit倍增为128+12bit之外,并没有在结构上做出太大的变动。然而CPU中另一类重要缓存——主管内存地址翻译的TLB的相关参数,却在K8中相对K7处理器做出了较大的变动。
TLB的英文全名为:Translation Lookaside Buffer,我们可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲,因为它里面其实存放的是一些页表文件(虚拟地址到物理地址的转换表)。
对于寻址空间更大的K8,增加TLB条目数,改变TLB联合方式显然具有更重要的意义。同时,在TLB控制机构方面,为了提高在程序间切换时的处理器性能,Athlon 64也相应K7核心做出了一些变化。此外,更大的TLB对于多线程处理和多处理器发展有相当大的积极意义,和Intel的超线程技术一样,更大的TLB有助于在多核心多线程应用的发展上迈出有意义的一步。
Hammer在TLB的连接方式上也有一些变化。TLB也分为2级,主要用于更快的完成虚拟地址向物理地址的映射。这是由于Hammer处理器没有储存或访问物理地址的能力,它必须通过虚拟地址来完成对主存空间的访问。将虚拟地址转化为物理地址需要3个时钟周期。TLB将以前的映射的结果保存下来,这样当需要用到原先访问过的数据时就可以直接在TLB中搜索相关的物理地址,而不需要进行映射运算,这样只花费1个时钟周期。
如上图,接下来还有一个重要的改进,它在执行单元数目不变的情况下大大增强了效率,那就是改进的分支预测单元。分支预测技术让流水线式工作的处理器成为可能,在K8中,AMD将K7中的分支预测单元做了改进。global history counter buffer(用于记录CPU在某段时间内对数据的访问,我们可以称之为全历史计数缓冲器)比起Athlon来足足大了4倍。全历史计数器是一列2比特的计数器(2比特计数器从0计数到3),它决定是否应该执行特殊的分支。当一个分支指令到达后,分支预测单元读取指令中一部分地址(有时对地址进行一些逻辑操作),并用来把它作为全历史计数器的索引,这直接决定了哪一个计数器进行工作。对索引页的计数器进行检验,如果它的值大于或等于2,那么分支被预测为执行,然后执行分支。如果分支被错误预测,那么计数器的值会减一,但是如果下一次预测准确的话,计数器的值会再次加一。现在这种方法带来的问题是,如果你有两条分支指令同时给出了同一个索引值,相关的计数器会武断的增值或减值,这被称为干扰(interference)。全历史计数器的容量越大(大于2比特),发生干扰的几率就越小。于是把干扰的几率降低,执行单元便能得到更为准确的分支预测。
正因为如此,K8才能够“记住”更多的分支,从而提高分支预测的整体效率。要想获得较高的命中率,仅仅是对原有预测机构进行简单修正显然是不够的,AMD还为改进的分支预测单元加入了分支地址计算器(branch address calculator简称BAC)。BAC可以快速(5个时钟周期)准确的计算出下一条分支的地址。
说到这里,大家很容易想到NetBrust微架构,它就是因为流水线过长,而引起分支预测错误带来的损失非常大,冗长的管线一旦遇到分支测错,就必须从新填充,造成了高频低能。而K8核心这次增强分支预测的能力,正是要为加长流水线长度——提升频率做准备。
如上图,和我们熟悉的K7架构10级整数流水线相比,K8加长了2级,增加2级线管深度的目的在于提升K8的核心频率。流水线的级数越多,每个时钟频率的负荷就越小,因此CPU就可以运行在更高的频率。拥有很强大的分支预测能力做保障,AMD完全有把握加长流水线,获得更高频率,事实也证实了AMD正确的选择。2级新增的流水线让K8的极限频率达到3.0GHz,这相对于NetBrust微架构最终将频率提升到3.8GHz是很划得来的。一般说来,专家认为当处理器的核心频率处于1G到几G的范围内,最理想的管线深度应该在12至13级。