2004年:当CPU温和地走入那个良夜

开场白

提起1994年,你会想起那时在世界电影史上都大放异彩的一年的,那一年国外影坛神仙打架,《阿甘正传》、《肖申克的救赎》、《这个杀手不太冷》等等横空出世,中国也有《重庆森林》、《活着》这样的佳作。

而2004年在你印象里有什么记忆深刻之处呢?好像没有,2004年在大多人眼里是平平无奇的一年。然而却消无声息地开始改变了后来很多程序员的命运,一直影响到现在,尽管当中的很多人都不自知。这一切的源头都是CPU。

摩尔定律与登纳德微缩定律

摩尔定律Moore's Law),我们都很熟悉。虽然名为定律,但并不是什么科学定律。这是Intel创始人Gordon Moore于1965年提出的一个观点:

集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍。

由于摩尔定律只是经验之谈,所以其中描述的翻倍时间并不总是准确,也有说法是18个月到24个月之间。另外还有一些延伸出来的解读指导着半导体行业的发展:比如每过N个月,芯片的性能就翻一倍。每过N个月,芯片的价格就降一倍。等等。

除了摩尔定律以外还有一个名气小一点的登纳德微缩定律Dennard Scaling):

晶体管的尺寸在每一代技术中都缩小了30% (0.7倍),因此它们的面积A减少了50%。这意味着电路减少了30% (0.7倍)的延迟,因此增加了约40% (1.4倍)的工作频率。最后,为了保持电场恒定,电压降低了30%,能量降低了65%,功率降低了50%。因此,在每一代技术中,晶体管密度增加一倍,电路速度提高40%,功耗(晶体管数量增加一倍)保持不变。

在摩尔定律与登纳德定律提出之后的相当长的时间内,事情的发展都十分顺遂。CPU的性能在稳步的提升翻倍。在2000年前,CPU的更新换代,主要是提升时钟频率,而非增加核数。而且那时CPU的每次升级,软件可以自动地获得大幅性能提升。程序员们并不需要花费过多的学习成本,只需要更换新的处理器就可以了。那真是一段快乐的时光,直到2004年。

免费的午餐结束了!

当时人们早早地获得了2GHz的CPU,3GHz也很快成为主流。按照发展速度,4GHz、5GHz甚至10GHz的的CPU都应该能如期而至。但是从3GHz以后,4GHz却迟迟不至。受限于诸多物理问题,登纳德定律走向终结。

提高CPU主频变得越来越困难,因为这不仅仅是一个而是几个物理问题造成,特别是热、功耗过大、当前的电流泄露问题。

这是2007年,C++大牛Herb Sutter发表的文章《The Free Lunch Is Over》中的一句。

http://www.gotw.ca/publications/concurrency-ddj.htm

文中还有详细描述:

主要的处理器设计生产商,从Intel和AMD到SPARC和PowerPC,已经几乎穷尽了所有的传统方法来提高CPU性能。大多数应用在几十年内都可以获得免费规律的性能提升,甚至不需要发行新版本或做其他任何特殊的事情,因为CPU制造商(主要)和硬盘制造商(次要)拥有可靠的更新更快的主流系统。时钟频率不是衡量的唯一标准,甚至不是好性能的必要标准,但却是有指导意义的标准:我们已经习惯看到500MHz的CPU被1GHz的替代,1GHz的被2GHz替代等等。今天主流电脑的主频可以达到3GHz的范围。

为了能让CPU继续稳步地提升性能,给摩尔定律的18个月性能翻一倍的说法续命,CPU“被迫”朝向多核发展。当然CPU这么多年的技术发展不仅仅是时钟频率以及多核带来的,还有缓存,指令优化等等。但不得不说的是时钟频率和多核带来的提升更多些。

The Free Lunch Is Over,直译就是“免费的午餐结束了”。自此CPU发展的重点从不断提高时钟频率转移到了利用并行性的架构特性上。这意味着程序员们没办法在毫不感知硬件变化的情况下,继续享受硬件升级带来的红利了。并且需要编写不仅正确而且还要优秀的代码才能吃掉CPU新增的性能。当然前面这些话有些绝对,毕竟后来CPU缓存之类的优化,也可以让程序员免费享受到一些性能增益,只是还不够多而已。

尽管在2004年以前就有涉及到并行的技术。比如pthread与openMP。但对于大多数程序员而言,这其实是可有可无的非必修技能,而2004年以后,程序员们的技能树上则必须把多线程与并发编程的技能点满。然而这还不是全部,并发与并行并非完全对等的概念。真正的并行计算还有很有更多的技术接踵而至,越来越多的程序员们将无法独善其身。

在许多年以后,随着一场世纪围棋大战,人民对于并行算力的要求达到顶峰,显卡之上的GPU逐渐成为人们追逐的焦点。又因为数字货币引发的挖矿热潮,导致显卡一卡难求!当然这是另外一个故事了。

C++失去的10年

C++11的出现在一定程度上盘活了陷入僵局的C++,被称为C++的“文艺复兴”。在2011年向前倒推10年,可谓C++失去的十年。这期间C++只颁布了C++03这一个标准,并且并不是大版本,只能说是C++98基础上的一次小增补。在2003年往后,2011年之前的7年之间更是一个新版本都没有正式释出。其实C++11之前的版本代号是C++0x,确实是计划在2010年之前颁布的,中途曾定档为2009年,但最终仍然跳票。直到2011年才最终发布。

2000年前编程语言发展的重点,大抵体现在如何组织代码的软件工程学上,比如从面向过程到面向对象,又比如C++中的模板。这些都是编程范式上的探索。而自2003年之后,2011年之前的这段C++的晦暗时光中,Java、C#都一度攻城掠地,甚至PHP也赢来黄金期。这个时间段,C++的低落自然和Web的发展有关,但我感觉和CPU时钟频率陷入僵局,开始朝向多核发展也有着千丝万缕的联系。C++必须要针对多核有所作为!在此期间C++并非不能使用多线程,但那都是C语言的。C++只不过是兼容C语言而已,并且由于是系统级API,不同操作系统有着不同的实现。Java早早在官方标准中就定义好了多线程的API,因为虚拟机这一中间层,使得Java程序员可以轻松享受到便利。而这是C++的劣势。作为一门不是某个厂商把持的、面向系统的编程语言,C++还是需要统一各平台的多线程并发的API,而这并没有想象中那么容易。这并不是把pthread改成面向对象的接口那么简单,C++11做得也不仅仅是一个std::thread。还有统一内存模型、线程同步API、std::future、甚至lambda表达式等等等等。

当然C++失落的200x年与CPU遭遇2004年之间的因果联系大多仅代表我个人观点。毕竟前面提到的那篇《免费午餐结束了》是由C++大神撰写的。

闲谈时钟频率

前文的思绪有些飘,来点务实的。CPU运行在哪种频率下是有几种模式可以选择的。如果你是Linux系统的,可以尝试用cpupower frequency-info命令查看一下。可能展示是结果是powersave(节能模式)、performance(性能模式)或其他模式。我还真听说过有线上机器没有开启performance模式,而是powersave模式跑了很长时间,改成performance以后,啥代码都不用改,就获得了几十毫秒的性能提升的事。当然这种问题可能相对低级,专业的运维或基础架构团队应该都能保障,不需要程序员操心。

时至今日,我在公司的服务器机器上,查询CPU的频率的,基本也显示为3GHz。但咨询运维说机器CPU实际达不到满满的3GHz,只能到2.8GHz。我说怎么可能?他说用turbostat命令查看,那个显示的运行频率更真实。好吧,我试了一下还真是。

当然服务器和个人电脑的CPU是不同的。即使都是Intel家的,个人电脑一般是酷睿(Core)系列,而CPU是至强(Xeon)系列。自Herb Sutter发文的2007年,到如今也已经14年了。Intel其实也打造出来4GHz的产品。虽然比预期的时间晚了很多。然而毕十年之功于一役,后续稳步提升频率依旧艰难。所以程序员们,还是好好学习多线程编程和并行计算吧。

相关文章

最近大家都在讨论,有人不知道是骁龙4gen1和骁龙695哪个好?...
现在对于吃鸡来说,大家还是在乎充分的享受,那么到底能开多...
红米手机官方价格非常亲民,目前的售价也是可以接受的。消费...
51款CPU是目前全新在售的,cpubenchmark跑分在2万分以上的桌...
中央处理器cpu中的控制器是整个中心。控制器指挥计算机的各个...
cpu会烧坏。一般来说,cpu的温度在正常工作范围内(通常为50...