Submit News Tips | I4U Gadget Flyer | RSS Feed
I4U Shopping : Cool Gadgets and Consumer Electronics Store
 
HOT TOPICS: Nintendo Wii | Sony PS3 | Xbox 360 | Gadget Models

I4U Latest News

揭开CPU的外壳 谈现代处理器技术

Topic: 技术前沿         ★★★★★

作者:Rowan    文章来源:本站原创    点击数:    更新时间:2007-7-8

编者按:这篇文章成文于2005年8月8日,发表在《大众硬件》杂志上。是一篇非常优秀的CPU技术文章,吐血推荐大家阅读。我写了很多技术前沿的文章,无外乎是显卡、处理器、新架构技术等。在处理器方面我觉得我还是了解不少的,所以经常爱写一些这类文章。


揭开CPU的外壳,谈现代处理器技术

相信很多人都亲眼见过计算机中的处理器,无论是Intel的还是AMD,甚至DIY发烧友会将它做成钥匙链。但是处理器芯片是被封装起来的,我们所能用肉眼看到的只是一个金属或者陶瓷的小东西。我们很难看到它内部具体有些什么,里面是如何运作的。今天我就来揭开处理器的这层神秘的外壳,谈谈现代处理器技术。

(如图1,AMD的Athlon FX 57处理器)

处理器的架构传说

在计算机世界有一件非常让人惊奇的事,那就是计算机的整体架构。无论今天的计算机外形有多大的变化,其主流的微型计算机仍然沿用19世纪40年代计算机发明初期时的架构。60多年前John Mauchly和J. Presper Eckert创立了一种新的运算架构,随后著名的数学家和计算机学家约翰•冯•诺伊曼正是发布了这种架构。其中最为核心的观点就是:内存可以存储程序指令和数据。这种能存储程序运行过程的运算观念就是我们后人常说的“冯诺依曼体系结构”。此后计算机就不在需要物理硬布线来实现输入指令,可存储的指令和数据更加便于修改。这是计算机史上的一次重大革命。

(如图2,冯•诺伊曼)

今天的主流CPU同样也使用的是19世纪40年代哈佛大学提出的“哈佛体系结构”。其主旨是将内存划分出两个区域,一个存储指令一个存储数据。例如,在现代计算机中嵌入到处理器的L1高速缓存又会细分为数据缓存和指令缓存两类。而后续的L2、L3高速缓存就更为典型了,他们都可以存储数据和指令。

在处理器的运作中,二进制程序的等级是最低的,因为他们的形态一般都是机器语言。无论是指令还是数据他们最终都会被编译成机器语言来进行处理。例如最后写入到L1高速缓存中的数据可能是“1000101111010000”这样的形态。汇编语言可以说是稍微高级一些的语言工具,它用更为形象的语言描述处理器要进行的工作,并且数据也可以划分为许多类型有象征性。例如在汇编语言中的“MOV AX, 9”就可以编译成“101110000000100100000000”二进制代码来处理。因此汇编语言这种人类易读的符号代码可以轻松的转换为二进制的机器语言。而像C语言这些更高级编程语言需要借助软件编译器进行编译才能转换为机器语言。

大多数处理器指令操作都差不多,像是加法、乘法、比较、进位输出等操作。要处理的数据通常都会暂时先放在寄存器中,但是也有可能是上一个操作的结果,或是存储在内存中。不同类型的指令的长度可能有所不同。像是Pentium 4和 Athlon64这些现代处理器可以将这些可变长度的x86指令解译成一条或者多条固定长度的处理器内部指令。这些更为短小的指令被称作微指令(micro-ops)。这些微指令并不能访问其他外部设备只能在处理器内部流通。

尽管现在许多处理器都采用微处理器指令集技术,但是他们的内部设计和操作可能是完全不同的。例如AMD的Athlon 64处理器和Intel的Pentium 4就截然不同。最初的解码器会先将程序指令解译成一个或多个中间阶段的微指令。(一个复杂的指令可能需要多个微指令才能实现)最后再将这些中间阶段的指令转换为最基本的微指令。不同的处理器家族的内部体系结构也会有很多不同,并且后续一代产品要能完全兼容上一代处理器的指令。例如Intel的386、486和Pentium处理器都是一代代的向下兼容,后续一代的处理器都会加入更强的内部指令。例如Intel著名的多媒体扩展指令集MMX、SSE、SSE2等等。而AMD64也是一个很好的例子,它属于x86体系结构的一种拓展,它可以处理32bit/64bit指令和地址。

如图3,AMD Athlon 64核心
在这张处理器内部结构图中你可以很清晰的看到容量为1MB的L2高速缓存(1),他们几乎占据了芯片一半的面积;(2)是DDR内存接口,它围绕着L2高速缓存的边沿;而左侧的边沿都被HyperTransport总线控制电路所包围(3);左边包含了许多单元,上层是浮点运算单元(4);下面是装在/存储区域(5)和数据高速缓存(6);下面的是执行单元电路(7)和总线控制单元(8);底部左边的方形区域用来存放微指令(9);右边则是指令高速缓存(10);最下面的是内存控制器(11)和时钟脉冲发生器(12)。

无论如何处理器都是要按照顺序逐一执行指令的,除非某些特殊原因而被突然中断,或者是分支预测的判定,他们才会乱序执行指令。在处理器中还有一个程序计数器的机制,它会留意指令处理结果的保存位置,方便下一次取回结果。处理器可以从内嵌的高速缓存或主内存中取回以前运算的结果。

脉冲时钟信号会同步每一个处理操作的步调。在处理器的内部信号会被细分为很多种。更高频率的时钟信号意味着更高速的处理操作。但是由于处理器架构和指令执行效率的差异也并不意味着具有同等时钟频率的处理器其运算效能是相同的。例如同PR值的Ahtlon 64处理器实际运行频率就比Pentium 4要低很多。但他们的运算效能大致相同。

处理器的管线

今天的主流处理器在处理指令时都采用了许多离散的步骤,这个处理过程就叫做管线。处理管线包含了5个最为基本的功能:指令读取、指令编译、操作生成地址和读取数据、执行、写入返回结果。(返回的结果可能会写入寄存器、高速缓存或主内存中)在这个过程中指令会从一个阶层移动到另一个阶层。处理器可以从内存中取出很多条指令,把它们写入到管线的头部。一般比较简单的处理器只有单一的管线,在每一次解译之后只能处理一条指令,这就叫做标量。处理管线的每一层都不会空闲下来,他们随时都在处理着指令。由此每一个时钟周期都能处理一条指令。然而当处理一些复杂的任务时,管线会因为某个层的原因而阻塞,这就叫做管线停滞。

对于标量处理管线有许多变数因素存在,在每一个阶层都要针对不同数据类型采取不同的操作处理。例如在处理器中,管线可以轻松处理整数运算,但他们也要应付不同长度的浮点数据运算。

如图4,管线的操作流程
管线允许处理器装在许多条指令,并且在不同的阶层中处理他们。增加管线的阶层数可以加速时钟脉冲的速度,但是分支预测的失败也有可能将整条管线内的任务清空。


现代处理器就是非常典型的实例,管线可以被划分为许多基本的阶层,这样的设计叫作“超流水线”。其中读取数据和解译的过程可能会被划分为3个阶层以上。这是因为一个操作更为简单的阶层中电子的迁移延迟时间会更小,它可以崔动更高频率的时钟脉冲信号。

虽然时钟频率并不是处理器性能表现的全部指标,但是更高的时钟频率对于最终用户来说却是十分诱人的。Intel的每一代新Pentium处理器速度都会大幅提升,性能也就随之提升了。但是随着处理器频率的提高,其发热量也显著增加了。高发热量限制了处理器速度的进一步提升。采用90nm制造工艺的新一代Pentium 4 3.8GHz的频率已经接近极限。另一方面,如果采用更精简的处理器管线设计在相同的频率下每个时钟周期会执行更多条指令。

很多人爱用IPC(每个时钟周期能处理的指令数)来衡量处理器的效能。但是很多人更喜欢IPC较低的架构,因为他们的管线长,运行的频率快。一些微处理器架构也许有更出色的IPC值,但是他们的管线短运行的频率就要慢很多。最为头痛的是,管线越长分支预测失败对性能的损失就越大。因此配比好管线长度和时钟频率才能设计出更好的处理器产品。

超标量体系结构处理器

超标量体系结构的处理器比上文介绍的标量结构要复杂许多。它内部集成了多条处理管线,多个特殊功能的单元。这些单元甚至自己可以处理和执行一些低级命令。在每个时钟周期内,他们可以解译、传送、执行多条指令。最初的Pentium处理器整合了两条整数运算管线,可以同时执行两条单精度的整数运算指令。

今天,超标量架构的处理器更为复杂了,他们至少可以同时执行6条以上的指令。当前主流的x86芯片采用的是微指令系统,就拿Athlon 64来说,每个时钟周期可以执行9条微指令。事实上许多专用处理器内部具有成千上万条小管线,他们可以联合起来处理许多比较相似的数据。

回溯到2000年8月,Intel发布了第一代Willamette核心的Pentium 4处理器的管线设计细节,它具有深达20层的管线。处理管线会从L1的指令高速缓存中读取要处理的指令,这些都是被解译好的x86指令。

(如图5,Intel Pentium 4 Prescott处理器核心)
其中大面积的彩色区域(1)是P4处理器的1MB L2高速缓存,它只占据了一小部分面积,这大致和AMD的Athlon 64差不多。(2)是浮点运算单元,(3)是程序调度控制器,(4)是程序分配器。他们都顺序排列在核心的左侧。(5)这个区块包含了ALU逻辑运算单元、AGU地址发生单元和寄存器堆栈。在其右边的(6)是浮点运算单元和16KB的数据高速缓存。在其下面的(7)是踪迹高速缓存和微编码ROM。p4核心最右边的是(9)DTLB数据编译缓冲器,分支预测单元(10)和ITLB指令编译缓冲器(11)

Athlon 64设置有一个12层的整数指令处理管线和一个17层的浮点运算处理管线。不幸的是,Intel从未公布过Prescott管线的具体细节,我们只是知道它具有惊人的31层管线。这些额外设计的管线可以大幅提高处理器的时钟脉冲速度,并且Intel重点改良了分之预测单元的性能,这样可以提高分之预测的命中率,减少管线清空的情况发生。

指令处理流程

现在要设计一款新的处理器,它必须能在原有的效能上加速指令的解译和执行速度。芯片的复杂程度也会随之大大增加,但是也只能通过这样复杂的设计才能让处理器并行执行更多独立的指令。而不必在输出一条指令的结果时,让整个管线停滞。例如,处理器可以一边从内存中读取下一步所需要的数据,一边处理手头上的指令。这样的工作方式可以大大加速运算效能。

一个处理器架构中会有许多关于指令处理顺序的策略,例如:顺序传输顺序执行;顺序传输乱序执行;乱序传输乱序执行等等。顺序传输可以将指令按照次序传递给处理器执行,可以顺序的完成所有写入结果。而乱序的传输和执行就可以有选择的执行最重要的任务,或者提前执行程序的分支。

乱序指令调度请求是依靠一个带有执行和解译指令功能的指令缓冲区管线来完成任务。很显然,当最终结果要写入到寄存器或内存时,处理器必须能保证其完整性。而处理器要具备更强的乱序执行能力,必须有更多缓冲区来存放临时结果。一般的处理器中都为所有的执行单元设计了统一的解译指令缓冲区域。并且还会为一些特殊的执行单元设计专门的缓冲区。

现今的处理器都设计有多重执行单元,这也是超标量架构的主要特征之一。因为读取和解译的阶层都是独立于其他阶层的。一个解译器能够向中心缓冲器发送结果,或者也可以向正在执行其他处理任务的特定执行单元缓冲区发送结果。这样即使解译器正处于忙碌状态,其下属的执行单元仍然有足够的解译指令可以继续工作。

当为众多的执行单元设立更多更大的缓冲区域时,执行单元就能存放更长的指令列队。他们就可以更好的对指令进行乱序执行,从而提高整体效能。处理器也会从众多指令中作总体评估,选择出哪条指令更需要赶快处理。分之预测系统也就能够更有效的对未来做出判定。

(如图6,Northwood和Prescott内核的分支预测单元比较。Prescott芯片这部分的面积更大,集成了更多的缓冲区。)

你可能会担心,乱序执行会将指令运行的结果乱序写入内存,但事实上不会的。内嵌的临时缓冲器会收集所有结果,然后将他们还原成最初的顺序再写入内存。不同的cpu可能处理数据时追踪和指针的标记方式有所不同,但最后写入内存的数据都是相同的。程序运行的效率问题则要留给程序员去针对不同的处理器作优化。


逻辑错误限制了性能

虽然乱序执行有很多好处,但是在多重管线的处理器中同时传送和执行多重指令会产生许多逻辑问题。比较常见的是“写后读”在必要条件未成立之前,已经先写下结论,导致最终结果出错。其他还有写后又写、读后又写等等。这些错误都很低级,只要使用简单的技术手段就能避免。这样的错误被设计人员称为“管线危机”。

要想避免写后读的情况发生我们就要尽量避免指令的同时传输和执行。处理器要强迫第一条指令完成后在执行第二条指令。可能写后又写的情况会经常发生,在两个连续的指令被分开计算后又在写入相同的寄存器中。这需要处理器在执行指令之前为两条管线建立从属关系。对于读后写这样的错误,处理器要优先执行第二条指令,当它产生结果保存在寄存器后,再执行第一条指令。

乱序执行中发生的这些错误会极大的影响超标量处理器的性能。使用各种软硬件技术可以简单的避免这些错误。编译器能够优化指令的执行,可以针对不同的处理器架构作特殊优化。

寄存器重命名机制

在众多的计算模型中,处理器都使用寄存器来存储数据。现代处理器中都设计有数量庞大的寄存器,这样他们就能存储更多的程序变量。这样就可以尽量避免访问高速缓存或主内存。一般的RISC精简指令处理器芯片都设计有128个以上的寄存器。

Intel和AMD的处理器都是x86架构的,他们同属于CISC复杂指令集处理器。较早的产品中仅仅有8个32bit多用途架构的寄存器:EAX,EBX,ECX,EDX,EDI,ESI,EBP,和ESP。现在最新的AMD64和Intel的EM64T都属于64bit x86架构,处理器中将以前的8个32bit寄存器扩展到了64bit。

少数x86架构的处理器也会发生“写后又写”这样的逻辑错误。寄存器可以独立进行操作,这就有可能反复处理同一条指令。寄存器的逻辑混乱也会大大降低超标量处理器的效能。

为了避免这一现象的发生,在目前主流的x86指令集体系中通常会对处理器的寄存器进行重命名。这样当寄存器独立或群组进行操作时就可以用动态的重命名取代不同的物理寄存器,避免逻辑混乱的情况发生。内部寄存器重命名后的数量会多于物理寄存器,外部程序同样也可以自由的访问这些重命名的寄存器。

这看上去似乎有些复杂,还是让我们举例来说。在处理器内部有个物理寄存器叫做R3,系统可以将它重命名为R3a和R3b。系统现在要运行两条指令,都要调用R3这个寄存器。在执行第一条指令时,这个寄存器被命名为R3a。在第一条指令运行完以前,这个寄存器都不会被重新命名。等到系统该运行第二条指令时,它才会被改名为R3b。经过这样动态的重命名,寄存器再也不会发生逻辑访问错误了。

(如图7,Prescott和Northwood中的寄存器支持重命名机制)

程序设计者通常使用数据前送与寄存器重命名协同操作,来避免寄存器的逻辑错误。处理器在一个时钟周期内,把一个单元的输出值内容直接拷贝到另一个单元的输入值中。这样紧凑的数据传输就可以避免更多的逻辑错误。


处理器资源的冲突

在超标量处理器中会出现两条指令同时争夺处理器资源的情况,他们会争夺寄存器使用权,高速缓存和内存的写入读取权,执行单元的使用权等等。处理器必须协调好这些资源访问的冲突。一般的处理器仅仅有较简单的资源复用机制。比如多重逻辑运算单元和装载存储单元,但是这些复用机制的设计是非常复杂的,而且设计成本也高的惊人。

(如图8,处理器资源的争夺非常激烈)

一些处理器设计有共享总线仲裁管理机制,而且大多x86处理器依靠寄存器重命名来避免资源冲突。但是芯片制造商要考虑更多的问题,比如整体架构,设计制造的成本,芯片的复杂度,还要尽可能的缩小芯片的体积。

Intel在这方面比较精明,主流的Pentium 4处理器中都采用了Hyper-Threading超线程技术。事实上它是一种加强型的多线程机制。它在资源冲突管理方面表现非常惊人。它可以为多线程的应用程序提升40%的性能。在多路处理器环境中也可以增加至少5%的性能。并且还可以减少5%的电力消耗。

在单核心的P4中,Hyper-Threading技术可以将指令流分成两组同时执行。你可以在很多网站上找到很多关于它的技术文章。

分支预测的逻辑错误

分支指令可以强迫让程序的串行指令流转向,当分支转向的时候会进行比较或者条件判定。现在问题就来了,无条件分支转向时,不需要作任何判定指令流就被迫转向了。管线内已经处理或正在处理的任务也都将停止。分支判定条件包含了许多种类,比如跳转和指令循环。这些循环有可能导致逻辑错误,轻则会严重影响性能,重则会产生错误结果。分支和程序的混乱对超标量处理器影响甚大,但对标量处理器却微乎其微。

当条件分支什么都不作的时候,系统会自动处理下一条指令。一般标准的x86程序中,条件分支的指令大约会占20%,其中10%会是无条件分支。跳转分支最普遍,大约占了一半以上。据统计表明大多数分支都有自循环过程。

高性能的处理器能预测分支的结果。对于适应性差的处理器来说,分支预测就比较薄弱了。在一条处理管线的每个阶层都在处理指令,一旦分支改变了程序流,整个管线内的数据就都必须重新装载新的目标地址。这样的情况对处理器的性能影响是巨大的。管线越长,清空后所损失的性能就越多。


数据处理的流程

以上我们已经详细介绍过处理器中的很多单元了,下面我们将他们串连起来讨论一下数据处理的整个流程,看看处理器管线究竟是怎么运作的。

事实上所有的微处理器的功能都是相似的。他们都是对内部的寄存器、高速缓存或主内存进行读写操作。Intel的P4通过BIU总线接口部件与外部设备相连。AMD的Athlon则通过HyperTransport总线和内存控制器界面与外部设备相连。

(如图9,Intel P4处理器流程图)

首先,处理器要从内嵌L2高速缓存中读取指令和数据,并且提交到更小的L1高速缓存中,将指令和数据存储在不同的区域内。所有的指令都要经过解译加工并储存在指令高速缓存中备用。此时分支预测开始处理L1中的指令,他们会尽量预测出管线转向的分支,并且预先提供数据存放的地址。处理器根据地址从缓存中取出指令送进处理管线。

(如图10,AMD的Athlon处理器流程图)

Pentium 4 和 Athlon 64都使用了拓展了的x86指令集,他们只能在内部运行。P4会先将要处理的指令转化为内部微指令,然后利用一种叫追踪缓存的技术预测微指令的程序分支。这样可以在程序出现较大的分支之前就能预测到,避免流水线被清空。而Athlon64则会从L2高速缓存中读取x86指令,将他们存储在L1中,经过解译器处理成微指令后再进行运算。

通常下一步会先将寄存器重命名,编排出指令执行的列队。处理器中的各种单元会协同工作,调度控制器会确认某条指令准备执行。程序调度器也会检查代码的合法性。接着就开始真正运行指令了。

总结

当你阅读完此文想必你已经对处理器内部的运作有一个大致的了解了。由于篇幅有限,在本文也不可能涵盖每一个技术点。处理器还包括很多很多其他的重要部件,比如内部逻辑运算单元,浮点运算单元,总线控制器等等。只希望此文能作抛砖引玉之用,在处理器的世界里,还有许多可以探询的知识。

 

发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口

  • 上一篇文章:
  • 下一篇文章:
  • 起居室变摄影棚 DIY摄影背景幕布
    mod地带:恶龙传说MOD主题机箱改造
     
    姓 名:

    评 分: 1分 2分 3分 4分 5分

    评 论: