多核时代,改变计算机发展历史

出处:《程序员》杂志2006年第9期

近两年,多核概念日渐风行,是因为 PC 平台上 CPU 提供商大力宣传的结果,然而这个早在大型机上就已经拥有的技术为何会很快成为人们的热衷话题?为此,本刊记者采访了 Sun公司的工程技术总监柯泰博士。

《程序员》:柯博士,你好!请您简单谈谈您在CPU领域的简单经历,并谈谈您所负责的团队在Sun公司负责的具体工作。

柯泰 :我的部门是在公司中负责所有产品的性能优化和测试。当一个 CPU还在设计当中的时候,我们的小组就开始帮助设计人员和架构师来提供一些参考意见,搜集各种各样的信息来保证架构师在设计 CPU的时候有可以依赖的数据和模型,同时根据这些 CPU将来的应用方向来搜集一些过去处理器遇到问题的反馈信息,比如专门做图形图像处理的服务器、数据库服务器、 Web服务器等等,根据此前这些类型的应用特点为新 CPU提出功能与性能上的要求。当然,我们需要让很多普适性的软件产品运行在它上面,因此在这个过程当中会遇到很多折中的问题。架构师往往希望能在 CPU上做更多的工作,但是在现有的硅制造工艺的限制下,我们不得不有所取舍,比如一个芯片的总体设计不能太大,太大会造成空间上的限制,而某些部分的晶体管不能设计得太密,太密往往会造成处理器过热。这一类的问题一般都由我所在的部门为CPU设计部门提供建议和意见,让产品能够更加符合市场的需要。除此之外,等到我们和德州仪器公司合作的产品正式发布并进入到量产阶段的时候,发现在设计阶段的一些要求没有实现,我们仍然能够通过软件性能调优的形式来保证产品能够达到我们最初设计的目标。

比如说 Sun最近发布的8核CPU"酷线程",当时的主架构师在设计这个芯片的时候还在片上集成了网络的功能、 RSA、SSL加密的功能等等。通过硬件的加速处理加密运算可以大规模地提高计算机处理效率。但是要在一个芯片上增加这么多的功能,设计出来处理器非常大,而且价钱也非常昂贵,在这个基础上我们的工作就是做平衡,将暂时无法实现的功能裁减掉,剩下RSA加密的功能。为什么要留下这个应用呢?是因为我们发现在分析以前服务器上的 CPU消耗的时间中,为 SSL做 RSA加密占用了大量的系统资源,而且这些消耗的资源往往在提供 Web服务的时候需求量很大。实现这个功能无需对整个芯片造成太大的压力,因此我们最后决定将这个部分的功能保留在处理器上。果然在 CPU设计制造以后,很快就在市场取得了很好的效果,经过测试,在处理这类 Web服务的时候我们安装了新 CPU的 T2000型服务器取得了一个很难突破的纪录,在 SPECWeb 2005测试当中得到的分数持续 9个月领先。要知道,原来一般能保持 3个月的领先就已经很不错了。

上面这个过程也说明了一个趋势,计算机常用的一些功能将会不断集成到 CPU当中,用强大的硬件来处理软件,就像刚才说到的一些类似网络功能等等。当然,这种趋势也是有一定边界的,比如Java虚拟机,就很难说在短期内放在CPU上去处理,我们可能会根据这些软件的特色一步一步将它固化到CPU上,另外,昂贵的成本也是为什么我们没有很快将这些复杂的功能设计到CPU当中的原因之一。

《程序员》:最近几年我们看到越来越多的厂商在开始宣传多核,据我们了解,包括Sun、IBM等大型主机厂商其实在热潮之前就已经开始了多核处理器的研究与开发,这种现象为什么到现在才出现?

柯泰:多核技术确实是最近两年才开始成熟起来的,此前对于这个领域的研究一直没有停止过,但是真正应用到一些普适性的计算环境当中,确实是最近这两年。此前可能有些厂商推出了自己的多核处理器,但是那些处理器所做的多是专用的计算,比如IBM的一些大型机,它们很难作为商用的处理器来处理我们日常需要计算的应用。比如你要跑Oracle数据库,就无法用专用的计算机来处理。而且往往一个处理器是不能单独运行的,还需要一整套硬件、软件系统等,这就对系统厂商提出了挑战。

最近,很多人都开始看到,CPU的速度已经很难通过增加主频数量来加快运算速度了,因此多核是一个必然之路,加上Intel、AMD等公司在市场上大力的宣传,尤其是在PC平台用户当中的宣传,造成了目前我们看到和听到的这种现象。至于说市场是否真是这个样子,现在还很难说。从我的角度来看,PC平台上的电脑迟早是要淘汰的。未来的终端可能是PDA或者是其它便携的设备,因为将来的用户并不需要一个这样很大的机器,而是由一个大型服务器作为数据和计算的中心来完成计算和存储等工作。例如在PC上对计算需求比较大的3D游戏,它需要CPU有很快的运算速度来生成多边形、填充像素等,而那些用电脑来发发邮件、处理一下电子表格的人却并不需要这样庞大的计算能力。

从这个角度看,不难知道,Intel和AMD等在PC平台上做CPU的厂商看到了未来服务器端庞大的市场,因此大幅提高处理器运算能力也很有可能是为其产品进入服务器领域做准备。但是这些厂商往往比较忽视软件,其实并行计算的问题还是在软件上,这一点我们可以在后面提及。

《程序员》:我们常常看到原来为了提高单个服务器的性能,往往采用多路对称处理器技术,或者采用分布计算集群的方式来完成一个系统的高性能计算,这些技术和多核有什么不同?

柯泰:其实从原理上来看,不管是SMP还是Cluster,都是为了做高性能计算的,从解决的问题来看,它们之间并不存在本质的区别,但是多核提供了很多好处,这些好处主要表现在:

◆ 为单个物理计算机提供很大吞吐量

◆ 尽可能小地产生热量

◆ 集成更多功能在单个芯片上

减小功耗本身就节省了很多的电力,一个大型的机房,不管是Google、Yahoo!还是国内的新浪、搜狐在电力的消耗上都很头痛,除此之外,机房还要消耗很多能量在散热上,将计算能力尽可能集成在一个单片上,从两个方面都节省了电力。对于大量的计算,提高一个芯片的计算能力也节省了很多成本,这些特点对于客户来说是很看重的。

《程序员》:从计算机体系结构上来说,我们知道其实大型机和微机本身是存在很多不同之处的,比如说Sun公司就有比较独特的UltraSparc结构,这与传统的x86结构是不同的,那么不同体系结构的多核之间又有什么区别?

柯泰:这个问题涉及到一些基础知识,x86最开始的设计是基于CISC结构的,也就是所谓的复杂指令集结构,在CPU内部,很多计算指令的长度都不相同,这就需要CPU从寄存器获取指令的时候需要先知道下一个指令的长度,这样无形中浪费了很大一部分的计算能力,处理一些程序的时候就显得很不方便。为了弥补这个缺点,RISC,也就是所谓精简指令集结构被设计出来了,它把处理器内部的指令长度设计成为相同的,这样能够较大地提高计算机的性能。

当然,我们今天看这个问题又有不一样的解释,比如说Intel,它们把自己CPU的底层都设计成了RISC,这样在设计CPU的时候能够更大地提高CPU主频。尽管是这样,在此类处理器进行计算时仍然需要面对指令之间的转换,会造成CPU设计的复杂性大大提高。40年前的情况和今天不同,IBM在设计那套经典的CISC体系结构的时候并没有考虑这些问题,随着它自己的小型机体系结构不断发展,RISC也就应运而生了。在这种体系结构下设计CPU,晶体管的安排和线路的设计都比较方便,这样对于处理器主频的提高有极大好处。当然,对于我们的软件开发人员来说,这些影响并不大。

《程序员》:您认为多核时代的到来会不会给软件开发人员造成一定的影响?会在哪些方面产生影响?

柯泰: 其实核心的瓶颈仍然是在软件,而软件开发在多核环境下的核心是多线程开发。这个多线程不仅代表了软件实现上的多线程,而且在硬件上也要采用多线程的技术。比如Niagara就是采用了8核32线程的处理器。

对于软件开发人员来说,我认为要么就不写程序,要么就写服务器端的程序,当然,你也可以去撰写移动终端设备上的代码,还是上面的观点,在PC平台上做开发的空间很小。我个人还是非常鼓励开发人员做服务器端程序的开发,同时也希望它们在撰写代码的时候能够养成多线程的习惯来并行处理他们的应用。

对目前基于多核的应用来说,开发人员可能需要花一些时间来考虑他们的代码如何撰写,以适应多核环境下的应用程序性能,但随着这项技术的不断成熟,未来软件开发工具会帮助他们完成那些工作。更多的工具厂商会针对多核的处理器编译和优化代码,尤其是 C++与Java的开发工具。

《程序员》:从软件开发的角度看,多线程处理往往采用两个不同的形式来做同步并行计算,一种是用共享资源加锁同步的形式来进行并行处理,另外一种是通过线程之间发送消息来完成并行,您觉得哪种方式更好?

柯泰:其实两种方式都很好,因为这是两个纯软件的概念。我在原来念研究生的时候就觉得两个线程之间相互传递消息是一个很好的处理形式,但是很难有程序员能把代码的处理想象得非常清楚,也就是说要写出这种形式的代码将会是非常困难的。但是这并不是说明我们的开发人员不够聪明,而是说线程之间消息传递机制不太符合人们的思维方式。据我的观察,大部分的商业软件只要涉及到资源竞争的问题,就多半采用资源共享加锁互斥的方式来处理并行问题。这种方式往往更加适合开发人员理解计算机的计算模式。

《程序员》:目前的多核技术的发展还存在哪些瓶颈?

柯泰:对于多核技术来说,我觉得最大的问题还是在软件上。尤其是软件开发人员,养成面对问题就用多线程的方式来进行思考本身就是一个比较大的跨越。相对软件来说,硬件技术其实很早以前就已经比较成熟了,现在的CPU设计工程师并不会把一个CPU画得很大,然后在那上面一个一个地描述晶体管,因为今天已经有非常成熟的软件来帮助他们完成芯片的设计,相对来说软件反而没有这样成熟,尤其是面对不同的应用,我们需要在软件的整个周期中完成很多看似雷同,实际上却总是有很多差异的工作。对于软件开发人员来说,养成多线程的代码编写习惯是未来程序员的基本技能之一。

例如你看待一个网络游戏,如果从客户端角度来看,整个游戏场景在为你一个人服务,而主程序随时接受游戏者的调度进行控制,这个工作就是属于单线程的,但是如果从服务器的角度来看,我们往往能看到它的另外一面,服务器需要处理很多不同的玩家相互之间的互动,这个时候只能采取多线程的方式来进行处理,这样才能保证所有的游戏者能够看到非常类似的场景和游戏。即使是在客户端方面,图像、声音以及你在游戏中的行为逻辑也是多线程来处理的,因此用这种方式来理解和体会软件往往可以取得另外的视角。

《程序员》:您这次来中国,觉得我们这边的开发人员在此方面的素质怎样?

柯泰:其实我对中国的开发人员了解不多,但是在我的部门里面还是有一些来自国内的开发人员,有清华大学、中国科技大学的等,国内的开发人员学院气息比较浓厚。其实学院里面所学的软件技术与企业里面的应用还是有一定差距。国内大学培养出来的人才更多偏向理论。因此我可以给这部分开发人员提几个建议:

1. 大学生和研究生在学校可以多参加一些实际项目的开发,积累工作的经验,同时也应该多花一些时间来了解业界发展的趋势;

2. Sun公司工程研究院在国内有好几百人的开发团队,而且在做一些大型项目的开发,比较优秀的学生可以来了解一个大型项目的开发是怎样做的,难度到底有多大,而中国将来要做大型软件开发是一个必然的趋势,因此现在积累一些这方面的经验对于将来肯定是有很大帮助的;

3. 沟通能力也是我遇到的一些中国开发人员的问题,比如把自己写代码的时候发现的问题表达给自己的团队。这不仅是语言上的问题,而且还存在于工作的习惯和方式,中国的软件开发人员不太习惯去表达或者表现,而且技术背景的开发人员也往往不太喜欢沟通,这是我在Sun看到的一些情况。因此我也建议中国的程序员要有意识地培养他们主动交流的能力,以便让团队更加顺畅 地工作。

page_revision: 5, last_edited: 1202473799|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License