AMD的64位策略 - x86-64
我们现在来谈论K8/Opteron 架构的基本部分---64bit支持。K8是世界上首个使用64-bit X86核心的处理器,它实现的途径,是AMD通过x86指令集上采用64-bit的扩展。
回溯往事,Intel在它的8bit基础上首次引入了x86 ISA(指令集架构)。在Intel采用了32bit指令集之后,它又转而寻求更先进的64-bit微处理器,Intel这样做的原因是,它们想摆脱容量巨大的x86 ISA,从而引入精力充沛而又功能强大的指令集,于是IA-64便诞生了。
IA-64 ISA在很多方面来说,都比x86 ISA有了长足的进步;但如果在这里谈论太多关于IA-64的东西,恐怕就有点超越我们这篇文章的范畴,因为我们讲的是x86结构。IA-64 ISA和IA-64微处理器最大的缺陷是它们缺乏与x86的兼容,而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上(Itanium,Itanium2,etc...)引入了x86-to-IA-64的解码器,这样就能够把x86指令翻译为IA-64指令。这个解码器并不是最有效率的解码器,也不是运行x86代码的最好途径(最好的途径是 直接在x86处理器上运行x86代码),因此Itanium 和Itanium2在运行x86应用程序时候的性能非常糟糕。
最能够从64-bit处理器架构获益的可能就是与内存相关的应用了;如果你有两个相同的微处理器,它们分别为64-bit和32-bit的,64-bit处理器的优点是能够比32-bit处理器具有更多的寻址空间(2^64 vs. 2^32)。对于那些想超越32bit寻址空间(4GB内存)的应用来说,Intel让他们获得高性能的方法是转移到Itanium 平台,但如果你既想使用超过4GB的内存空间,而同时又能够很好地运行x86指令,那么Intel的平台就无能为力了。
AMD的策略却是奇照一着的:它充分考虑到当前顾客的需要,而并非聚焦未来5-10年的计算机系统(这些将由它们的64-bit 策略来完成)。它们的做法是,坚持使用高性能的x86核心,并且只是简单地把ISA扩展到64-bit内存寻址空间,因此AMD把它们的结构称之为x86-64。
AMD Opteron 执行的x86-64功能称之为AMD64,它有许多先进的特性:
向后兼容当前的x86代码
除了原先的8 x86 GPRs(普通目的寄存器)之外,还加进了新的8 64bitGPRs(仅在64bit长的模式可以使用,将在下面进行详细的分析)
加入了8个新的SSE2寄存器,支持SSE&SSE2
为巨型数据库应用程序增加了寻址空间(仅在长模式可用,将在下面进行详细的讨论)
在支持领先的64bti应用程序的同时,无缝连接当前的32应用程序,是相当好的过渡型处理器
因为K8有运行当前x86代码,还有未来x86-64代码的能力,所以你可以猜想到它会有两种操作模式;称之为"legacy"和"long"。
在legacy模式,K8能够运行当前所有的16bit或者32bit x86应用程序,而处理器的作用就如K7般类似。
K8在"Long"模式时候的功能则非常强大,但这时候你需要使用相应的64bit x86-64操作系统;在这个模式,K8能够运行在完全的64bit模式,或者兼容的64bit模式。完全64-bit模式允许K8具有64bit架构的所有优点,包括64-bit的寻址空间能力。K8架构有个主要 的特征,那就是它在x86-64模式的时候,它普通目的寄存器的数量会加倍,因此这时64bit模式就能够获得一定的优点。
在兼容模式上,你将不能够获得64-bit架构的任何优点,因为它只是让你在64-bit OS上有执行32-bit应用程序的能力(因此称之为兼容);在该模式,额外的寄存器和64-bit寄存器扩展都将被忽略。兼容模式非常重要,因为Windows 操作系统有处理2GB内存的限制。虽然32-bit Windows提供了最大4GB内存的支持,但每个进程仅能够使用到最大2GB的内存,剩下的2GB将保留给OS。而在64-bit版本Windows上运行32-bit应用程序 的时候,兼容模式允许32-bit进程使用完全的4GB内存。
现在让我们来看看64-bit"long"模式,它比我们想象的要好得多。在64-bit"long"模式,除了有超过4GB的内存寻址空间,应用程序还能够访问2倍 于32bit的普通目的寄存器。你们知道,这些寄存器都是高速的,可以用来储存微处理器的临时数植。例如你想对两个数字进行加法运算,那么这两个数字和结果都将被储存在寄存器里面。
如果你用光了寄存器会发生什么问题呢?在这时候你将不能够只是简单地增加寄存器的数量,因为旧的应用程序由于使用编译指令集的限制,它没有办法辨认出新增的寄存器。如果你原始 的ISA是使用8寄存器设计,那么你将只能够使用8寄存器,除非你改变ISA---这几乎不可能实现,因为这将毁坏向后的兼容性,除非你使用AMD 的x86-64模式来扩展ISA,但在该模式你并不能够为旧的应用程序提供更多的寄存器,也不能使用升级的ISA进行编译。
当你确实用光了寄存器,除了使用主内存(或者cache)来存储临时的数据,你将别无选择。不幸的是,即使你使用cache来存储数据,在它与存储在高速的区域来说,也是非常浪费 处理器时钟的;因此把数据都存储在寄存器里就变得势在必行了。你拥有的寄存器越多,你用光它们的可能性就越少,这是很简单的道理。双倍的寄存器将能够使性能获得长足的增长 。假设你正在运行64-bit的操作系统,并且也在使用64-bit long 模式编译的应用程序,那么你将能够完全享用到额外寄存器所带来的优点。