高性能CPU的秘密——高速CPU篇 Johan De Gelas、双木(译) 1999年 第12期 17版 你是不是对Alpha CPU能够达到非常高的时钟频率感到惊奇?为什么Intel采用P6核心的CPU速度可以达到800MHz,但K6核心的CPU却很难达到这个速度?为什么AMD声称K7能够在更高时钟频率下工作?想知道答案吗?请看下文—— #1 一、大不相同的CPU 如果你平时很关注CPU的话,你也许会发现一个非常有趣的情况:当AMD CPU还在450MHz、Intel CPU在500MHz时,Alpha CPU已经达到了700MHz。如果你还知道Alpha 533~600MHz CPU使用的竟然是0.35μm工艺时,那就更显得与众不同了。AMD和Cyrix在使用0.35μm工艺时,绞尽脑汁也没有将它们的CPU速度提高到233MHz以上! 有人说,如果要使CPU达到高时钟频率,主要因素有以下三个方面: 1.更好的制造能力; 2.很小的芯片面积(Die Size)和更低的功率消耗; 3.更长的流水线(Pipelines)。 事实是这样的吗?让我们还是先来看看表1中的这些CPU。 产品 发表时间 工艺(μm) 芯片面积(mm2) 最高频率(MHz) Intel PⅡ 1997 0.35 203 300 AMD K6 1997 0.35 168 233 Sun UtraSpare IIi 1998 0.35 156 360 DEC Alpha 21164a 1997 0.35 209 600 DEC Alpha 21164 1998 0.25 302 667 HP PJA-RISC 8200 1997 0.5 345 220 你可以看到,先进的制造技术并不能使Intel CPU的时钟频率运行得比Alpha CPU高。实际上,DEC还有几次请Intel替过工,因为Intel的工艺更好。 更小的芯片面积?Alpha和HP的芯片面积更大!因此,那也不是理由。IDT winchip的芯片面积是很小的,而且AMD CPU的芯片面积总是比Intel同级的CPU小,但它们却不能在时钟频率上领先Intel。 更长的流水线?这是一个使人糊涂的答案。更长的流水线能帮助我们达到更高的时钟频率吗?等等,想知道什么是流水线?请继续往下读。 #1 二、你自己的CPU 为了把问题说清楚,我们先来设计一个微处理器。首先,你必须知道,微处理器中最重要的地方是ALU (Arithmetic Logical Unit,算术逻辑单元),它是CPU真正处理数据的地方。ALU使用的数据来自寄存器(Register),它读取寄存器中的数据并进行一些计算(如对两个数据相加、加1、对两个数据进行逻辑或运算等等),然后把计算结果返回到寄存器中,最后再把寄存器中的结果返回到主内存中(通过Cache)。寄存器的读写速度必须非常快,否则ALU将等待数据输入或把结果输出,这就要求寄存器能够在一个时钟周期内完成读和写的工作。我们来看看我们的CPU在每个时钟周期中在做什么?(^121701b^1 ^121701c^2) 每个微处理器都要使用时钟信号,也就是一串电脉冲。在脉冲的下降沿,我们要设置好寄存器的门电路(寄存器下方两侧的小箭头),换句话说,我们要确信来自L1 Cache中的数据(寄存器左边的箭头)将被写入到正确的寄存器中。还有,你看到了ALU边上的4条水平箭头吗?它们代表着指令控制线,指令将决定ALU做什么样的运算(就这个CPU而言,我们可以给出24=16条指令)。设置好所有这些信号只需花很少的时间,只是CPU时钟周期的一小部分(△Sig)。 然后,我们要把正确的数据通过总线(寄存器右边的箭头)送到ALU。这些数据必须通过总线传输,而且也只花费很少一点时间,因为在ALU运算前,数据信号还有一个稳定期(△B)。一旦这些步骤完成后,ALU就开始工作。当计算任务结束后(△ALU),运算结果必须又通过总线传输,花费的时间段为△R。最后,寄存器将在下一个脉冲周期的上升沿装入新的计算结果。 这就是ALU在一个时钟周期中能够从寄存器中输入数据并输出数据到寄存器的方法。 #1 三、提高CPU速度的方法 还是回到我们的主题上吧:我们怎样获得快如闪电的高速呢?很明显,高时钟速度意味着两个脉冲之间的时间间隔必须尽可能地短,但我们不能使时钟周期比△Sig+△B+△ALU+△R的和小(否则我们在把结果送到寄存器之前就装入了新的数据,那肯定会错得一塌糊涂)。下面是三个可能的解决方案: ①让数据传输更快;②让ALU计算速度更快;③减少在一个时钟周期中的工作量。 #1 1.更快的传输速度 让数据快速传输不是件容易的事,在电信号的传输过程中要尽可能减少传送障碍,这就依赖于芯片制造厂所使用的技术和硅片工作温度。例如,Intel有非常好的制造技术,它的大部分CPU都可以运行在450MHz下。硅片的工作温度也会影响到传输速度,硅片中的原子有一个确定的位置,它们在这个位置附近振荡。当芯片温度上升的时候,原子的振荡加剧并使电子有机会脱离它原有的理想路径(即电子热漂移)。如果你能使温度降下来,电子(数据流)将传输得更平滑。这就是为什么经特殊冷冻散热技术的CPU可以跑得更快的原因(最近Intel使它的CPU跑到了1000MHz)。 接下来还要缩短数据流传输路径的距离,要努力缩短晶体管本身及它们之间的距离,方法是采用更小的线宽,那就是AMD和Intel制造600MHz CPU的前提,它们将使用更小的0.18μm工艺来取代0.25μm工艺。 #1 2.更快的计算速度 如果ALU可以并行工作,那么速度就会提高。因此加上一个复杂的附加电路单元可以使ALU运算得更快,使△ALU时间减少。不过有得必有失,复杂附加电路单元的加入会使芯片体积加大。 #1 3.在一个时钟周期中做更少的工作 举个例来说,我们可以在一个时钟周期里做1步的工作而不是原来的7步。也许有人问:这不是把原来的时间延长了7倍后才能得到结果吗?在工厂流水线上工作过的人都知道,如果一个工位上只拧1颗螺钉而不是原来的7颗,速度当然快得多,虽然这样做使得流水线加长、人员增多,但在速度至上的芯片业中,这实在是很划算的。因此,如果能在每个时钟周期中只做一件事,那么我们就可以把脉冲间隔缩短,工作频率就能大幅提升。而且,通过使用流水线技术,使每个周期都有结果输出。 流水线可以使CPU中的每个单元在每个时钟周期中同时工作。以我们的CPU为例,它有4个主要的单元: 引入单元(Fetcher),它负责查询下一条指令; 解码单元(Decoder),它搞清指令的含义; ALU,执行指令; 引出单元(Retire),它将结果写回到存储器中。 从表2中可以看到,在同一时钟周期中,引入单元引入指令4时,解码单元在对指令3解码,ALU执行指令2,而指令1的结果由引出单元写到存储器中。也就是说,从第四个时钟周期开始,每个时钟周期都有指令任务完成。从外面来看,CPU可以在每个时钟周期完成一个指令,当我们在一个时钟周期中做的事越少,时钟速度就能更高。 时钟周期 引入 解码 执行 引出 1 指令1 2 指令2 指令1 3 指令3 指令2 指令1 4 指令4 指令3 指令2 指令1 5 指令5 指令4 指令3 指令2 6 指令6 指令5 指令4 指令3 7 指令7 指令6 指令5 指令4 8 指令8 指令7 指令6 指令5 9 指令9 指令8 指令7 指令6 也许你会问,为什么不造一个具有20个工位或更长的超级流水线的CPU呢?实际上,太长的流水线会加大出现停顿的可能性。我们假设指令2由B=A+1组成,指令1由A=C×2组成。如果计算A要花20个周期,指令2就不能立即开始执行,因为指令2需要指令1的计算结果,这将使指令2要在二十几个时钟周期后才能开始执行。如果流水线更长,造成延迟的后果就会更严重。而且,加长流水线并不是得到高时钟频率的唯一方法,你还可以让更多的工作并行进行。 我们知道K6系列CPU有一条6工位的流水线,而PⅡ的流水线的工位有12个!尽管K6有一个更好的ALU(它的△ALU时间更短)和更好的解码器(并行工作更多),但在使用同样的制造工艺下,K6-3要达到PⅡ同样的时钟速度则更困难一些。0.35μm的K6的最高时钟频率为233MHz,而同时,0.35μm的PⅡ的最高时钟频率为300MHz。 Ultrasparc Ⅱ CPU使用了9工位流水线,但它是RISC CPU,不需要像PⅡ这么多的解码工作,在PⅡ中,引入和解码单元就占了7个工位,而Ultrasparc Ⅱ只有3个,从这个意义上讲(即只比较RISC核心),Ultrasparc Ⅱ流水线的长度比PⅡ还要长。Alpha CPU的流水线有7个工位(FPU有10个),但同PⅡ比较仍然具有很少的解码指令。Alpha的工程师很精通于让每个工位尽可能地简单,每个部分尽可能多地并行工作。但它也带来了价格上的问题:芯片面积太大! 在每个时钟周期中,K7的FPU比K6-2的FPU做的工作要少,因而K7有可能达到更高的时钟频率。10工位的整数流水线(FPU流水线有15个工位)将让K7的时钟速度达到K6核心从未达到的速度。Cyrix也在对它的Jalapeno (M7?)做同样的改进。 当然,时钟速度高并不是决定CPU高性能的唯一因素,我们下次再来讨论这个问题。