引言
编者注:五月一日,就在我们开始享受五一长假的时候,AnandTech 网站发布了这篇关于 Intel Core 微架构的《Intel Core versus AMD's K8 architecture》一文。与我们先前发布的《Intel Core 微架构全面解析》一文相比,这篇文章关注的焦点是 Core 微架构与 K8 处理器的对比。并且,该篇文章的作者是在访问过 Intel 以色列设计团队的架构设计师 Jack Doweck 之后撰写该文的,应该说文章中的一些说法具有一定的权威性。因此,尽管文章的内容与我们之前发布的文章有一些交叉,我们还是把全文转载过来,供广大读者参考。
宽动态执行(Wide Dynamic Execution),高级数字多媒体增强技术(Advanced Digital Media Boost),智能内存访问技术(Smart Memory Access),高级智能缓存技术(Advanced Smart Cache)??这些都是 Intel 的市场部人员重点宣传的技术,所有的这些技术造就了 Intel 新推出的高性能、低功耗的 Core 微架构。
不过,我们不会只关心市场宣传人员给他们的产品贴上的漂亮的标签。如果只看标签的话??“结合良好的性能与合理的功耗,扩展数字生活的方式”,你会发现这与 VIA 对他们的 C7 处理器的宣传很相似。然而,你认为宣传口号背后的 Intel Core 微架构会与 VIA C7 处理器相同吗?
下面,就让我们来仔细了解一下隐藏在市场宣传人员的口号背后的 Core 微架构的秘密,并且与 AMD 的 K8 微架构、Intel 之前的 NetBurst 微架构以及 Pentium M 处理器进行对比。撰写这篇文章之前,我们与 Intel 以色列研发中心(Israel Development Center,简称IDC)的架构设计师之一??Jack Doweck 进行了交流。Jack Doweck 设计了全新的内存乱序缓冲区(Memory Reorder Buffer)和内存相关性预测系统(Memory disambiguation system)。
Intel 的市场宣传人员声称 Core 微架构是 Pentium M 处理器和 NetBurst 微架构的融合。然而目前比较普遍的看法是,Core 微架构是 Pentium Pro 架构,或者说是 P6 微架构的延续。在 Core 微架构中,你很难找到任何与Pentium 4,或者说是 NetBurst 微架构有关的东西。在我们与 Jack Doweck 的交谈之后,这个事实更加清晰??Core 微架构中只有预取机制是从 NetBurst 微架构获得的灵感,所有其它的设计都是从 Yonah 微架构(Core Duo 处理器)演变而来,而 Yonah 微架构显然是从 Banias 处理器和 Dothan 处理器演变而来的。所有 Banias、Dothan、Yonah和采用 Core 微架构的处理器都继承了 NetBurst 处理器的前端总线设计,但除此之外,它们毫无疑问都是曾经获得巨大成功的 P6 微架构的后代。在某种意义上,你可以把 Core 微架构叫做“P8 微架构”,因为 Banias 和 Dothan 处理器曾经被称作“P7 微架构”。(不过,需要注意的是,Intel 从未给出过 Banias 和 Dothan 处理器所采用的微架构的正式名称,我们一般用 Pentium M处理器代表它们,或者简称为 PM 处理器。)
不过这并不意味着 Intel 的工程师只是把 Yonah 处理器的一些功能单元和解码器重新包装一下然后换了个名字就推出来。Jack 告诉我们,Woodcrest、Conroe 和 Merom 处理器都是基于 Yonah 处理器的,但是几乎80%的架构和电路设计需要重新进行。
为使那些不熟悉处理器设计的读者也能理解文章后面的内容,我们首先从一个处理器微架构的速成教程开始。为了理解处理器设计的目标和优劣,你首先需要了解处理器执行的指令,所以我们从处理器运行的软件开始。
典型的 X86 程序的代码中大约有50%的指令是存储器访问指令,其中存储器读指令大约是存储器写指令的2倍。然后,大约15%到20%的指令是分支指令(if, then, else等)。剩余指令中,大部分是诸如“ADD”、“MUL”这样的较简单的计算指令。像“DIV”、“SQRT”这些较复杂的计算指令在所有指令中只占很少的一部分。所有这些指令都按照典型的流水线步骤执行:取指,解码,取操作数,执行,退出。
首先,处理器会根据指令指针寄存器(instruction pointer register)指示的地址取回指令。这时,对处理器来说,指令仅仅是一些没有意义的0、1字符串。只有在被解码之后,指令对处理器来说才开始有意义。指令被解码后可以得到操作数地址和操作码,而操作数地址可以在下一步发挥作用:取操作数。你不会希望处理器对操作数的地址进行计算,而是对那些地址里面存放的内容进行计算??与 C 语言里面的指针的概念很相似。当操作数被取出来以后,ALU根据操作码的指示,就可以对操作数进行正确的计算了。计算结果一般将被写回处理器内部的寄存器堆中。有时候,计算结果也需要写回到缓存和内存中。这就是最后的步骤??退出。到此为止,你应该略微了解一条指令的整个执行过程了。
今天,对处理器设计者来说,主要的挑战是处理器的存储器访问平均延迟。在一个由 Pentium 4 3.6GHz 和 DDR400 内存构成的系统中,处理器的速度是内存的速度(200MHz)的18倍。也就是说,访问内存的每一个周期,处理器会经过18个周期。而且,发送一个内存访问请求需要多个内存周期,回应一个内存访问也需要多个周期。因此,对于 Pentium 4 来说,花费200到300个处理器周期来等待内存访问的完成并不罕见。设计处理器缓存的目标就是避免内存访问的发生。但即使处理器缓存的缺失率仅为4%,也就是说,在处理器访问存储器的所有情况中只有4%的比例需要访问内存,这4%也将显著降低处理器的执行效率。
在处理器频率已经达到3GHz甚至更高的时代,保证即将用到的指令和数据已经在缓存中准备好是处理器设计者最重要的工作之一。因为只有这样,才能保证随着处理器频率的提高性能也随之提高;否则的话,更高的处理器频率只会使处理器花费更多的时钟周期来等待数据。这种把数据提前装入缓存的技术被称为“数据预取技术”(Prefeching)。但是,之前的处理器采用的数据预取技术并不能保证每次都
[1] [2] 下一页