CPU的主频 == 性能么?

光宇广贞 2009-06-10 08:36:49
浅谈CPU的执行效率与内部的执行管道流水线

原创作者:上海 姚臻

为什么实际频率只有1.8G的AMD 2500+处理器运行速度比实际频率2.4G的P4-2.4B还快?为什么采用0.13微米制程的Tulatin核心的处理器最高只能做到1.4G,反而采用0.18微米制程的Willamette核心的处理器却能轻松做到2G?下面我们就来分析一下到底是什么原因导致以上两种“怪圈”的存在。

每块CPU中都有“执行管道流水线”的存在(以下简称“管线”),管线对于CPU的关系就类似汽车组装线与汽车之间的关系。CPU的管线并不是物理意义上供数据输入输出的的管路或通道,它是为了执行指令而归纳出的“下一步需要做的事情”。每一个指令的执行都必须经过相同的步骤,我们把这样的步骤称作“级”。管线中的“级”的任务包括分支下一步要执行的指令、分支数据的运算结果、分支结果的存储位置、执行运算等等……

最基础的CPU管线可以被分为5级:
1、取指令
2、译解指令
3、演算出操作数
4、执行指令
5、存储到高速缓存

你可能会发现以上所说的5级的每一级的描述都非常的概括,同时如果增加一些特殊的级的话,管线将会有所延长:
1、取指令1
2、取指令2
3、译解指令1
4、译解指令2
5、演算出操作数
6、分派操作
7、确定时
8、执行指令
9、存储到高速缓存1
10、存储到高速缓存2

无论是最基本的管线还是延长后的管线都是必须完成同样的任务:接受指令,输出运算结果。两者之间的不同是:前者只有5级,其每一级要比后者10级中的每一级处理更多的工作。如果除此以外的其它细节都完全相同的话,那么你一定希望采用第一种情况的“5级”管线,原因很简单:数据填充5级要比填充10级容易的多。而且如果处理器的管线不是始终充满数据的话,那么将会损失宝贵的执行效率——这将意味着CPU的执行效率会在某种程度上大打折扣。

那么CPU管线的长短有什么不同呢?——其关键在于管线长度并不是简单的重复,可以说它把原来的每一级的工作细化,从而让每一级的工作更加简单,因此在“10级”模式下完成每一级工作的时间要明显的快于“5级”模式。最慢的(也是最复杂)的“级”结构决定了整个管线中的每个“级”的速度——请牢牢记住这一点!

我们假设上述第一种管线模式每一级需要1个时钟周期来执行,最慢可以在1ns内完成的话,那么基于这种管线结构的处理器的主频可以达到1GHz(1/1ns = 1GHz)。现在的情况是CPU内的管线级数越来越多,为此必须明显的缩短时钟周期来提供等于或者高于较短管线处理器的性能。好在,较长管线中每个时钟周期内所做的工作减少了,因此即使处理器频率提升了,但每个时钟周期缩短了,每个“级”所用的时间也就相应的减少了,从而可以让CPU运行在更高的频率上了。如果采用上述的第二种管线模式,可以把处理器主频提升到2GHz,那么我们应该可以得到相当于原来的处理器2倍的性能——如果管线一直保持满载的话。但事实并非如此,任何CPU内部的管线在预读取的时候总会有出错的情况存在,一旦出错了就必须把这条指令从第一级管线开始重新执行,稍微计算一下就可以得出结论:如果一块拥有5级管线的CPU在执行一条指令的时候,当执行到第2级时出错,那么从第一级管线开始重新执行这条指令的速度,要比一块拥有10级管线的CPU在第8级管线出错时重新执行要快的多,也就是说我们根本无法充分的利用CPU的全部资源,那么我们为什么还需要更高主频的CPU呢??

回溯到几年以前,让我们看看当时1.4GHz和1.5GHz的奔腾四处理器刚刚问世之初的情况:当时Intel公司将原奔腾三处理器的10级管线增加到了奔腾四的20级,管线长度一下提升了100%。最初上市的1.5GHz奔腾四处理器曾经举步维艰,超长的管线带来的负面影响是由于预读取指令的出错从而造成的执行效率严重低下,甚至根本无法同1GHz主频的奔腾三处理器相对垒,但明显的优势就是大幅度的提升了主频,因为20级管线同10级管线相比,每级管线的执行时间缩短了,虽然执行效率降低了,但处理器的主频是根据每级管线的执行时间而定的,跟执行效率没有关系,这也就是为什么采用0.18微米制程的Willamette核心的奔腾四处理器能把主频轻松做到2G的奥秘!

固然,更精湛的制造工艺也能对提升处理器的主频起到作用,当奔腾四换用0.13微米制造工艺的Northwood 核心后,主频的优势才大幅度体现出来,一直冲到了3.4G,长管线的CPU只有在高主频的情况下才能充分发挥优势——用很高的频率、很短的时钟周期来弥补它在预读取指令出错时重新执行指令所浪费的时间。

但是,拥有20级管线、采用0.13微米制程的Northwood核心的奔腾四处理器的理论频率极限是3.6G,那怎么办呢?Intel总是会采用“加长管线”这种屡试不爽的主频提升办法——新出来的采用Prescott核心的奔腾四处理器(俗称P4-E),居然采用了31级管线,通过上述介绍,很明显我们能得出Prescott核心的奔四处理器在一个时钟周期的处理效率上会比采用Northwood核心的奔四处理器慢上一大截,也就是说起初的P4-E并不比P4-C的快,虽然P4-E拥有了更大的二级缓存,但在同频率下,P4-E绝对不是P4-C的对手,只有当P4-E的主频提升到了5G以上,才有可能跟P4-3.4C的CPU对垒,著名的CPU效能测试软件SuperPi就能反应出这一差距来:P4-3.4E的处理器,运算Pi值小数点后100万位需要47秒,这仅相当于P4-2.4C的成绩,而P4-3.4C运算只需要31秒,把同频率下的P4-3.4E远远的甩在了后面!!

AMD 2500+处理器,采用了10级管线,只有1.8G的主频却能匹敌2.4G的P4;苹果电脑的G4处理器,更是采用了7级管线,只有1.2G的主频却能匹敌2.8C的P4,这些都要归功于更短的管线所带来的更高的执行效率,跟它们相比,执行效率方面Intel输在了管线长度上,但主频提升方面Intel又赢在了管线长度上,因为相对于“管线”这个较专业的问题,大多数消费者还是陌生的,人们只知道“处理器的主频越高速度就越快”这个片面的、错误的、荒谬的理论!!这就是Intel的精明之处!!!

本文来自Hikaliv 的 CSDN 博客:http://blog.csdn.net/hikaliv/archive/2009/06/10/4258715.aspx
...全文
453 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
通常单片机更关注功耗而不是速度。
yilin_wan 2009-06-29
  • 打赏
  • 举报
回复
哈哈,单片机的频率越高也不代表速度越快!
cjjcjj0527 2009-06-22
  • 打赏
  • 举报
回复
好家伙,学习了
Guilty 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 DelphiGuy 的回复:]
首先,我没有和你“争论”,而只是要搞清楚你说的“如果LEA指令中如果出现SHIFT微操作,则需要加上4个时钟”是否属实,因为就我所掌握的资料以及实际测试的结果,没有这种事。你不要误解。“本不想跟你争论,太累”这话听起来有点情绪化,不应该是您这种水平的人说的。
其次,你贴的这一段我我前面贴的说明是一样的,你不会看不出来吧。:)
[/Quote]
我没任何情绪化,也不认为自己水平高,真的感觉累,INTEL的东西它自己有时似乎是故意说不清,你不觉得累吗?
反正我承认好多看不清楚或是记不清了或是不太关心,但是有一点很清楚,我贴的写明了是有个SHIFT一微操作,而你贴的没有,你不应该看不见吧?也就是说根据我贴的,必须加上SHL的时钟。
而且同一手册上写了,SHIFT至少比3个依赖的连加还慢。
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 Guilty 的回复:]
晕,你不会认为你看过所以各时期INTEL的优化手册吧?IA-32手册明显不是了解NORTHWOOD的好资料。
本不想跟你争论,太累,我贴出来一段对照你贴的来说明INTEL手册一灌的含糊其辞,我贴的这段比较清楚
《Intel® Pentium® 4 Processor Optimization Reference Manual》

The lea instruction is not always as fast on the Pentium 4 processor as it is on the
Pentium II and Pentium III processors. This is primarily due to the fact that the lea
instruction can produce a shift µop. If the lea instruction uses a shift by a constant
amount then the latency of the sequence of µops is shorter if adds are used instead of a
shift, and the lea instruction is replaced with the appropriate sequence of µops.
However, this increases the total number of µops, leading to a trade-off:
Intel Pentium 4 Processor Optimization General Optimization Guidelines 2
2-54
同样这本手册Figure 1-4上写得清楚,两个ALU PORT都不能执行LEA,只有LOAD PORT也就是PORT2可以执行LEA
[/Quote]

首先,我没有和你“争论”,而只是要搞清楚你说的“如果LEA指令中如果出现SHIFT微操作,则需要加上4个时钟”是否属实,因为就我所掌握的资料以及实际测试的结果,没有这种事。你不要误解。“本不想跟你争论,太累”这话听起来有点情绪化,不应该是您这种水平的人说的。
其次,你贴的这一段我我前面贴的说明是一样的,你不会看不出来吧。:)
光宇广贞 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 Guilty 的回复:]
对绝大多数人来说,这些东西也不用过于认真,编译器的事。而且随着CPU换代,特性总在变
我的看法是,自认为精通汇编的人,99%干不过VC编译器,我也一样,能用汇编优化发挥作用的地方很少,
PC应用程序汇编主要是在SIMD方面,SSE2之类的。
[/Quote]

这个我是有体会的,

我很奇怪。一段C代码,我反汇编,拿出原模原样的汇编码,然后内联汇编,竟然仍干不过编译器!这个令我很不解!
Guilty 2009-06-16
  • 打赏
  • 举报
回复
从最新的INTEL CPU考虑,多用LEA可能不太合算,毕竟乘法3时钟,SHL一时钟,
如果LEA还是占用唯一的LOAD单元,变数就太多了。
Guilty 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 hikaliv 的回复:]
引用 36 楼 Guilty 的回复:
引用 32 楼 hikaliv 的回复:
the lea instruction uses a shift

所谓的shift ,是不是就是指

lea eax, [eax * 4];

这样的用法?


LEA EAX,[EAX+EAX]快过LEA EAX,[EAX*2]



嗯,在执行效率上,我没有意识去考虑解码效率。我对硬件不是很熟悉。
[/Quote]
对绝大多数人来说,这些东西也不用过于认真,编译器的事。而且随着CPU换代,特性总在变
我的看法是,自认为精通汇编的人,99%干不过VC编译器,我也一样,能用汇编优化发挥作用的地方很少,
PC应用程序汇编主要是在SIMD方面,SSE2之类的。
Guilty 2009-06-16
  • 打赏
  • 举报
回复
因为P4乘法要14~18时钟,所以
LEA [EAX*4+EAX]
LEA [EAX*8+EAX]
来代替乘45还是合算。
同期 ALTHLON乘法大概8~9个时钟把,除法大概也是比P4快一倍的样子,所以ATHLON快很大程度上是乘除指令快,不仅仅是流水和分支问题。
乘除指令和加减指令的速度比例是个有趣问题,AMD-K6乘指令就是3时钟,后来INTEL AMD乘除一起变慢了,现在又都快了,
我喜欢高频的原因是因为加减等简单指令快,实际上ADD\SUB\MOV大概占程序9成以上,优化也更有潜力。
乘除法速度也和浮点单元的速度是相关的,基本上乘除快的浮点性能测试都好,但我不看重浮点性能。
光宇广贞 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 Guilty 的回复:]
引用 32 楼 hikaliv 的回复:
the lea instruction uses a shift

所谓的shift ,是不是就是指

lea eax, [eax * 4];

这样的用法?


LEA EAX,[EAX+EAX]快过LEA EAX,[EAX*2]
[/Quote]

嗯,在执行效率上,我没有意识去考虑解码效率。我对硬件不是很熟悉。
Guilty 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 hikaliv 的回复:]
the lea instruction uses a shift

所谓的shift ,是不是就是指

lea eax, [eax * 4];

这样的用法?
[/Quote]
LEA EAX,[EAX+EAX]快过LEA EAX,[EAX*2]
Guilty 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 hikaliv 的回复:]
the lea instruction uses a shift

所谓的shift ,是不是就是指

lea eax, [eax * 4];

这样的用法?
[/Quote]
是的,INTEL说过在P4上,连加3次都比*8快,这都把把解码因素考虑进去了
pla_007 2009-06-16
  • 打赏
  • 举报
回复
插队学习。
Guilty 2009-06-16
  • 打赏
  • 举报
回复
INTEL的优化手册不断改版,有些版本我也没看过,其中好多看过的版本我也早删除掉了,现在懒翻垃圾出来看了
光宇广贞 2009-06-16
  • 打赏
  • 举报
回复
the lea instruction uses a shift

所谓的shift ,是不是就是指

lea eax, [eax * 4];

这样的用法?
Guilty 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 DelphiGuy 的回复:]
《IA-32 Intel® Architecture Optimization Reference Manual》未见到有“如果LEA指令中如果出现SHIFT微操作,则需要加上4个时钟”的说明。
但是提到了一条优化原则:“Use the lea instruction and the full range of addressing modes to do address calculation.”
在Use of the lea Instruction部分也只提到:
If the lea instruction uses a shift by a constant amount then the latency
of the sequence of μops is shorter if adds are used instead of a shift, and
the lea instruction may be replaced with an appropriate sequence of
μops. This, however, this increases the total number of μops, leading to
a trade-off.
这只是说明lea带比例乘要比不带比例乘慢,并未说明慢多少。实际测试表明带比例乘的lea只需要2个时钟周期(在northwood Pentium4 2.6和2.8上测试的)。
[/Quote]
晕,你不会认为你看过所以各时期INTEL的优化手册吧?IA-32手册明显不是了解NORTHWOOD的好资料。
本不想跟你争论,太累,我贴出来一段对照你贴的来说明INTEL手册一灌的含糊其辞,我贴的这段比较清楚
《Intel® Pentium® 4 Processor Optimization Reference Manual》

The lea instruction is not always as fast on the Pentium 4 processor as it is on the
Pentium II and Pentium III processors. This is primarily due to the fact that the lea
instruction can produce a shift µop. If the lea instruction uses a shift by a constant
amount then the latency of the sequence of µops is shorter if adds are used instead of a
shift, and the lea instruction is replaced with the appropriate sequence of µops.
However, this increases the total number of µops, leading to a trade-off:
Intel Pentium 4 Processor Optimization General Optimization Guidelines 2
2-54
同样这本手册Figure 1-4上写得清楚,两个ALU PORT都不能执行LEA,只有LOAD PORT也就是PORT2可以执行LEA
  • 打赏
  • 举报
回复
而shr eax这样的指令要4个时钟周期。
===================================
这是一个笔误,应该是“shl eax,2/shr eax,2这样的指令要4个时钟周期”。
见谅。
  • 打赏
  • 举报
回复
你不要忘记LOAD单元只有一个,而且LOAD是最密集的指令。
============================================================
你想说什么?LOAD单元只有一个,而且LOAD是最密集的指令。所以“如果LEA指令中如果出现SHIFT微操作,则需要加上4个时钟”?:)


唉,《Intel® Pentium® 4 Processor Optimization Reference Manual》里的东西你说指P3的,又不是错,我滚了。
============================================================
别这么激动。
我说的是“intel手册上的东西是逐步修订的,Pentium4的资料复制了很多Pentium3的资料,一些细节没有彻底修正,那也是很正常的。 ”,可没说Pentium4里的东西就是Pentium3的,那还得了?:)
您一会说“如果LEA指令中如果出现SHIFT微操作,则需要加上4个时钟”,一会又把AGU等同于ALU,我可没说一句您错呀,我的目的是求证,您干嘛这么情绪化呢。

即便您作为证据的这句“the lea instruction can produce a shift µop”(这句话也证明不了“需要加上4个时钟”),您就敢肯定这lea带比例乘产生的“shift µop”和移位指令产生的“shift µop”是同样的东西?我的意见,首先intel的处理器内部设计细节外人很难了解,其次x86指令的分解和实现方法可能每个处理器版本都有微小的修改,最好不要想当然。

Pentium4中,“LEA指令中如果出现SHIFT微操作”,是否“使用了shift单元”,是否“则需要加上4个时钟”,最好的证据是依据实际测试来推测。
就我测试的结果,lea eax,[eax*4+ecx]这样的指令只需要2个时钟周期,而shr eax这样的指令要4个时钟周期。
如果真的象您理解的那样,“使用了shift单元”、“需要加上4个时钟”,那么带比例乘的lea指令至少要5个时钟周期,这与事实相矛盾。
这是在一台CPUID为0F29的老Pentium4 2.8GHz机器上测试出来的,这样的机器虽然属于淘汰产品,但是目前并不少见,您一边说不想争论,另一边又写了很多“争论”的帖子,我建议您自己动手测试一下再发言,那可以节约很多时间。
Guilty 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 DelphiGuy 的回复:]
我可没说“INTEL手册就是错的”,我只是认为“lea带比例乘使用了shift单元”这种说法(事实上intel手册也没有这么说)对于Pentium4(至少某些版本)是不对的,因为与实际测试结果相矛盾。
“LEA和LOAD冲突的问题”是另一回事,不过这恰恰证明了lea也使用了AGU(地址生成单元)。
[/Quote]
你不要忘记LOAD单元只有一个,而且LOAD是最密集的指令。
唉,《Intel® Pentium® 4 Processor Optimization Reference Manual》里的东西你说指P3的,又不是错,我滚了。
  • 打赏
  • 举报
回复
我可没说“INTEL手册就是错的”,我只是认为“lea带比例乘使用了shift单元”这种说法(事实上intel手册也没有这么说)对于Pentium4(至少某些版本)是不对的,因为与实际测试结果相矛盾。
“LEA和LOAD冲突的问题”是另一回事,不过这恰恰证明了lea也使用了AGU(地址生成单元)。
加载更多回复(50)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧