【IT168 专稿】也许现在的程序员都应该感谢比尔.盖茨,正是因为比尔在20多年前的大声疾呼,才拉开了商业软件时代的序幕,才有了今天软件和硬件的飞速发展。转眼20多年过去了,无论是硬件、还是软件,都已不能同日而语。从最初的8086到P4 3.8G,从DOS1.0到Windows Vista。虽然20年在人类的发展史上只是弹指一挥间,但对计算机来说,却相当于经历了亿万年。在短短的20年里,计算机从最初钻木取火的原始时代进入了可以在星际之间穿梭的太空时代。虽然在这其间软、硬件都得到了极大的发展,但一切皆有极限,尤其是计算机的心脏:CPU,目前它的主频已经到达3.8G,而4G就是CPU主频的极限。这就意味着,如果不采取措施,CPU将永远停留在目前的主频上。就在这时AMD和英特尔先后突破了这个极限,然而在软件上又遇到了危机,这些危机最终也能象CPU主频一样得到解决吗?
进入专题:多核计算——后CPU时代的辉煌
http://www4.it168.com/jtzt/shenlan/tech/dh/index.html
一、单核处理器遭遇终极瓶颈,性能高速公路突遇强降雪
永不满足是人类最宝贵的本性之一。也是区别于地球上其他生物的特性之一。正是由于这种永远追求极致的欲望促使了一个个伟大的发明不断涌现。计算机就是其中之一。而做为计算机的核心和司令部的CPU的发展直接牵动着计算机的发展。
记得我拥有的第一台个人计算机的CPU主频是奔腾100MHZ,到现在已经十几年过去了。在这其间,CPU一次次地遭遇性能极限,但都又一次次地冲破了这个极限。从奔腾到奔腾2,CPU也突破了1GHZ,从奔腾2到奔腾3,CPU从1GHZ突破了2GHZ,从奔腾3到奔腾4,CPU也终于突破了3GHZ,现在最高的CPU主频已经高达3.8GHZ。但CPU好象停止了前进,到3.8G却怎么也超不过4G了。
在以前,英特尔一直固执地认为只有通过主频的提高才能使性能提高,因此,CPU的主频在10年内提高近40倍(这好象比摩尔定律定义的还快)。但最近英特尔不得不承认奔腾系列已经遭遇最终的主频极限,4G就象一场百年罕见地强降雪,将奔腾系列CPU的性能高速公路永远地封死了。因此,以英特尔为首的CPU军团不得不另外找一条更宽的性能高速公路来继续他们的CPU神话。
二、 AMD和英特尔各显神通,先后拉开多核时代的序幕
在2006年也许会成为CPU乃至软件发展史上的又一次重大里程碑,甚至可以和60年第一台计算机的发明相提并论。因为在这一年,CPU在物理上得到了极大的改变。而率先引发这次冲击波的就是CPU的第二号厂商AMD。
AMD在2006年第一个推出了双核处理器,这种处理器的计算单元相互独立,但它们将共享CPU的一、二级绶存。这种CPU虽然没有两颗CPU的效率高,但它的性价比是非常高的。在AMD推出双核处理器不久,英特尔这个CPU世界的老大就按耐不住了,时隔不到一年,英特尔将多核CPU更新了两代,在这其间,CPU的速度提高了近两倍。虽然是AMD第一个向多核CPU发起冲锋,然而英特尔凭借着自己的优势很快就将AMD甩在了后面。在2006年AMD刚推出双核CPU,英特尔就快速地推出了四核CPU。而在2007年,英特尔更是赚足的眼球,推出了多达80核的CPU。因此,如果说AMD将多核时代的序幕拉开了一小部分话,那么英特尔就将这个序幕完全拉开了。
事实上,多核时代的序幕早就应该拉开。这要追溯上个世纪末,那时就已经有人在做这方面的实验。但并不是向现在人们所理解的双核或多核,而是将众多拥有多个单核CPU的计算机用网络连接起来,通过软件来协调这些计算机,也就是说为它们分配子任务。这听起来有点象Google的后台服务架构,用数十万台互相连接的计算机组成计算量无比庞大的计算机集群。这套系统在2006年已经有了一个原型系统,但由于这种大规模集成的计算模式并不适合大多数普通用户,因此,在2006年,AMD推出了更适合个人的双核处理器来满足普通用户的需求。
三、潘多拉魔盒被最终打开,性能瘟疫再次席卷整个软件世界
自从2006年AMD率先推出双核处理器后,2006年被普遍认为是多核CPU的普及年。在随后的一年多时间里,多核CPU的主频和核的数量飞数发展。看到这些令人振奋的消息来,很多人都松了一口气,以为这下终于突破困扰已久的CPU主频的限制了。一下从单纯的增加主频跨越到了二维的增加主频和核的数量。通过这种改变,也许可以至少坚持十年。但人们还没有从欢乐的气氛中回过味来,就遇到了新的问题,这次不是硬件,而是软件。
可能所有编写过软件的人都知道,象使用VB、C#、Delphi等语言或开发工具开发程序是非常容易的,只需要在IDE中新建一个工具,再建几个Form,然后拖上一些控件就可完成一个看似功能非常强大的程序。这些程序也许可以完成非常复杂的功能。它们也许可以在以前传统的单核CPU上运行得非常好。但如果这种程序在新问世的多核CPU上运行,所表现出来的效率并不一定有单核CPU的效率高。这并不是程序中的某些算法不适应多核的环境,而是由于这种程序从根本上只使用了一个主线程来运行(在传统的程序中都是由一个Main函数开始执行程序,然后按顺序执行相应的代码),所以同一个程序实例在同一时间只能运行在一个CPU核上,因此,不管有多少个核,也只能有一个核在发挥作用。
真是怕什么就来什么,目前世界上所存在的软件绝大多数是基于单线程的,这就意味着虽然多核从理论上可以提高效率,但就现在的大多数软件而言,还无福享受这种待遇。这就象10几年前在DOS时代那漆黑的夜空突然划过一道闪电,而正是这道闪电才劈开了Windows时代的大门。当时基于Windows的软件还不多,Windows之所以拥有现在的局面,是经过了长期的发展才得来的。而现在的多核CPU就和当年的Windows一样,支持多核CPU的软件还不多,要想真正发挥多核CPU的功效,可能还需要一些时间。然而我们也无需这么悲观,现在软件的发展已非从前可比,在过去的十年要完成的事,也许现在几年就可完成。
然而,为了以上的目标,作为编写软件的核心力量的程序员也必须尽快行动起来。不过值得庆幸的是现在绝大多数语言都支持用于将多核功能发挥到及至的并发(多线程)功能。但程序员必须要改变以前传统的程序设计理念。在传统的CPU上编写程序,也可以使用多线程来处理。但这样使用多线程也只能叫做并发,而不能叫做并行。所谓并发就是指在一个时间段可以同时执行多个任务。大家要注意,这里所说的是“时间段”,而并不是“时间点”。这和并行有着本质的区别。并行是指在一个时间点同时有两个或多个任务同时执行,是真正意义上的同时执行,而并发从微观上看只是单核CPU在一个时间段交替执行不同任务的结果。
在传统CPU上编写这类并发的程序将会带来更多的危险。如可能由于两个线程互相争夺共享资源而导致死锁。或是多个线程同时读写共享资源的数据会造成共享数据的不一致性。然而这些现象在多核CPU上可以得到一定程度的解决,如死锁问题。如果在双核CPU上运行多线程程序,两个线程来争端CPU资源时,其中一个线程可以使用另外一个CPU核来处理。这样就避免了一次死锁。
尽管现在可以使用大多数语言来编写多核CPU的程序,但这些对于大多数程序员可能太过复杂了。因此,在最近几年,出现了一些和并发功能溶为一体的语言。使用这些语言可以无需了解多线程技术,就可以设计并实现基于并发的系统。如OpenMP、MPI、CAF等都是这样的语言。
多核时代的到来已经不可避免,对于广大程序员来说将是一个千载难逢的好机会。只有真正地了解多核及并发的原理,才能真正发挥多核CPU的效率。到那时,多核时代才会进入鼎盛时期。也许到那时,将会开发出更适合多核CPU的开发模式。也许这是我们每一个身在其中的人都应该思考的问题。
四、多核CPU是否会成为传统CPU的终极版本,未来CPU将走向何方?
还是那句老话,一切皆有极限。单核CPU的主频极限是4GMHZ,而多核CPU会有极限吗?答案是肯定的。虽然现在还不能给出多核CPU的确切的极限是多少。但可以肯定,CPU中的核不能无限制地增加,体积不能无限制地缩小。当然,主频更不可能无限制地提高。然而,如果将来多核CPU达到了它的极限,那么我们将如何应对呢?
可能所有学过计算机的人都知道,现在的计算机无论速度有多快、体积有多少、功能有多多、价格有多便宜,都离不开冯.诺依曼机的限制。 当然,基于多核CPU的计算机也是如此。多核CPU的终结是否会意味着冯.诺依曼机的终结呢?难道还会出现个三维的方案来继续创造着CPU神话吗?
也许很多人和我有同样的疑问。在近十年时间里,各大新闻媒体经常报道一些科学家正在或已经研究出了颠覆冯.诺依曼机的计算模式。如前一阵子IBM宣布研究出基于十进制的CPU。而更有甚者,将彻底摆脱了传统计算机的束缚,如量子计算机、生物计算机等都是最吸引我们眼球的词汇。虽然有这么多种类的新型计算机,但它们大多只是实验室产品,至少在目前还不能大规模应用。因此,才有了现在的多核CPU来填补新型计算机问世之前的这段空白,当然,我们也可以将多核CPU理解为一种过度产品,毕竟没人愿意在多核的环境下编程,因此这太复杂了。但为了继续满足摩尔定律和人们不断膨胀的欲望,计算机科学家们不得不提出这种过度的解决方案。但也许这不会太久,如果我们往前看,未来世界的曙光在向我们招手。最后让我们做好准备来迎接新世界的到来吧!