内容导航 第1页:决战的日子:AMD Athlon 64 @ Athlon64 FX 第2页:64-bit 能够带来什么? 第3页:AMD 的法宝:Athlon 64 第4页:如迷一样的Athlon 64 FX 第5页:软硬件的支持 第6页:测试:内存延迟&带宽性能 第7页:商业应用的性能 第8页:内容创作的性能 第9页:游戏的性能 第10页:开发工作站的性能 第11页:DixX 解码和3D 贴图 第12页:32-bit VS 64-bit 的性能 第13页:总结
AMD 和预期的一样在9月23日正式发布了AMD Athlon 64 处理器,这激动人心的时刻终于来到了我们的面前。在过去的时间里,我们ZOL都在紧密关注着Athlon 64的发展状况,并抢先在国内的媒体报道报道了一系列的内容(具体内容请参考我们以前的相关报道)。现在Athlon 64 的发布已经成为了事实,那么它的各个方面情况(性能、规格)是否和我们预期的一样,还是令我们刮目相看呢?相信通过本文可以尽释你心中的疑问。
AMD 圣诞节的礼物:更多的寄存器(registers)
我们早前在对Opteron 处理器 进行报道的时候,重点介绍了K8核心架构与K7(Athlon XP)相比的主要先进特性 --处理器内建的内存控制器 ,改进的分支预测功能和更加灵活的TLBs 。其实这些先进的特性同样适用在Athlon 64 的身上。
但是我们对于微处理器工作在64-bit 模式,带来的额外寄存器究竟有什么好处并没有详细地谈及 。平时我们谈论CPU 储存空间的时候,都会想到主内存和cache,而对于CPU里面非常重要的储存空间---寄存器(Register),却知之甚少。其实寄存器是处理器里面能够保存数值的独立储存区域;这些数值之间能够互相递增,其实它们也就是能够寻找下一块信息的内存空间,储存运算过程中将要输出信息的临时空间。例如,在以下的方程式中:
A = 2 + 4
数字2,数字4,还有结果都将储存在寄存器里面,并且每个数字将占据一个寄存器。这些高速储存空间的位置在非常接近处理器函数单元(ALUs,FPUs,等...)的地方,并且都有固定的大小。在Athlon XP 和Pentium 4 等32-bit x86 处理器里面,这些大部分的寄存器都是32 bits 的宽度,这意味着它们仅能够储存单个32-bit 数值。如果Athlon 64 工作在32-bit 模式,那么它的常规寄存器都会被作为32-bits 的宽度对待,就像Athlon XP 一样。然而,如果它工作在64-bit 模式,那么常规目的寄存器(GPRs)都将变为64-bit的宽度,那么我们就可以获得两倍的GPRs 。为什么更多的寄存器显得如此重要?为什么AMD 和 Intel 在过去不使处理器具有更多的寄存器呢?我们将在下面解答这些问题。
在这里我们接着使用以上A = 2 + 4 的例子;因为在微处理器里面有超过3个寄存器,因此这个运算能够轻易地执行,不会造成用光寄存器的情况。那么在微处理器的内部,这些运算又是怎样执行的呢?
在寄存器1储存"2" ;
在寄存器2储存"2" ;
在寄存器3储存 寄存器1 + 寄存器 2 ;
在这些运算被执行之后,所有的3个数值都能够被保留并重新使用,因此如果我们再想在结果加上2的话,处理器只需要执行:寄存器 1 + 寄存器 3 就可以了。
如果微处理器仅有2个剩余的寄存器,而我们又需要再次使用2和4的值,那么这些值在覆盖结果A之前,必须储存在主内存之中 。运算执行的过程则会变成如下所示:
在寄存器1储存 "2" ;
在寄存器储存 "4" ;
在主内存的某个空间储存 寄存器 1 + 寄存器 2 ;
我们可以看在这里使用了其它的内存访问过程,而在这期间其实还有我们没有提到到的其它过程,比如主内存的定位也需要占据寄存器,以便让CPU 告诉 Load(装载)/store(储存) 单元该在那里发送数据 。 如果我们需要使用到这些结果的话,那么CPU将不得不首先到主内存中找回这些结果,把目前满载的寄存器驱逐一些数据,把它们写入主内存,然后再把寻找到的数据储存在寄存器 。这里大家应该能够明白吧,对内存的访问次数将会可怕地增加 ;你需要访问内存的时间越多,那么处理器等待工作完成的时间就越长 -- 因而造成性能的下降 。觉得简单吗?现在让我们举一些比较复杂的例子,为什么我们不增加寄存器的数量以获得更好的性能呢?
x86 指令集架构(ISA)的优点是,近二十年来开发的软件都能够运行在今天的x86微处理器上面 。但是如果想获得向后的兼容性,就需要在一个微处理器能够执行相同的ISA ;但这些不用包括函数单元,缓存容量,或者其它天然的东西,当然肯定要向后兼容寄存器的名字和数量 。如果程序编译的时候,表明它将要运行在x86 CPU 上面,那么编译器(compiler) 就会知道架构有8个常规目的寄存器;而当把程序员的代码翻译为机器代码的时候,CPU知道它仅涉及这些8个常规目的寄存器。如果Intel 的处理器有 10 个常规目的寄存器,那么专门编译为Intel CPU 运行的程序将不可以运行在AMD CPU 上;因为AMD 处理器 将找不到额外的两个常规目的寄存器 。
微处理器的设计师们围绕着这个问题,发布了一项称为寄存器重命名的技术,它仅允许软件运行一定数量可以看得见的寄存器,而硬件能够重命名它们内部的寄存器,因此能够在不访问主内存的前提下达到篡改数据的目的。寄存器的重命名技术解决了大量由于寄存器冲突而带来的麻烦,当CPU 用光寄存器的时候就必须与主内存交换,这样的麻烦将不再存在,因为这里解决了需要更多寄存器的暂时难题。
当AMD 介绍它们AMD64 架构的时候,其实拥有了一个千载难逢的机会。因为没有任何其它的x86 处理器可以运行64-bit 的代码,另外AMD64 架构工作在64-bit 模式的时候,具有双倍的常规目的和SSE/SSE2 寄存器 。既然AMD 不担心兼容性问题,那么加倍在64-bit 模式的寄存器数量将不是问题,而由于具有额外的寄存器,你将在64-bit 应用程序中看到非常显著的性能增长。
我们值得关注的另外一件事情就是,AMD 还增加了在64-bit 模式可见寄存器的数量,但用于重命名的内部寄存器数量却没有增加 -- 可能是为了保持较高的性能/价格 比吧。